正規表現

正規表現でなんだかうまくいかないです。

def word_capitalize(str)
  str.gsub!(/[^\-]+/) do |matched|
    matched.capitalize!
  end
  return str
end

p word_capitalize("in-reply-to") #=> "In-Reply-To"
p word_capitalize("X-MAILER") #=> "-Mailer"

アルファベットとハイフンからなる文字列を与えると、ハイフンで区切られた部分をcapitalizeするメソッドの定義なんですが2つ目の方はうまくいかないです。

なんでかなって思ってたんですが、色んな文字列で試してたら原因がわかりました。

原因は、String#capitalize!が大文字と小文字の変換ができなかったら、nilを返すからでした。

すっかり忘れてました。

ということで、それを踏まえて書き直しです。

def word_capitalize(str)
  str.gsub!(/[^\-]+/) do |matched|
    matched.capitalize
  end
  return str
end

p word_capitalize("in-reply-to") #=> "In-Reply-To"
p word_capitalize("X-MAILER") #=> "X-Mailer"

書きなおしといっても、capitalize!をcapitalizeに変えただけです。

破壊的なメソッドにしないと書き換えてくれないように思えて、
capitalize!にしてましたが、capitalizeでもちゃんと書き換えてくれますね。

破壊的なメソッドはnilを返したりするときは、こういうことになるので、
破壊的なメソッドの扱いには気をつけないとなって思いました。