私は正規表現を学んでおり、次のパターンを見つけました:
q(?=u)i
quit
q が q に一致し、u が u に一致するため (先読みが有効であるため)、math を実行しようとすると失敗しますが、正規表現は単語内でバックトラックしquit
、文字 u が今度は i と再び比較されます。試合は失敗。
このパターンに一致する単語が見つかりません。ケースはありますか?それとも、この構造 (パターン - 先読み - パターンの残り) は役に立ちますか?
正規表現ルックアラウンド構文はゼロ幅です。
これが意味することは、一致するがカーソルを動かさないということです。そのため、パターンでは次のようになります。
q
「q」にマッチ カーソルが「u」に移動(?=u)
"u" にマッチ カーソルは "u" にとどまるi
"u" と一致しないため、パターンは失敗します。パターンはバックトラックしないことに注意してください。ルックアラウンド アサーションはゼロ幅です。
この構造は、たとえば一連の文字に「少なくとも 1 つの X」を含むパターンに一致させたい場合に非常に便利です。例えば:
[a-z]{4}[1-9]{3}(?=.*X)[a-zA-Z]{5}
4 つの小文字の後に 3 つの数字が続き、その後に少なくとも 1 つの "X" を含む任意の大文字と小文字の 5 つの文字が続きます。
いいえ、あなたが私が見たものに似た一致するパターンはありませんが、そのような構造を使用できます (確かに少し奇妙ですが)、たとえば:
q(?=.*t)u
この正規表現は、で始まる文字列と一致しますqu
が、t
その後のどこかにあります。これは、 は一致しますがquestion
、quit
は一致しないことを意味しquasar
ます。その場合、同等で読みやすい (imo) 正規表現qu(?=.*t)
を使用できます。
(?=...)
先読み( )の後(または前)のパターンが修正された場合、私は言います。正規表現はあまり意味がありません。お気に入り:
foo(?=bar)fixed
ただし、fixed
パーツが動的な場合は便利です。次の例を参照してください。
kent$ echo "fooququuuxxxxxxx"|grep -Po 'q(?=uu).*'
quuuxxxxxxx
kent$ echo "fooququuuxxxxxxx"|grep -Po 'q(?=u).*'
ququuuxxxxxxx
上記の例では、先読みが異なるだけで、異なる一致結果が得られました。