それらはルックアラウンドと呼ばれます。実際に一致させることなく、パターンが一致するかどうかをアサートできます。4つの基本的な回避策があります。
- ポジティブな見返り:私たちが一致することができるかどうかを確認してください
pattern
...
(?=pattern)
-...現在の位置の右側(先を見据えて)
(?<=pattern)
-...現在の位置の左側(後ろを見てください)
- ネガティブルックアラウンド-一致できないかどうかを確認します
pattern
(?!pattern)
-...右へ
(?<!pattern)
-...左に
簡単なリマインダーとして、見回すために:
=
正であり、負!
である
<
後ろを見る、そうでなければ先を見る
参考文献
しかし、なぜルックアラウンドを使用するのですか?
#([^#]+)#
上記のパターンのルックアラウンドは必要ではなく、うまく機能する(\1
非を取得するためにキャプチャされた文字列を抽出する)と主張する人もいるかもしれません#
。
完全ではありません。違いは、ルックアラウンドがと一致しないため、次の一致の#
試行で再び「使用」できることです。簡単に言えば、ルックアラウンドは「一致」をオーバーラップさせることができます。
次の入力文字列について考えてみます。
and #one# and #two# and #three#four#
ここで#([a-z]+)#
、次の一致を示します(rubular.comで見られるように):
and #one# and #two# and #three#four#
\___/ \___/ \_____/
(?<=#)[a-z]+(?=#)
これを、に一致する、と比較してください。
and #one# and #two# and #three#four#
\_/ \_/ \___/ \__/
残念ながら、これはrubular.comでデモンストレーションできません。これは、ルックビハインドをサポートしていないためです。ただし、先読みをサポートしているため、 ( rubular.comで見られるように)#([a-z]+)(?=#)
一致する、と同様のことを行うことができます。
and #one# and #two# and #three#four#
\__/ \__/ \____/\___/
参考文献