2008-10-02 2 views
78

Я использую RegexBuddy, но я все равно в этой ситуации: \Как «обратный матч» с регулярным выражением?

Я обрабатываю строку за строкой файла. Я построил «модель линии», чтобы соответствовать тому, что я хочу.

Теперь я хотел бы сделать обратный матч ... т.е. я хочу, чтобы соответствовать линии, где Eсть строка из 6 букв, но только если эти шесть букв неАндреа, как я должен делать что?


EDIT: Я пишу программу, которая использует это регулярное выражение, я не знаю, если в Python или PHP, я делаю это дело первым, чтобы узнать некоторые регулярные выражения :) Есть разные типов строки, я хотел использовать регулярное выражение для выбора типа, в котором я заинтересован. После того, как я получил эти строки, я должен применить другой фильтр, чтобы не соответствовать известному значению, мне нужны все остальные, а не что. Благодарю вас (не!). :-)

Я надеюсь, что это проясняет вопрос :)

+0

На самом деле это звучит так, как будто вы могли бы лучше дать нам немного больше информации о том, что вы делаете, и посмотреть, может ли кто-нибудь предложить альтернативное решение.Как правило, попытка разобрать весь файл путем построения регулярного выражения, соответствующего каждой строке, является довольно сложным маршрутом :) – Dan 2008-10-02 20:33:22

ответ

47
(?!Andrea).{6} 

Если предположить, что регулярное выражение двигатель поддерживает отрицательные lookaheads ..

Edit: ..or может быть, вы предпочитаете использовать [A-Za-z]{6} на месте от .{6}

Редактировать (снова): Обратите внимание, что lookaheads и lookbehind, как правило, не подходят для «инверсного» соответствия регулярного выражения. Regexps не настроены для выполнения отрицательного соответствия, они оставляют это на любом языке, с которым вы их используете.

+0

Вам нужно добавить ^, который использует @Vinko Vrsalovic, чтобы он не соответствовал «ndrea \ n» – bdukes 2008-10-02 20:34:47

+2

, не соответствует \ n по умолчанию (некоторые языки [например, Perl] позволяют вам включить это поведение, но по умолчанию соответствует всем BUT \ n). – Dan 2008-10-02 20:36:37

+1

(плюс, ОП никогда не упоминал, что строка должна была появиться в начале строки) – Dan 2008-10-02 20:37:11

5

Negative lookahead assertion

(?!Andrea) 

Это не совсем перевернутая матч, но это лучшее, что вы можете непосредственно сделать с регулярным выражением. Однако не все платформы поддерживают их.

10

Какой язык вы используете? Для этого важны возможности и синтаксис реализации регулярного выражения.

Вы можете использовать опережающий прогноз. Использование Python в качестве примера

import re 

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE) 

Чтобы разрушить это:

(?! Andrea) означает 'матч, если в ближайшие 6 символов не "Andrea"'; если да, то

\ w означает «символ слова» - буквенно-цифровые символы. Это эквивалентно классу [a-zA-Z0-9_]

\ w {6} означает ровно 6 словных символов.

re.IGNORECASE означает, что вы исключите «Андреа», «Андреа», «ANDREA» ...

Другим способ заключается в использовании вашей логики программы - использовать все строки, не совпадающие с Андреа и положить их через второе регулярное выражение для проверки на 6 символов.Или сначала проверьте хотя бы на 6 словных символов, а затем убедитесь, что он не соответствует Андреа.

-3

В Perl'х вы можете сделать

процесса ($ линии), если ($ строки = ~/Andrea /!);

4

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

На панели инструментов на тестовой панели установите область проверки на «Строка за строкой». Когда вы это сделаете, элемент «Список всех линий без совпадений» появится под кнопкой «Список всех» на той же панели инструментов. (Если вы не видите кнопку «Список всех», нажмите кнопку «Сопоставление» на главной панели инструментов.)

На панели GREP вы можете включить флажки «line-based» и «invert results», чтобы получить список несогласованных строк в файлах, которые вы просматриваете.

3

(?! полезен на практике. Хотя, строго говоря, смотреть вперед не является регулярным выражением, как это определено математически.

Вы можете написать инвертное регулярное выражение вручную.

a program для того, чтобы вычислить результат автоматически. В результате получается машина, которая, как правило, намного сложнее, чем ручная запись. Но результат работает.

10

Обновлено с обратной связью от Alan Moore

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

^(?:(?!Andrea).)*$ 

Это называется tempered greedy token. Недостатком является то, что он не работает хорошо.

0

я просто придумал этот метод, который может быть аппаратными затратами, но она работает:

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

Это Oneliner:

notMatched = re.sub(regex, "", string)

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

Это вернет вам результат строки, а не любые объекты совпадения!

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