それらはルックアラウンドと呼ばれます。実際に一致させることなく、パターンが一致するかどうかをアサートできます。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#
\__/ \__/ \____/\___/
参考文献