Я использую RegexBuddy, но у меня все равно проблемы с этим: \
Я обрабатываю файл построчно. Я построил «линейную модель», чтобы соответствовать тому, что я хочу.
Теперь я хотел бы выполнить обратное сопоставление ... т.е. я хочу сопоставить строки, в которых есть строка из 6 букв, но только если эти шесть букв не являются Андреа , как мне это сделать?
РЕДАКТИРОВАТЬ: Я напишу программу, которая использует это регулярное выражение, я еще не знаю, в python или php я делаю это сначала, чтобы выучить какое-то регулярное выражение :) Существуют разные типы строк, я хотел использовать регулярное выражение чтобы выбрать тип, который меня интересует. Получив эти строки, я должен применить другой фильтр, просто чтобы не совпадать с известным значением, мне нужны все остальные, а не это. (?! Не разыскивается) работает нормально, спасибо. :-)
Надеюсь, это проясняет вопрос :)
источник
Ответы:
Предполагая, что ваш механизм регулярных выражений поддерживает отрицательный просмотр вперед.
Изменить: ..или, возможно, вы бы предпочли использовать
[A-Za-z]{6}
вместо.{6}
Изменить (снова): обратите внимание, что предварительный просмотр и предварительный просмотр обычно не являются правильным способом «инвертировать» соответствие регулярного выражения. Регулярные выражения на самом деле не настроены для отрицательного сопоставления, они оставляют это для любого языка, на котором вы их используете.
источник
Для Python / Java,
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
источник
some text
запустить строку, она вернет неверный результат.?!
и не просто так!
.Обновлено с учетом отзывов Алана Мура
В PCRE и аналогичных вариантах вы можете создать регулярное выражение, которое соответствует любой строке, не содержащей значения:
Это называется закаленным жадным токеном . Обратной стороной является то, что он не работает хорошо.
источник
[\s\S]
, что полезно только в JavaScript) после второго опережающего просмотра, и вам не нужно первый:^(?:(?!Andrea).)*$
.[\S\s]
? OP говорит о совпадающих строках, не содержащих слова "Andrea". Не о проверке, есть ли это слово во всей строке. Я что-то упускаю?На каком языке ты говоришь? Для этого важны возможности и синтаксис реализации регулярного выражения.
Вы можете использовать прогноз. Использование Python в качестве примера
Чтобы разбить это:
(?! Андреа) означает «совпадение, если следующие 6 символов не являются« Андреа »»; если так то
\ w означает «словесный символ» - буквенно-цифровые символы. Это эквивалент класса [a-zA-Z0-9_]
\ w {6} означает ровно 6 символов слова.
re.IGNORECASE означает, что вы исключите "Andrea", "andrea", "ANDREA" ...
Другой способ - использовать логику вашей программы - использовать все строки, не соответствующие Андреа, и пропустить их через второе регулярное выражение, чтобы проверить наличие 6 символов. Или сначала проверьте наличие хотя бы 6 символов слова, а затем убедитесь, что оно не соответствует Андреа.
источник
Утверждение отрицательного просмотра вперед
Это не совсем перевернутое совпадение, но это лучшее, что вы можете сделать напрямую с регулярным выражением. Однако не все платформы их поддерживают.
источник
Если вы хотите сделать это в RegexBuddy, есть два способа получить список всех строк, не соответствующих регулярному выражению.
На панели инструментов на панели «Тест» установите для области тестирования значение «Построчно». Когда вы это сделаете, под кнопкой «Список всех» на той же панели инструментов появится элемент «Список всех строк без совпадений». (Если вы не видите кнопку «Список всех», нажмите кнопку «Сопоставить» на главной панели инструментов.)
На панели GREP вы можете включить флажки «на основе строк» и «инвертировать результаты», чтобы получить список несовпадающих строк в файлах, которые вы просматриваете.
источник
(?!
полезно на практике. Хотя, строго говоря, прогнозирование вперед не является регулярным выражением в математическом смысле.Вы можете написать обратное регулярное выражение вручную.
Вот программа для автоматического расчета результата. Его результат генерируется машиной, что обычно намного сложнее, чем рукописное. Но результат работает.
источник
Я только что придумал этот метод, который может потребовать много оборудования, но он работает:
Вы можете заменить все символы, которые соответствуют регулярному выражению, пустой строкой.
Это один лайнер:
notMatched = re.sub(regex, "", string)
Я использовал это, потому что был вынужден использовать очень сложное регулярное выражение и не мог понять, как инвертировать каждую его часть за разумный промежуток времени.
Это вернет вам только строковый результат, а не любые объекты соответствия!
источник
В Perl вы можете сделать
process ($ line) if ($ line = ~! / Andrea /);
источник