为什么不在三重点中贪婪?

时间:2017-03-03 12:12:13

标签: javascript regex

我不打算通过解决方法来解决这个问题,我有兴趣了解它失败的原因。

我正在尝试匹配所有出现的逗号或句号后面没有空格。

我用过这个patt:([.,]+)(?! ) 它应该只匹配此字符串中的两种情况:

This is a test... And,another test.

它应与,And之间的another匹配,并且应与句子的最后一段相匹配。然而,它也匹配三个点的前两个点。 ...。不应该让+贪得无厌,所以它看到三个点后跟一个空格而不匹配吗?

屏幕截图:

1 个答案:

答案 0 :(得分:3)

由于回溯,您的正则表达式([.,]+)(?! )..中的...匹配。当正则表达式可能以不同方式匹配字符串的一部分时会发生这种情况,并且当您使用量词和外观时就是这种情况。这里,引擎匹配...并检查是否有空格。在字符串...之后有一个空格,因此匹配失败,正则表达式引擎知道在当前位置有另一种可能的匹配方式,并且回溯。它会从匹配项中丢弃最终的.,并检查.中的第二个...是否没有跟空格。事实并非如此,之后有一个.。因此,..已匹配。

您可以在此处使用原子组解决方法:

/(?=([.,]+))\1(?! )/g

请参阅regex demo

在前瞻中捕获一个或多个点或逗号,然后\1消耗文本。由于后向引用无法回溯,因此在最后一个.,之后会检查否定前瞻,如果有空格,则会发生失败,前一个.或{{1}未经检查。

JS正则表达式引擎匹配您想要的更好方法是将,.包含在负前瞻条件中(请参阅Pavneet's suggestion):

,