负面展望未来

时间:2012-12-03 06:49:11

标签: regex regex-lookarounds negative-lookahead

考虑两种printk类函数调用 -

TRACE_BR(TRACE ,    "END. rc = %d\n", rc );

TRACE_BR(TRACE, "Value = %s", string );

我正在编写一个正则表达式来匹配上面的整个函数调用,它们里面的字符串参数中有%,但如果字符串END也在里面,则不应该匹配。

我使用像这样的负面预测

TRACE_BR\(TRACE.*?(?!END)%.*

我希望这个正则表达式只匹配第二个函数调用,但它也匹配第一个函数调用。

我想我在贪婪的*部分出错了。

1 个答案:

答案 0 :(得分:6)

正则表达式应该是:

TRACE_BR\(TRACE(?!.*END).*?%.*

如果ENDTRACE之后出现的子字符串,则此正则表达式与该行不匹配。如果想要更精确的匹配,可能需要修改正则表达式。

您可以将正则表达式视为:在我匹配TRACE(前面等等)之后,从当前位置开始,我想展望未找到END子字符串。< / p>

在正则表达式中,如果负前瞻断言之后的字符为%,则断言始终为真,因为END子字符串无法从那里开始;如果负前瞻断言之后的字符不是%,则正则表达式将无法匹配并回溯。

在假设您删除%的情况下,正则表达式仍然允许带有END的字符串通过,因为任何字符.*?的序列都允许负面向前看以匹配任何字符沿途的位置,它只能找到一个不是字符串END的开头的位置并匹配它。