正規表現の先読み・後読み構文
Posted by mkamo on 2008年6月26日
正規表現には"先読み"や"後読み"という構文がある.これらの構文を利用すると,マッチする対象となる文字列の直前・直後の文字列をマッチの条件として指定することができる.以下に簡単な説明と例を挙げておく.
- 肯定先読み
- 構文
「(?=X)」という構文で記述する.Xは任意の正規表現. - 意味
Xにマッチする文字列の最初の位置にある検索文字列にマッチする. - 例
「\d+(?=円)」という例で考える.正規表現「\d+」は1回以上の数字の繰り返しである.「(?=円)」は肯定先読みで,「円」にマッチする文字列の最初の位置にある検索文字列にマッチする.これらを組み合わせて「1回以上の数字の繰り返し,ただし直後に「円」にマッチする文字列がある」と読むとわかりやすい.
この正規表現に対しては「1円」や「100000円以上」の数字部分がマッチする.「1」や「1ほげ」や「円1」はマッチしない. - 否定先読み
- 構文
「(?!X)」という構文で記述する.Xは任意の正規表現. - 意味
Xにマッチしない文字列の最初の位置にある検索文字列にマッチする. - 例
「\d+(?!円)」という例で考える.肯定先読みの例の否定の形で「1回以上の数値の繰り返し,ただし直後に「円」にマッチする文字列がない」と読むとわかりやすい.
この正規表現に対しては「1」や「1ほげ」の数値部分にはマッチするが「1円」や「100000円以上」はマッチしない. - 肯定後読み
- 構文
「(?<=X)」という構文で記述する.Xは任意の正規表現. - 意味
Xにマッチする文字列の最後の位置にある検索文字列にマッチする. - 例
「\d+(?<=(DQ|FF))」という例で考える.「\d+」は数字の1回以上の繰り返しである.「(?<=(DQ|FF))」が肯定後読みで,「DQ」または「FF」にマッチする文字列の最後の位置にある検索文字列にマッチする.組み合わせて「数字の1回以上2回以下の繰り返し,ただし直前に「DQ」または「FF」にマッチする文字列がある」と読むとわかりやすい.
この正規表現に対しては「DQ3」や「FF12」の数字部分がマッチする.「1」や「ED6」や「3DQ」はマッチしない. - 否定後読み
- 構文
「(?<!X)」という構文で記述する.Xは任意の正規表現. - 意味
Xにマッチしない文字列の最後の位置にある検索文字列にマッチする. - 例
「\d+(?<!(DQ|FF))」という例で考える.肯定先読みの例の否定の形で「1回以上の数字の繰り返し,ただし直前に「DQ」または「FF」にマッチする文字列がない」と読むとわかりやすい.
この正規表現に対しては「1」や「ED6」や「3DQ」の数字部分がマッチする.「DQ3」や「FF12」はマッチしない.