使用正则表达式进行反向匹配

51
使用PCRE,如何构造一个仅在字符串找到时匹配的表达式。
如果我使用grep(我不会这样做),我会想要-v选项。
一个更具体的例子:我希望我的正则表达式匹配,只有当字符串中没有foo时才能匹配。因此它将匹配bar但不能匹配foobar

这是输入到一个宣传PCRE的Web服务中的内容。所以实际上使用的语言是PCRE。 - Joe Beda
有一个可工作的基本案例示例会更好。 - Hack-R
5个回答

78

好的,我已经根据你提供的解决方案修改了我的正则表达式(原方案错误地匹配以“test”开头的字符串)。

^((?!foo).)*$

这个正则表达式只匹配不包含"foo"的字符串。第一个先行断言将拒绝以'foo'开头的字符串,第二个先行断言将确保在字符串中没有找到"foo"。


这是一个强大的工具! - SonickSeven

5

根据Daniel的回答,我认为我已经有了可行的方案:

^(.(?!test))*$

关键在于你需要对字符串中的每个字符进行否定断言。

我也不相信这会起作用;它会匹配字符串'test'。 - Daniel Vandersluis
糟糕 - 你是对的。这对于我的当前情况已经足够好了,因为那个边缘情况没有发生,但它并不能完全解决问题。 - Joe Beda
我删除了我的原始答案,并发布了一个新的,它应该完全解决了这个问题,包括边缘情况。基本上,我的原始答案拒绝以您的子字符串开头的字符串,而您的则拒绝包含子字符串但不是以其开头的字符串。将它们放在一起就是解决方案。 :) - Daniel Vandersluis

1

确实几乎是重复的。我猜你要找的正则表达式是

(?!foo).*


1
构建一个匹配的表达式,并使用!match()...(逻辑否定)。 这大概就是grep的工作方式吧...

我无法控制直接评估匹配的代码,所以很遗憾这不是一个选项。 - Joe Beda

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接