以匹配结尾的否定正则表达式

3
我需要一个正则表达式来匹配不以特定术语结尾的字符串。
输入是一堆类名,比如FooFooImplFooTestFooTestSuite等。
我想匹配任何不以TestTestsTestSuite结尾的内容。
应该匹配:
- FooImpl - FooTestImpl - Foo 不应该匹配:
- FooTest - FooTestSuite - FooTests 我就是搞不定这个。我现在所写的都是错误的,所以我甚至不打算贴出来。
4个回答

4
如果您的语言支持,可以尝试使用负回顾后断言:
/(?<!Test)(<?!Tests)(<?!TestSuite)$/

否则,您可以使用负向前瞻来模拟负向后顾:

/^(?!.*(?:Test|Tests|TestSuite)$).*$/

Rubular


1
重写可变长度的负向前瞻,以使其适用于多个位置: /(?<!TestSuite)(?<!Tests)(?<!Test)$/ - tchrist

1

负匹配是正则表达式大部分情况下无法实现的。你不能简单地使用 !(string =~ regex) 吗?

这就是为什么 grep 有一个 -v(反向匹配)标志。


+1:同意不匹配不存在的内容,而是匹配存在的内容并反转匹配。这样更容易。 - Platinum Azure

0
我提出了一种使用grep的替代方案: grep -vE ".+(Test|Tests|TestSuite)$" * -v表示否定,-E用于正则表达式匹配。由于并非所有语言都支持前瞻和后顾,并且grep大多数情况下是平台无关的,因此它可能是您最好的选择。

0
你可以尝试使用单词边界运算符:
test\b|tests\b|testSuite\b

这将针对以这些字符结尾的单词。


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