正規表現に関するこのチュートリアルを見つけました。「貪欲」、「消極的」、および「独占的」修飾子が何をするかを直感的に理解していますが、私の理解には深刻な穴があるようです。
具体的には、次の例です。
Enter your regex: .*foo // Greedy qualifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // Reluctant qualifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // Possessive qualifier
Enter input string to search: xfooxxxxxxfoo
No match found.
説明では、入力文字列全体を食べる、文字が消費される、マッチャーが後退する、右端の「foo」が逆流するなどについて言及しています。
残念ながら、素晴らしい比喩にもかかわらず、私はまだ誰が何を食べているのか理解できません...正規表現エンジンがどのように機能するかを (簡潔に) 説明している別のチュートリアルを知っていますか?
または、誰かが次の段落を多少異なる言い回しで説明できれば、それは大歓迎です。
最初の例では、貪欲な量指定子を使用
.*
して、文字"f"
,"o"
,"o"
. 量指定子は貪欲であるため.*
、式の部分は最初に入力文字列全体を消費します。この時点で、最後の 3 文字 ("f"
、"o"
、"o"
) は [誰によって?] 既に消費されているため、式全体は成功しません。そのため、マッチャーは [右から左へ?] 1 文字ずつゆっくりとバックオフし、右端の出現"foo"
が逆流されるまで [これはどういう意味ですか?]、その時点で一致が成功し、検索が終了します。ただし、2 番目の例は消極的であるため、最初に [誰が?] "何も" 消費しないことから始めます。
"foo"
は文字列の先頭に表示されないため、最初の文字 (an"x"
) を飲み込む [誰が飲み込むのか?] ことが強制され、0 と 4 で最初の一致がトリガーされます。テスト ハーネスは、入力文字列が使い果たされるまでプロセスを続けます。 . 4 と 13 で別の一致が見つかります。3 番目の例は、量指定子が所有格であるため、一致を見つけることができません。この場合、入力文字列全体が
.*+
[how?] によって消費され、式の末尾にある「foo」を満たすために何も残りません。後戻りせずに何かのすべてをつかみたい状況では、所有量指定子を使用します [後戻りとはどういう意味ですか?]。一致がすぐに見つからない場合は、同等の貪欲な量指定子よりも優れています。