由于负前瞻的位置,匹配的差异?

AL-*_*ami 7 javascript php regex string lookahead

我在正则表达式中有很多困惑,我正试图解决它们.这里我有以下字符串:

{start}do or die{end}extended string
Run Code Online (Sandbox Code Playgroud)

我的两个不同的正则表达式,我只改变了点的位置:

(.(?!{end}))* //returns: {start}do or di
                                      //^ See here
((?!{end}).)* //returns: {start}do or die
                                      //^ See here
Run Code Online (Sandbox Code Playgroud)

为什么第一个正则表达式吃最后一个"e"?

而且这种负面前瞻如何使这个*量词非贪婪?我的意思是为什么它不能消耗超过{end}的字符?

Riz*_*123 2

通过您的否定前瞻,您说不可能匹配正则表达式,在您的情况下是:{end}。并.捕获除新行之外的所有内容。

所以用你的第一个正则表达式:

(.(?!{end}))*
Run Code Online (Sandbox Code Playgroud)

它省略了e, 因为:e{end}由于负向前瞻而无法匹配。在您的第二个正则表达式中,另一侧有点的地方可以直到:{end}d因此e包含在您的第二个正则表达式中。