Как "обратное совпадение" с регулярным выражением? - PullRequest
91 голосов
/ 03 октября 2008

Я использую RegexBuddy, но у меня все равно проблемы с этим: \

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

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


РЕДАКТИРОВАТЬ: Я напишу программу, которая использует это регулярное выражение, я пока не знаю, в Python или php, я делаю эту вещь сначала, чтобы изучить некоторые регулярные выражения :) Есть разные типов строк, я хотел использовать регулярное выражение, чтобы выбрать интересующий меня тип. После того, как я получил эти строки, я должен применить другой фильтр, просто чтобы не соответствовать известному значению, мне нужно все остальные, не то. (?! Не хотел) работает довольно хорошо, спасибо. : -)

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

Ответы [ 9 ]

58 голосов
/ 03 октября 2008
(?!Andrea).{6}

Предполагая, что ваш движок регулярных выражений поддерживает отрицательные взгляды ..

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

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

44 голосов
/ 15 декабря 2009

Для Python / Java,

^(.(?!(some text)))*$

http://www.lisnichenko.com/articles/javapython-inverse-regex.html

15 голосов
/ 09 августа 2016

Обновлено с отзывами от Алан Мур

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

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

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

10 голосов
/ 03 октября 2008

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

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

import re

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

Чтобы сломать это:

(?! Андреа) означает «совпадение, если следующие 6 символов не являются« Андреа »»; если так, то

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

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

re.IGNORECASE означает, что вы исключите "Andrea", "andrea", "ANDREA" ...

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

5 голосов
/ 03 октября 2008

Отрицательное прогнозное утверждение

(?!Andrea)

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

4 голосов
/ 31 декабря 2008

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

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

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

3 голосов
/ 28 ноября 2014

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

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

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

0 голосов
/ 31 мая 2017

Я только что придумал этот метод, который может быть аппаратно-интенсивным, но он работает:

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

Это oneliner:

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

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

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

0 голосов
/ 03 октября 2008

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

процесс ($ line) if ($ line = ~! / Andrea /);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...