【发布时间】:2012-12-03 06:49:10
【问题描述】:
考虑两个printk 类型的函数调用 -
TRACE_BR(TRACE , "END. rc = %d\n", rc );
TRACE_BR(TRACE, "Value = %s", string );
我正在编写一个正则表达式来匹配上面的整个函数调用,其中在其中的字符串参数中有%,但如果字符串END也在其中,则不应匹配。
我像这样使用负前瞻
TRACE_BR\(TRACE.*?(?!END)%.*
我希望这个正则表达式只匹配第二个函数调用,但它也匹配第一个。
我想我在贪婪的* 部分出了点问题。
【问题讨论】:
-
TRACE_BR\(TRACE(?!.*END).*?%.*我不完全确定您的要求,但我发布的正则表达式将丢弃任何出现在 TRACE 之后的带有 END 子字符串的行。 -
@nhahtdh 您的正则表达式似乎满足我的要求。但是为什么我的不工作?您可以发布您的评论作为答案并在那里添加您的详细说明。当谈到环顾四周时,我很困惑
-
它不起作用,因为 TRACE.*?(?!END)% 消耗输入直到 %.负前瞻从 % 之前的位置开始检查,并且由于该位置没有 END,因此正则表达式匹配。这就是为什么你需要 .* 在你的否定前瞻中,并按照@PavanManjunath 的建议在其后加上外部 .* 。
-
@ZólyomiIstván 为什么会一直消耗到
%,而在%之前还有一个负前瞻?引擎不是在先行中找到字符串后立即停止吗? -
@PavanManjunath:正则表达式引擎可能会或可能不会在
%之前使用,但从逻辑上讲,%充当某种“锚”,限制了字符串的可能性匹配正则表达式:对于匹配整个正则表达式的字符串,字符串必须在某个时刻包含%。在那之前,你做了一个否定断言,这是完全没有用的,因为如果下一个字符是%,它总是正确的。
标签: regex regex-lookarounds negative-lookahead