Как найти каждую вещь, но не одно слово - PullRequest
3 голосов
/ 19 декабря 2011

В тексте я хочу найти структуры, похожие на каждую вещь, до некоторого текста, но не совпадать между некоторыми словами.

Пример в тексте:

Templates : You can add custom templates for your theme. Updated on 2010 look[124] end
Media RSS feed : Add the Cooliris Effect to your gallery Updated on 2011 look[124]
Role settings : Each gallery has a author Updated at 2010 ...  look[124] end
AJAX based thumbnail generator : No more server Updated on 2010 look[124] end limitation during the batch process Copy/Move : Copy or move images between Updated on 2010 this look[124] galleries Sortable Albums : Create your own sets of images Updated on 2010 this look[124] end
Upload or pictures via a zip-file (Not in Safe-mode)
Watermark function : You can add a watermark image or text 
...

Мне нужно найти «Обновлено. * [124] конец », каждый матч должен начинать это «Обновление» и заканчиваться словом «[число]» и словом « конец ». Но некоторый текст выглядит очень похоже, но не оканчивается словом " end ". Этот текст должен не Mach . Как заставить это работать?

Я пытаюсь написать

/Updated(.*?)\[.*?\]\send/msi

или

Updated(.*?)\[.*?\](?!Updated)\send

Но для этого нужны строки вроде:

Updated on 2011 look[124] Role settings : Each gallery has a author Updated at 2010 ...  look[124] end
Updated on 2010 this look[124] galleries Sortable Albums : Create your own sets of images Updated on 2010 this look[124] end

Как написать регулярное выражение, ведьма пропускает плохие совпадения?

http://regexr.com? 2vh1j

Спасибо за ваше мнение.

Ответы [ 6 ]

1 голос
/ 20 декабря 2011

Я думаю, что это то, что вы пытались со своим вторым регулярным выражением:

Updated\s++(?>(?!Updated\b|end\b)\S+\s+)*+end\b

Другими словами, сопоставьте Updated и найдите соответствующий end. Если вы сначала найдете другой Updated, вы знаете, что начали не в том месте, так что отмените этот матч. Я также исключил end, потому что это позволяет мне притяжательно сопоставлять слова (то есть с *+); регулярное выражение никогда не должно возвращаться, чтобы найти или (что более важно) устранить совпадение.

Если вам действительно нужно указать часть look[nnn], это должно сработать:

Updated\s++(?>(?!Updated\b|end\b|look\[\d+\])\S+\s+)*+look\[\d+\]\s+end\b

Добавьте флаг i для нечувствительного к регистру соответствия, если вам нужно, но вам не нужны флаги m или s. Если это кажется слишком сложным, это потому, что я не знаю ваши данные так же хорошо, как вы. Есть хороший шанс, что это все, что вам действительно нужно:

Updated(?:(?!Updated).)*\send
1 голос
/ 19 декабря 2011

Чтобы соответствовать строке, которая не содержит Updated, вы можете использовать такие конструкции, как:

(?:[^U]+|U(?!pdated))*

и

(?:(?!Updated).)*

Использование первой альтернативы даст вам выражение вроде:

Updated((?:[^U]+|U(?!pdated))*)\[\d+\]\send

Первая объясненная альтернатива:

(?:          # non-capturing group
[^U]+        # any characters that aren't "U"
|U(?!pdated) # or a "U" which is not followed bu "pdated" (ie. not "Updated")
)*           # repeated as much as possible

Второй вариант:

(?:          # non-capturing group
(?!Updated). # Use a lookahead check at every character to make sure it's not "Updated"
)*           # repeated as much as possible
1 голос
/ 19 декабря 2011

Если все недопустимые совпадения имеют [124], но не end, вы можете отфильтровать их, не допуская [ между Updated и конечной последовательностью, например:

Updated([^[]*?)\[\d*\]\send
0 голосов
/ 19 декабря 2011

Может быть, вы можете попробовать другой подход:

/Updated[\w.\s]*\[\d+\]\send/

Пояснение:

Updated

Это будет соответствовать слову Updated

[\w\d.\s]*

затем все буквы, цифры, пробелы и точки (вы можете добавить любые символы по вашему желанию)

\[\d+\]

затем число в скобках

\send

чем пробел и наконец слово end

0 голосов
/ 19 декабря 2011

Одна возможность:

Updated([^[]*)\[124\]\s+end

Пояснение:

Updated          # Word 'updated'
[^[]*            # All chars until '['
\[124\]          # String '[124]'
\s+              # One or more spaces.
end              # String 'end'
0 голосов
/ 19 декабря 2011

Используйте ленивое регулярное выражение

Updated.*?\[.*?\]( end)?
...