貪欲な正規表現がどのように実行されるかについて、2 つの異なる意見があることがわかりました。
- 1つは、すべての入力文字列を読み取り、後ろからパターンを照合し、最初に入力全体に一致し、最初の試行は文字列全体です。この意見を支持するいくつかの記事は、Oracle の公式 Java チュートリアルです。
貪欲な量指定子は、最初の一致を試行する前に、マッチャーに入力文字列全体を読み込ませる、つまり食べることを強制するため、「貪欲」と見なされます。最初の一致試行 (入力文字列全体) が失敗した場合、マッチャーは入力文字列を 1 文字戻して再試行し、一致が見つかるか、元に戻す文字がなくなるまでプロセスを繰り返します。
この記事も参照してください:貪欲な正規表現と遅延正規表現の量指定子のパフォーマンス
- もう 1 つは前方からのマッチングで、最初のマッチング試行は左側の 0 インデックスからです。一致が見つかった場合、エンジンは停止せず、失敗するまで残りを一致させ続け、その後バックトラックします。私が見つけたこの意見を支持する記事は次のとおりです。
スターとプラスの Looking Inside The Regex Engine
セクションでの繰り返し<.+>
:
正規表現の最初のトークンは < です。これはリテラルです。すでにわかっているように、一致する最初の場所は文字列の最初の < です。
知りたいのですが、どちらが正しいですか?これは、正規表現の効率に影響するため重要です。各言語で実装が異なるかどうかを知りたいので、さまざまな言語タグを追加しました。