2

ページの最後には、貪欲で消極的で所有格の量指定子がどのように機能するかについての説明が試みられています: http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

しかし、私は例を自分で試しましたが、完全には理解していないようです。

結果を直接貼り付けます。

Enter your regex: .*+foo
Enter input string to search: xfooxxxxxxfoo
No match found.

Enter your regex: (.*)+foo
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.

なぜ最初の reg.exp. 一致が見つからず、2 番目の一致が見つかりませんか? これら 2 つの reg.exp. の正確な違いは何ですか?

4

2 に答える 2

6

後の+別の量指定子は、「正規表現エンジンが前のトークンが一致したものにバックトラックすることを許可しない」ことを意味します。(所有量指定子に関するチュートリアルはこちらを参照してください)。

したがって、 に適用.*fooする"xfooxxxxxxfoo"と、.*最初は文字列全体に一致します。次に、fooを一致させることができないため、正規表現エンジンはそれが可能になるまでバックトラックし、.*has が一致し"xfooxxxxxx"foohas が一致したときに一致を達成し"foo"ます。

追加+により、バックトラックが発生するのを防ぐことができるため、一致は失敗します。

あなたが書くとき(.*)+foo。は+まったく異なる意味を持ちます。現在は「前のトークンの 1 つ以上」を意味します。ところで、ネストされた量指定子を作成しましたが、これは良い考えではありません。その正規表現を のような文字列に適用すると、壊滅的なバックトラッキング"xfoxxxxxxxxxfox"が発生します。

于 2013-12-06T13:41:39.940 に答える