首页 > 解决方案 > 单行正则表达式中的负前瞻

问题描述

我有以下测试字符串:

/// <exception cref="x"><paramref name="a"/> is null.</exception>
/// <exception cref="y"><paramref name="b"/> is null. -or-
/// </exception>dfjhhdfhdfkjhdkjdfhkdfjhdf -or-

这是一个三行字符串。所以我创建了带有 Singleline 标志的正则表达式来捕获带有点的新行。我的正则表达式是:

(<exception.+?>)(?<a>.+?)(?!<\/exception>)-or-

有了这个正则表达式,我希望只匹配第二行。但我得到的是(用regex101.com可视化):

在此处输入图像描述

前两行是匹配的,第二组包括</exception>虽然我已经指定了负前瞻(?!<\/exception>)

为什么会这样?如何依靠存在来匹配第二行-or-

标签: regex

解决方案


这可能是矫枉过正,但你可以使用一个回火点来匹配-or-不传递结束标签:

<exception[^>]*>((?!</exception>).)*-or-

演示

这个正则表达式模式说:

<exception[^>]*>      match an opening <exception> tag
((?!</exception>).)*  then match any content WITHOUT passing a closing </exception> tag
-or-                  match -or-

推荐阅读