我的previous question提出的关于正则表达式的问题。我很难理解我得到的结果的差异,我担心如果在解析库或其他东西时可能存在错误。
所以最初的问题是替换给定字符串中的所有:/
,除了那些可能位于该给定字符串中的标记内的字符串。初始字符串是
not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>
我尝试使用以下正则表达式仅替换给定示例中的第一个:/
。要跳过标签内部的出现,使用非捕获组:
/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g
最令人惊讶的是,此正则表达式根据所使用的工具/语言提供不同的结果。这是我得到的结果的简短摘要
下面还有一个用于检查相同正则表达式的javascript代码段,结果,正如您所看到的还有所不同的 - 2匹配 - &gt;将发生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;
&#13;
<pre></pre>
&#13;
似乎忽略了非捕获组。 那么,有什么不对,为什么结果不同以及解决初始问题的正确正则表达式是什么?
答案 0 :(得分:1)
regex101也会返回2个匹配项,您可以在标签上看到:
和文本中的两种不同颜色
如果你看一下MATCH INFORMATION
部分,确实有点混乱。但是,这只是为了向您显示捕获,不一定匹配:
您也可以通过用一些字符串替换每个匹配来测试这个: https://regex101.com/r/kY6vI5/2
non-capturing group不会被忽略。它根本不会创建捕获,但它实际上是匹配的。