如果没有 Ungreedy 修饰符,为什么这个正则表达式匹配 0,00?

Why does this regex matches 0,00 if there's no Ungreedy modifier?

^((1000,00)|(0?\d{1,3},\d{2}))$

这个正则表达式应该匹配从“0,01”到“1000,00”,允许前导零,例如“0001,01”

我知道如何修复正则表达式,这不是问题,令我困扰的是 0? 在字符串 0,00 中并不贪心。它应该 'eat' 0 并且 \d{1,3} 没有留下任何东西来匹配,从而使字符串无效。

然而这并没有发生,我想知道为什么。

它很贪婪,但这并不意味着引擎不会回溯以尝试匹配模式。

在您的示例中,如果 0? 匹配 0.00 中的前导 0,则后面的 \d{1,3} 无法匹配任何内容,匹配失败。引擎首先对此进行测试,但由于它失败而尝试在不使用 0 的情况下进行匹配。在这种情况下,找到使用 \d{1,3},\d{2}.

的匹配项

? is greedy.

最初,0? 匹配第一个 0。但由于\d{1,3}导致匹配失败,引擎放弃本次匹配并回溯。如果您不希望引擎放弃匹配,请使用 possessive quantifier:

^((1000,00)|(0?+\d{1,3},\d{2}))$
               ^

With a possessive quantifier, the deal is all or nothing.