1

考虑两种printk函数调用 -

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

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

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

我像这样使用了负前瞻

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

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

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

4

1 回答 1

6

正则表达式应该是:

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

如果END是出现在 之后的子字符串,则此正则表达式将不匹配该行TRACE。如果您想要更精细的匹配,您可能需要修改正则表达式。

您可以将正则表达式视为:在我匹配TRACE(以及前面等)之后,从当前位置,我想向前看,我找不到END子字符串。

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

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

于 2012-12-03T07:14:59.977 回答