正则表达式只有在缺少给定的子字符串/后缀时匹配整个字符串

Iva*_*tov 8 regex regex-negation

我已经搜索了这样的问题,但是我发现的所有情况都是以特定于问题的方式解决的,例如在vi中使用!g来否定正则表达式匹配,或匹配其他内容,而不使用正则表达式否定.

因此,我对这个"纯粹"的解决方案感兴趣:

有一组字符串我需要使用正则表达式匹配器过滤它们,以便它只留下(匹配)缺少给定子字符串的字符串.例如,过滤掉"Foo":

Boo
Foo
Bar
FooBar
BooFooBar
Baz
Run Code Online (Sandbox Code Playgroud)

会导致:

Boo
Bar
Baz
Run Code Online (Sandbox Code Playgroud)

我试图用消极构建它的外观aheads /屁股(?!regex)/ (?<!regex),但不能弄明白.这甚至可能吗?

Gum*_*mbo 19

试试这个正则表达式:

^(?:(?!Foo).)*$
Run Code Online (Sandbox Code Playgroud)

这将一次消耗一个字符并测试前面是否没有Foo.使用否定的后视可以做同样的事情:

^(?:.(?<!Foo))*$
Run Code Online (Sandbox Code Playgroud)

但是你也可以做同样的事情而不用环顾四周的断言:

^(?:[^F]*|F(?:$|[^o].|o(?:$|[^o])))*$
Run Code Online (Sandbox Code Playgroud)

这匹配除了FF之外的任何字符,其后面没有o或者后跟o后面跟着另一个o.