Regex 消极展望

Regex 消极展望,regex,regex-lookarounds,negative-lookahead,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)%.* 我希望这个正则表达式只匹配第二个函数调用,但它也匹配第一个函数调用 我猜贪婪的*部分出

考虑两种
printk
函数调用-

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

TRACE_BR(TRACE, "Value = %s", string );
我正在编写一个正则表达式来匹配上面这样的整个函数调用,这些函数调用在字符串参数中包含
%
,但如果字符串
END
也在其中,则不应该匹配

我用了这样的负前瞻

TRACE_BR\(TRACE.*?(?!END)%.*
我希望这个正则表达式只匹配第二个函数调用,但它也匹配第一个函数调用

我猜贪婪的
*
部分出了问题。

正则表达式应该是:

TRACE_BR\(TRACE(?!.*END).*?%.*
如果
END
是出现在
TRACE
之后的子字符串,则此正则表达式将与该行不匹配。如果想要更精确的匹配,可能需要修改正则表达式

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

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

在假设您删除
%
的情况下,正则表达式仍将允许一个带结束传递的字符串,因为任何字符的序列
*?
都将允许在过程中的任何位置匹配负前瞻,它可以找到一个不是字符串开头的位置,并与之匹配。

正则表达式应该是:

TRACE_BR\(TRACE(?!.*END).*?%.*
如果
END
是出现在
TRACE
之后的子字符串,则此正则表达式将与该行不匹配。如果想要更精确的匹配,可能需要修改正则表达式

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

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


在假设您删除
%
的情况下,正则表达式仍将允许一个带结束传递的字符串,因为任何字符的序列
*?
都将允许在过程中的任何位置匹配负前瞻,它只需找到一个不是字符串开头的位置,并与之匹配。

TRACE\u BR\(TRACE(?!END).*?%.
我不能完全确定您的要求,但是我发布的正则表达式将丢弃跟踪后出现结尾子字符串的任何行。@nhahtdh您的正则表达式似乎满足了我的要求。但是为什么我的正则表达式不起作用呢?您可以将您的注释作为答案发布,并在那里添加您的详细说明。我对它的外观感到非常困惑oundsIt不工作,因为跟踪。*?(?!END)%消耗输入直到%.负前瞻检查从%之前的位置开始,由于该位置没有结束,正则表达式匹配。这就是为什么您需要在负前瞻中使用。*并按照@PavanManjunath的建议在其后面使用外部。*@Zólyomisitván为什么它要消耗到
%
,当存在时甚至在
%
之前的负前瞻?引擎不是一发现前瞻中的字符串就停止吗?@PavanManjunath:regex引擎可能会消耗,也可能不会消耗,直到
%
取决于输入,但从逻辑上讲,
%
充当某种“锚定器”这限制了字符串与正则表达式匹配的可能性:要使字符串与整个正则表达式匹配,字符串必须在某个点上包含
%
。在该点之前,您会执行一个否定断言,这是完全没有用的,因为如果下一个字符是
%
TRACE\u BR\(TRACE(?。*END).*?%.
我不能完全确定您的要求,但是我发布的正则表达式将丢弃跟踪后出现结尾子字符串的任何行。@nhahtdh您的正则表达式似乎满足了我的要求。但是为什么我的正则表达式不起作用呢?您可以将您的注释作为答案发布,并在那里添加您的详细说明。我对它的外观感到非常困惑oundsIt不工作,因为跟踪。*?(?!END)%消耗输入直到%.负前瞻检查从%之前的位置开始,由于该位置没有结束,正则表达式匹配。这就是为什么您需要在负前瞻中使用。*并按照@PavanManjunath的建议在其后面使用外部。*@Zólyomisitván为什么它要消耗到
%
,当存在时甚至在
%
之前的负前瞻?引擎不是一发现前瞻中的字符串就停止吗?@PavanManjunath:regex引擎可能会消耗,也可能不会消耗,直到
%
取决于输入,但从逻辑上讲,
%
充当某种“锚定器”这限制了字符串与正则表达式匹配的可能性:要使字符串与整个正则表达式匹配,字符串必须在某个点上包含
%
。在该点之前,您会执行否定断言,这完全没有用,因为如果下一个字符是
%
,则该断言始终为真。