A mere hateblo

単なるはてブロです。

nested repeat operator + and ? was replaced with '*'

仕事でアセンブリ言語のソース間の依存関係を調べるべく、Rubyでスクリプトを書き、その中で正規表現を使った。その時に出た警告についてメモしておく。
例えば行頭にあるラベルを判別するために:

/^\S+\s+/

と書いた。\S+がラベル、\s+はラベルの直後の空白文字列を表す。その後ラベルはあったりなかったりすることに気付き:

/^(/\S+/)?\s+/

と書いた。さらにラベルは一致はさせるがあとで取り出す必要がないので:

/^(?:/\S+/)?\s+/

と書いた。
ここまで書いてRuby 1.8.7-p72では問題なく動いていたが、先日Ruby 1.9.3-p15へアップグレードしたらnested repeat operator + and ? was replaced with '*'と警告されるようになった。再現すると:

% ruby -e '/(?:\S+)?/'
ruby: warning: nested repeat operator + and ? was replaced with '*': /(?:\S+)?/

こんな感じ。ようは(?:\S+)?(?:\S*)書けるよ、ということを伝えたいのかなと理解した。理解したのはいいが:

/^(?:\S*)\s+/

と書いた場合、ラベルにあたる部分がいかにも「0文字以上の文字列」であるように見えて、やや書いた当初の意図(1文字以上の文字列があったりなかったりする)から外れるような気がする。
しかし上記警告が結構な回数出るのがウザく、なんかもうめんどくさくなってしまい、ヤケで結局のところ:

/^\S*\s+/

と書き直した。ここまで来るとどういう意図で書いたものなのかさえわからなくなりそうだが、警告出されるよりはマシか。