regex101.com忽略了非捕获组

时间:2015-10-16 09:50:03

标签: javascript regex

我的previous question提出的关于正则表达式的问题。我很难理解我得到的结果的差异,我担心如果在解析库或其他东西时可能存在错误。

所以最初的问题是替换给定字符串中的所有:/ ,除了那些可能位于该给定字符串中的标记内的字符串。初始字符串是

not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>

我尝试使用以下正则表达式仅替换给定示例中的第一个:/。要跳过标签内部的出现,使用非捕获组:

/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g

最令人惊讶的是,此正则表达式根据所使用的工具/语言提供不同的结果。这是我得到的结果的简短摘要

下面还有一个用于检查相同正则表达式的javascript代码段,结果,正如您所看到的还有所不同的 - 2匹配 - &gt;将发生2次更换。

&#13;
&#13;
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;
&#13;
<pre></pre>
&#13;
&#13;
&#13;

似乎忽略了非捕获组。 那么,有什么不对,为什么结果不同以及解决初始问题的正确正则表达式是什么?

1 个答案:

答案 0 :(得分:1)

regex101也会返回2个匹配项,您可以在标签上看到:

total matches

和文本中的两种不同颜色

colors

如果你看一下MATCH INFORMATION部分,确实有点混乱。但是,这只是为了向您显示捕获,不一定匹配:

captures

您也可以通过用一些字符串替换每个匹配来测试这个: https://regex101.com/r/kY6vI5/2

non-capturing group不会被忽略。它根本不会创建捕获,但它实际上是匹配的。