Регулярное выражение для соответствия всей строке только в том случае, если в ней отсутствует заданная подстрока / суффикс

Я искал подобные вопросы, но все случаи, которые я обнаружил, были решены в зависимости от конкретной проблемы, например, использование! g в vi для отмены совпадений регулярных выражений или сопоставления других вещей без отрицание регулярного выражения.

Таким образом, меня интересует «чистое» решение этой проблемы:

Имея набор строк, мне нужно отфильтровать их с помощью сопоставителя регулярных выражений, чтобы он оставил (сопоставил) только строки, в которых отсутствует данная подстрока. Например, отфильтровывая "Foo" в:

Boo
Foo
Bar
FooBar
BooFooBar
Baz

Это приведет к:

Boo
Bar
Baz

Я попытался построить его с отрицательным взглядом вперед / назад _3 _ / _ 4_, но не смог понять. Это вообще возможно?


person Ivan Krechetov    schedule 28.12.2009    source источник
comment
Предыстория: phpunit имеет аргумент --filter, который принимает регулярное выражение для имен включенных тестовых примеров, но не имеет исключающего аналога. Вот что заставило меня задать этот вопрос, который интересен сам по себе, независимо от аргументов командной строки phpunit.   -  person Ivan Krechetov    schedule 28.12.2009


Ответы (1)


Попробуйте это регулярное выражение:

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

Это будет потреблять по одному символу за раз и проверять, нет ли впереди Foo. То же самое можно сделать и с отрицательной ретроспективой:

^(?:.(?<!Foo))*$

Но вы также можете сделать то же самое без утверждений осмотра:

^(?:[^F]*|F(?:$|[^o].|o(?:$|[^o])))*$

Это соответствует любому символу, кроме F или F, за которым либо не следует o, либо если за ним следует o , за которым не следует еще один o.

person Gumbo    schedule 28.12.2009
comment
Что значит 2-я? in ^ (? :( ?! Foo).) * $ do? - person gameover; 28.12.2009
comment
Получил его часть: (? ‹! Pattern), +1 - person gameover; 28.12.2009
comment
@gameover: Он делает то же самое, что и первое выражение, но только в обратном порядке: потребляет по одному символу за раз и проверяет, не являются ли последние три использованных символа Foo. - person Gumbo; 28.12.2009