正規表現エンジンはバックトラックを実行します。
エンジンはと一致しようとしますが、一致100
する[10]*
ものがないため、それは機能しません1
。しかし、その後、エンジンは繰り返しの最後の文字を破棄し([10]*
forのみを使用10
)、再試行します。1
が一致しないため、まだ機能しません0
。[10*]
最初のキャラクターが完全にドロップされるまで、エンジンは一度に1つのキャラクターを捨てます。これで、残りの部分1
と一致し、[10]*
喜んで一致します。
このチュートリアルを読むことをお勧めします。これは、内部で何が起こっているかを非常によく説明しているためです。(特定の問題については、繰り返しのセクションを確認してください)。
詳細:
これは、繰り返しが貪欲であるか貪欲でないかには依存しません。正規表現エンジンは常にバックトラックします。[10]
次のように貪欲にしないと、もう一方の端(0回の出現)から開始されます[10]*?
。この場合、最初の試行はすでに一致しているため、プロセスが高速化されますが、常に一致するという事実は変わりません。
実際、繰り返しを「所有格」にすることで、エンジンがバックトラックするのを手動で防ぐことができます。これを行い、繰り返しが最初に残された場合、エンジンは他の可能な繰り返しを試行しません。これは構文になります:[10]*+
。これで、エンジンは100
その最初の部分とのみ一致します。その場合、マッチング1
は失敗しますが、繰り返しを所有格にしたため、使用する別のオプションを試すために戻ることはありません[10]*
。もちろん、この場合は役に立ちませんが、この動作が望ましいユースケースがあります。そして、これらすべてはリンクされたチュートリアルでもカバーされています。;)