4

私がよく知っているすべての言語の正規表現エンジンでは、.*表記は 0 個以上の文字の一致を示します。次の Javascript コードを検討してください。

var s = "baaabcccb";
var pattern = new RegExp("b.*b");
var match = pattern.exec(s);
if (match) alert(match);

これは出力しますbaaabcccb

Python でも同じことが起こります。

>>> import re
>>> s = "baaabcccb"
>>> m = re.search("b.*b", s)
>>> m.group(0)
'baaabcccb'

"baaabcccb"これらの言語が単純に一致するのではなく、両方が一致する理由は何"baaab"ですか? 私がパターンを読む方法は、「で始まり、他の任意の数の文字を含み、で終わるb.*b部分文字列を見つける」です。と の両方がこの要件を満たしていますが、Javascript と Python の両方が後者に一致します。その部分文字列が要件を満たし、最初に表示されるという理由だけで、一致すると予想していました。bbbaaabbaaabcccbbaaab

では、なぜbaaabcccbこの場合、パターンが一致するのでしょうか? baaabそして、代わりに一致するように、この動作を (いずれかの言語で) 変更する方法はありますか?

4

3 に答える 3

6

次のように a?を後に追加することで、正規表現を貪欲にしないようにすることができます。次に、可能な限り最小の文字列に一致します。デフォルトでは、正規表現は貪欲で、可能な限り最長の一致を見つけようとします。*b.*?b

于 2012-06-14T03:39:02.007 に答える
2

.*貪欲な試合です。.*?貪欲でないバージョンです

于 2012-06-14T03:39:43.910 に答える
2

* も + も本質的に貪欲であるため (少なくとも python では、js についてはわかりません)。彼らは可能な限り一致しようとします。この問題を回避したい場合は、? それらの後。

貪欲と非貪欲のセクションで、これに関する優れたチュートリアルがあります: google python class

于 2012-06-14T03:40:38.507 に答える