? の特殊な使い方
- (?= )
- 先読み(lookahead)。パターンによる位置指定(幅を持たない)
(?=re1)re2
という表現は、re1 と re2 両方にマッチするものにマッチする正規表現です。
re1(?=re2)
という表現は、後に re2 とマッチする文字列が続く、正規表現 re1 です。
p /foo(?=bar)/ =~ "foobar" # => 0 p $& # => "foo" (bar の部分の情報はない)
- (?! )
- 否定先読み(negative lookahead)。パターンの否定による位置指定(幅を持たない)
(?!re1)re2
という表現は、re1 にマッチしないが re2 にはマッチする正規表現です。
# 000 を除く 3 桁の数字 re = /(?!000)\d\d\d/ p re =~ "000" # => nil p re =~ "012" # => 0 p re =~ "123" # => 0 # C 言語の識別子 ([A-Za-z_] で始まり、[0-9A-Za-z_] が続く文字列) /\b(?![0-9])\w+\b/