私はこの正規表現に関する優れたチュートリアルを見つけました。「貪欲」、「しぶしぶ」、「所有的」の数量詞が何をするかを直感的に理解していますが、私の理解には深刻な穴があるようです。
具体的には、次の例では:
Enter your regex: .*foo // greedy quantifier
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 quantifier
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 quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
説明では、入力文字列全体を食べる、文字が消費される、マッチャーがバックオフする、右端の「foo」の出現が逆流されるなどについて言及しています。
残念ながら、いい比喩にもかかわらず、私はまだ誰が何を食べているのかわかりません... 正規表現エンジンがどのように機能するかを(簡潔に)説明する別のチュートリアルを知っていますか?
あるいは、誰かが次の段落をやや異なる言い回しで説明できれば、それは非常にありがたいです:
最初の例では、貪欲な量指定子。*を使用して「何でも」を0回以上検索し、その後に文字「f」「o」「o」を続けています。量指定子は貪欲であるため、式の。*部分は最初に入力文字列全体を消費します。この時点では、最後の3文字( "f" "o" "o")が既に(誰によって?)消費されているため、全体的な式は成功しません。したがって、マッチャーは、 "foo"の右端のオカレンスが逆流されるまで(これは何を意味するのか)、一度に1文字ずつゆっくりと(右から左へ?)バックオフします。
ただし、2番目の例は消極的であるため、最初に(誰が)「何も」を消費しないことから始まります。「foo」は文字列の先頭に表示されないため、最初の文字(「x」)を飲み込む(誰が飲み込むのか)ことが強制され、0と4で最初の一致がトリガーされます。テストハーネスはプロセスを続行します入力文字列がなくなるまで。4と13で別の一致を見つけます。
3番目の例は、量指定子が所有格であるため、一致を見つけることができません。この場合、入力文字列全体が。* +によって消費されます(どのように?)。バックオフせずにすべてを捕捉したい場合は、所有量指定子を使用します(バックオフとはどういう意味ですか?)。一致がすぐに見つからない場合は、同等の貪欲な量指定子よりも優れています。
*
、+
と?
している貪欲。 最小限の数量が好き*?
、+?
と??
している怠惰。 所有数量が好き*+
、++
と?+
されている粘着性。