Как "обратный матч" с регулярным выражением?

Я использую RegexBuddy, но у меня все в порядке с этой штукой:\

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

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


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

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

Ответ 1

(?!Andrea).{6}

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

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

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

Ответ 3

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

Вы можете использовать функцию "смотреть вперед". Использование python в качестве примера

import re

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

Чтобы прервать это:

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

(?!Andrea)

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Это oneliner:

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

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

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

Ответ 9

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

process ($ line) if ($ line = ~!/Andrea/);