キャレット^
を使用して、検索対象の文字列および正規表現内の現在の検索位置を表します。正規表現b(?!a)
を使用して、 を検索するとしcafebabe
ます。システムは最初のものを見つけようとしますb
。最初の 4 文字が失敗し、最初の に到達しb
ます。
cafe^babe ^b(?!a)
b は一致するため、正規表現に続きます。
cafeb^abe b^(?!a)
しかし、否定先読みは失敗します。次の文字は a です。したがって、正規表現はリセットされ、文字列内の次の場所に移動します。
cafeb^abe ^b(?!a)
これは失敗し、引き続き
cafeba^be ^b(?!a)
b が一致するので、
cafebab^e b^(?!a)
文字列は否定先読みを渡すため、次のようになります。
cafebab^e b(?!a)^
そして通過します。
次に、2 番目の式を使用します。覚えておいてください、これは否定的な先読みであり、後ろ向きの否定ではありません。
^cafebabe ^(?!a)b
c がパスするので、
^cafebabe (?!a)^b
これは失敗します。
正規表現をリセットして文字列を進めると、次のようになります。
c^afebabe ^(?!a)b
否定的な先読みが失敗するため、これは失敗します。
最初の 1 つが失敗したのと同じように、次の 2 つが失敗し、次のようになります。
cafe^babe ^(?!a)b
否定先読みは成功するので、引き続き
cafe^babe (?!a)^b
成功します。さらに進んだとします。次の文字は、2 番目の文字と同様に失敗します。
cafeb^abe ^(?!a)b
そのあとが来る
cafeba^be ^(?!a)b
a が現在の場所の前にあることはまったく問題ではありません。b は負の先読みを満たすので、
cafeba^be (?!a)^b
そしてこれは通過します。最終的な選択肢は失敗します。
追加した
3 番目の例では、否定的な先読みが最初にありますが、. で始まり.*
ます。そのため、文字の後に単語境界が続き、その後に単語境界が続くシーケンスがない場合は合格ですMy Links
。それが成功すると、何もキャプチャせずに文字列全体を消費します。つまり、この文字列には単語境界で囲まれた文字列が含まれMy Links
ていますか?と同等です。単純に見つけようとして\bMy Links\b
失敗する方がわずかに速くなります。