Regex Tips / gsubでスペースに挟まれた文字を置換する時の注意
今日のRubyで嵌った事。
Rubyで正規表現をしていて気付きました。
via http://www.jaist.ac.jp/~m-hatake/regexp/
というスペースに挟まれた文字列があったとしましょう。
a b c d ef g hijk lm n
これらの文字列のスペースに挟まれた要素は全部で9個です。
これらすべてを「0」に置換したいと思います。
str = " a b c d ef g hijk lm n" p str.gsub(/(\s)(\w+)(\s)/,"0")
これでよいと思った人・・・嵌ってます。
結果は以下のようになります。
"0b0d0g0lm n"
\sをスペースとして、説明すると
- 先頭から検索してマッチしたので"\sa\s"を0に置換
- 次のbの部分の先頭には\sはついていない
- よってbをとばして次は\s
- "\sc\s"はマッチしたよって置換・・・
といった形で一文字づつ抜かしていってしまいます。
なので、スペースを保持したいと思ったら正規表現の後方の\sを削除しないといけなかったのです。
と言う事で正解は・・・
str = " a b c d ef g hijk lm n" p str.gsub(/(\s)(\w+)/,"0")
嗚呼、これに気付けず無駄な時間を過ごす・・・。
と言う事で今回のPIECEは
(\s)(\w+)(\s)
(\s)(\w+)