用匹配来否定结束的正则表达式

时间:2010-11-03 21:31:40

标签: regex regex-negation

我需要一个正则表达式来匹配不以某些方式结束的字符串。

输入是一组类名,如FooFooImplFooTestFooTestSuite等。

我希望匹配未在TestTestsTestSuite中结束的任何内容。

应该匹配:

  • FooImpl
  • FooTestImpl
  • Foo

不应该匹配:

  • FooTest
  • FooTestSuite
  • FooTests

我无法做到这一点。我现在所拥有的是错的,所以我甚至都不会发布它。

4 个答案:

答案 0 :(得分:4)

如果您的语言支持,请尝试使用负面反馈:

/(?<!Test)(<?!Tests)(<?!TestSuite)$/

否则,您可以使用否定前瞻模拟负面的后视:

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

Rubular

答案 1 :(得分:1)

负匹配是正则表达式在大多数情况下实际上无法做到的。你有什么理由可以做!(string = ~regex)?

这就是grep有一个-v(反向匹配)标志的原因。

答案 2 :(得分:0)

我提出了一个使用grep的替代解决方案:

grep -vE ".+(Test|Tests|TestSuite)$" *

-v为否定,-E用于正则表达式匹配。由于并非所有语言都支持前瞻和外观,而grep主要与平台无关,因此它可能是您最好的选择。

答案 3 :(得分:0)

您可以尝试使用单词边界运算符:

test\b|tests\b|testSuite\b

这将定位以这些字符结尾的单词。