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+)