正規表現の先読み/後読みについて
正規表現を扱っていると「先読み/後読み」というものが出てきます。
私自身正規表現の使用頻度はそこまで高くないので、使うタイミングで分からないことがあれば都度調べているのですが、毎回「先読み/後読み」について調べている気がするのでここでまとめておこうと思います。
先読み/後読みとは
特定の文字列を検索する際に、対象の文字列の直前/直後に指定した文字列があるかどうかを判定する仕組みです。
これだけ読むと分かりにくいですが、具体例の前に一旦先読み/後読みの種類を紹介しておきます。
名前 | 書き方 | 意味 |
---|---|---|
肯定先読み | (?=pattern) | 直後にpatternがある |
否定先読み | (?!pattern) | 直後にpatternが無い |
肯定後読み | (?<=pattern) | 直前にpatternがある |
否定後読み | (?<!pattern) | 直前にpatternが無い |
肯定先読みの例
肯定先読みは検索対象の文字列の後ろに特定のパターンがあるかどうかでマッチする/しないの判定を行います。
例えば
I love cats and I love dogs
という文字列の中からloveという文字列(ただしloveの後ろにcatが来る)を探したい場合
love(?= cats)
という正規表現を使います。これによりlove dogs
の部分は排除して検索することが可能です。
補足となりますが、正規表現には文字にマッチするものと位置にマッチするもの2種類があります。
文字にマッチするものは例えば.
などです。
位置にマッチするものしては行頭^
や行末$
などのメタ文字があります。(アンカー
と呼ぶそうです)
先読みと後読みも実はアンカーの1種です。
先程の表で直後にpatternがある
や直前にpatternが無い
といった記述をしましたがが、この直前や直後というのは検索文字列の直前や直後の位置のことです。
I love cats and I love dogs
でいうとlove
とcat
の間の位置にマッチする、ということになります。