2016-04-26 21 views
1
^((1000,00)|(0?\d{1,3},\d{2}))$ 

この正規表現は、「0001,01」Ungreedy修飾語がない場合、この正規表現はなぜ0,00に一致しますか?

のように、私は正規表現を修正する方法を知っている、先行ゼロを可能にし、「1000,00」に「0.01」から合致するようになっている、それは問題ではありません、私を悩ますのは、0?が文字列0,00で貪欲でないという事実です。 0を「食べる」べきであり、\d{1,3}が一致するように残されているものは何も残さないでください。

しかし、これは起こりません。理由を知りたいのですが。

+0

私はまた、正規表現は、いくつかの点で間違っている、しかし、私の質問が残っていることを知っています。 – Lucas

+0

'? '演算子は" 0 "を食べてはならない" 0 "を食べる"できます "! –

+0

バックトラッキングの効果? – Dummy00001

答えて

1

?is greedy

当初、0?は最初0一致します。しかし、後で\d{1,3}のためにマッチングが失敗すると、エンジンはこのマッチを放棄し、バックトラックする。あなたはエンジンが試合を放棄したくない場合は、possessive quantifier使用:独占的量で

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

を、契約はオール・オア・ナッシングです。

+0

ありがとう、それは動作します – Lucas

1

それは貪欲だが、それはエンジンがしようとすると、パターンに一致するように後戻りないという意味ではありません。あなたの例では

0?0.00の大手0と一致した場合、次の\d{1,3}は、一致に失敗、何かを一致させることはできません。エンジンはこれを最初にテストしますが、失敗したときには0を使わずに試合を試行します。この場合、\d{1,3},\d{2}を使用する一致が見つかりました。

関連する問題