? の特殊な使い方

(?= )
先読み(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/