如果没有 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}
.
的匹配项
最初,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.
^((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}
.
最初,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.