正規表現の表記に肯定先読み、否定後読みなどといったものがあります。これらの説明として
foo(?=bar) は直後にbarがあるfooにマッチする
というのをよく見かけますが、私はなかなか理解できませんでした。
確かに説明の通りなのですが、十分ではありません。たとえば順序を変えて (?=bar)foo としたらどうなのか、 (?=bar) のみでは使えるのかは説明されていません。
私は次のように理解しました。これらは文字列ではなく位置にマッチします。
肯定先読み (?=hoge) その位置のあとにhogeがあるかどうか
否定先読み (?!hoge) その位置のあとにhogeがないかどうか
肯定後読み (?<=hoge) その位置の前にhogeがあるかどうか
否定後読み (?<!hoge) その位置の前にhogeがないかどうか
ですので (?=bar) を単体で一致条件として使うことはできます。
(?=bar) を foo に置換すれば bar を foobar に置換したのと同じことになります。
位置に一致するという性質を利用して次のような使い方ができます。
先頭にないときにマッチさせる
^(?!hoge):先頭にhogeがなければマッチする
通常、ないものを検索するのは困難ですがこの否定先読み(?!hoge)なら実現できます。
先頭にあるときにマッチさせる
^(?=hoge):先頭にhogeがあればマッチする
これらの表記ではhogeの部分は一致結果に含まれないので置換後文字列はシンプルにすることができます。
例えば先頭に数字がある行のみ先頭に・を追加したいとき、
検索文字列: ^(?=[0-9]) 置換文字列: ・
となります。
他の方法では
検索文字列: ^([0-9]) 置換文字列: ・$1
と、部分一致を$1で参照しなければなりません。