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

时间:2016-04-26 12:53:24

标签: regex regex-greedy

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

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

我知道如何修复正则表达式,这不是问题,困扰我的是0?在字符串0,00中没有贪婪的事实。它应该“吃掉”0并且不留任何东西让\d{1,3}匹配,从而使字符串无效。

然而,这种情况不会发生,我想知道原因。

2 个答案:

答案 0 :(得分:1)

这很贪婪,但这并不意味着引擎不会回头试图匹配模式。

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

答案 1 :(得分:1)

? is greedy

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

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

使用占有量词,交易全部或全无。