3

私は正規表現を学んでおり、次のパターンを見つけました:

q(?=u)i

quitq が q に一致し、u が u に一致するため (先読みが有効であるため)、math を実行しようとすると失敗しますが、正規表現は単語内でバックトラックしquit、文字 u が今度は i と再び比較されます。試合は失敗。

このパターンに一致する単語が見つかりません。ケースはありますか?それとも、この構造 (パターン - 先読み - パターンの残り) は役に立ちますか?

4

4 に答える 4

3

正規表現ルックアラウンド構文はゼロ幅です。

これが意味することは、一致するがカーソルを動かさないということです。そのため、パターンでは次のようになります。

  • 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 つの文字が続きます。

于 2013-08-28T08:09:23.983 に答える
2

いいえ、あなたが私が見たものに似た一致するパターンはありませんが、そのような構造を使用できます (確かに少し奇妙ですが)、たとえば:

q(?=.*t)u

この正規表現は、で始まる文字列と一致しますquが、tその後のどこかにあります。これは、 は一致しますがquestionquitは一致しないことを意味しquasarます。その場合、同等で読みやすい (imo) 正規表現qu(?=.*t)を使用できます。

于 2013-08-28T08:08:17.773 に答える
1

(?=...)先読み( )の後(または前)のパターンが修正された場合、私は言います。正規表現はあまり意味がありません。お気に入り:

foo(?=bar)fixed

ただし、fixedパーツが動的な場合は便利です。次の例を参照してください。

kent$  echo "fooququuuxxxxxxx"|grep -Po 'q(?=uu).*' 
quuuxxxxxxx

kent$  echo "fooququuuxxxxxxx"|grep -Po 'q(?=u).*' 
ququuuxxxxxxx

上記の例では、先読みが異なるだけで、異なる一致結果が得られました。

于 2013-08-28T08:19:45.777 に答える