2009-06-05 2 views
23

С помощью PCRE, как вы можете построить выражение, которое будет соответствовать только если строка не найдена.Инвертировать совпадение с регулярным выражением

Если бы я использовал grep (которого я не знаю), мне нужен параметр -v.

Более конкретный пример: Я хочу, чтобы мое регулярное выражение соответствовало строке iff foo: не в строке. Таким образом, это будет соответствовать bar, но не foobar.

+0

Какой язык вы используете? – innaM

+0

Это вход в веб-сервис, который рекламирует PCRE. Так что на самом деле язык PCRE. –

+1

Duplicate: http://stackoverflow.com/questions/850907/regular-expression-opposite –

ответ

41

Хорошо, я уточнил свое регулярное выражение на основе решения, с которым вы столкнулись (что ошибочно соответствует строкам, начинающимся с «теста»).

^((?!foo).)*$ 

Это регулярное выражение будет соответствовать только строкам, которые не содержат foo. Первый lookahead будет отклонять строки, начинающиеся с «foo», а второй будет следить за тем, чтобы foo не был найден нигде в строке.

1

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

(Foo?!) *

3

На основании ответа Даниила, я думаю, что у меня есть то, что работает:.

^(.(?!test))*$ 

Ключ что вам нужно сделать отрицательное утверждение на каждый символ в строке

+0

Я не верю, что это тоже сработает; он будет соответствовать строке 'test'. –

+0

Стреляй - ты прав. Это достаточно хорошо для моего текущего сценария, поскольку этот крайный случай не попал, но он не полностью решает проблему. –

+0

Я удалил свой первоначальный ответ и разместил новый, который должен полностью решить проблему, включая кромку края. В основном мой первоначальный ответ отрицал строки, начинающиеся с вашей подстроки, а ваши лишенные строки содержали подстроку, но не начинались с нее. Решение этих проблем - решение. :) –

-1

построить выражение, которое соответствует, и использовать! спичку() ... (логическое отрицание) Это, вероятно, как Grep делает все равно ...

+0

У меня нет контроля над кодом, который оценивает соответствие напрямую, поэтому, к сожалению, это не вариант. –

-1

Вы также можете сделать это (в Python), используя re.split и расщепление на основе ваше регулярное выражение, возвращая все части, которые не соответствуют регулярному выражению, splitting based on what doesn't match a regularexpression

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

  • Нет связанных вопросов^_^