2

私は正規表現を学んでいて、ルックアラウンドを試みていましたが、次のことを試みているように、これらの式の配置順序に混乱しています

 b(?!a)

上記は意味する必要がありますb not followed by a。配置すればOK

 (?!a)b

これは、a がどこに来ても b に一致します。

今私がこのようなことをしたら

    ^(?!.*\bMy Links\b).*$

上記では、否定先読みは、文字を消費する文字列の前にあります..なぜそれは

では、否定的な先読みを配置する際のルールは何ですか。パターン全体での配置についての議論はありません。これを説明してください?

4

2 に答える 2

1

キャレット^を使用して、検索対象の文字列および正規表現内の現在の検索位置を表します。正規表現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失敗する方がわずかに速くなります。

于 2013-05-26T20:32:11.407 に答える
1

ルックアラウンドは のように「ゼロ幅」であること^$または「文字」ではなくカーソルの場所\bのみを表すことを知っておく必要があります。ルックアラウンド メカニズムでは、ルックアラウンド部分に入る前に正規表現エンジンにカーソルの位置を記憶させるだけで実行され、その後、カーソルはこの以前に記憶された位置にリセットされます。

bいくつかの文字 (あなたの場合) の後に他の文字 (あなたの場合) がないかどうかを確認したい場合は、次のaように書く必要がありますb(?!a)。これにより、正規表現が最初に検索bされ(カーソルが の後に設定されますb)、次に文字がテストされますa

(?!a)bカーソル位置ごとに正規表現として記述する場合(前にあるbとしましょう)、先読みテストを実行します(したがって、一時的にカーソルを次の位置に移動し、その前の文字を読み取り、そうでないかどうかを確認しaます。カーソルがだったので以前はそれが notbを受け入れ、カーソルを前に戻します. 先読みテストの後、正規表現エンジンは tegex パターンの次の部分に移動し (次の文字が であるかどうかを確認します)、カーソルが一致する前にあったため、一致が見つかります.babbb

したがって、(?!a)bすべての場合はb問題ありません。bできる方法がないためです。a

于 2013-05-26T21:22:17.027 に答える