2011-12-19 2 views
3

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

Пример в тексте: "Обновлено * [124] конец"

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 
... 

Мне нужно найти каждый матч должен начать это "Update" и заканчивается "[номер]" и слова "конец ". Но какой-то текст выглядит очень похоже, но не заканчивается словом «конец». Этот текст должен быть не 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

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

+0

изменения '' end' в конец $ ' – Dave

+0

И, имейте в виду, что regexen жадные, они будут пытаться соответствовать самой длинной вещи на линии они can – Dave

ответ

1

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

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

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

Updated([^[]*?)\[\d*\]\send 
0

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

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

Wait: Это не работает ... Забудьте об этом: P – Xophmeister

0

Одним из возможных вариантов:

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

Объяснение:

Updated   # Word 'updated' 
[^[]*   # All chars until '[' 
\[124\]   # String '[124]' 
\s+    # One or more spaces. 
end    # String 'end' 
1

Чтобы соответствовать строке, которая не содержит 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 
+0

+1, и я бы определенно пошел со вторым подходом. Первый может быть быстрее, но не намного. Во всяком случае, недостаточно, чтобы оправдать читаемость. См. Мой ответ для подхода фетишистов. ;) –

0

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

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

Объяснение:

Updated 

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

[\w\d.\s]* 

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

\[\d+\] 

то число между кронштейнами

\send 

, чем пространство, и, наконец, закончить слово

+0

Я думаю, вместо '(\ w * \ d * \. * \ S *) *' вы имели в виду '[\ w. \ S] *'. –

Смежные вопросы