正则表达式101.com忽略了非捕获组。

4
有一个问题来自于我的先前的问题,涉及正则表达式。我现在无法理解我得到的结果之间的差异,并且担心可能是解析库中的错误或其他问题。
因此,最初的问题是要替换所有给定字符串中的:/,除了可能在该给定字符串中的标签内的那些。给定的初始字符串为:
not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>

我尝试使用以下正则表达式来仅替换给定示例中的第一个:/。 为了跳过标签内的出现,使用了非捕获组:
/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g

最令人惊讶的是,这个正则表达式在不同的工具/语言中会产生不同的结果。以下是我得到的结果的简要总结: 下面还有一个JavaScript代码片段来检查相同的正则表达式,结果也与预期的不同——2次匹配->将出现2次替换。

var s = 'not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>';
var replaced = s.replace(/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g, "smiley_image_here");
document.querySelector("pre").textContent = replaced;
<pre></pre>

似乎非捕获组被简单地忽略了。那么,出了什么问题,为什么结果不同,以及解决最初问题的正确正则表达式是什么?

似乎并不正确,因为在名为“匹配信息”的特定部分中,只显示了一场比赛。 - kaytrance
1个回答

2

regex101也返回了2个匹配项,你可以在标签中看到:

匹配总数

和文本中的2种不同颜色

颜色

如果你看MATCH INFORMATION部分确实有点困惑。然而,这只是为了向你展示捕获,并不一定是匹配项:

捕获


你也可以通过将每个匹配项替换为某些字符串来测试它: https://regex101.com/r/kY6vI5/2


非捕获组不会被忽略。它只是不创建一个捕获,但它确实被匹配。


那么我该如何在此示例中仅使用.replace替换第一个smile?对我来说,这个问题似乎是无解的。 - kaytrance
1
您需要一个嵌套函数,仅在组创建捕获时才进行替换:http://jsfiddle.net/tvcu9r4r/ ...但是,不要使用正则表达式解析HTML,请改用DOM代替(https://dev59.com/5pDea4cB1Zd3GeqPXSBh#33152209) - Mariano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接