有这个问题让我意识到量词的贪婪在某些正则表达式引擎中并不总是相同的.从该问题中取出正则表达式并对其进行修改:
!\[(.*?)*\]
Run Code Online (Sandbox Code Playgroud)
(我知道*这里多余,但我发现接下来的事情是一个非常有趣的行为).
如果我们尝试匹配:
![][][]
Run Code Online (Sandbox Code Playgroud)
我希望第一个捕获组变为空,因为它(.*?)是懒惰的并且会在]它遇到的第一个停止时停止.这确实发生在以下情况:
][][.(jsfiddle)我环顾了一些其他语言,例如ruby,java,C#,但所有行为都像我期望的那样(即返回空捕获组).
(regexplanet的golang风味显然也得到非空捕获组)
似乎JavaScript的正则表达式引擎正在解释第二个从懒惰*转换.*?为贪婪的引擎.需要注意的是转换的第二*到*?似乎让如我所料的正则表达式的工作(一样完全去除量词,因为我知道它是多余的在这种情况下,但是这不是重点).
*在正则表达式中使用,但这种行为类似于+,?或者{m,n}将它们转换为它们的懒惰版本给出了与之相同的结果*?.
有谁知道真正发生了什么?