gotagota日記

「面白きことは良きことなり」

『たのしいruby 第4版』第16章 正規表現(Regexp)クラス

第16章 正規表現(Regexp)クラス

模範解答はこちら

(1)

問題

「ローカルパート@ドメイン名」といった電子メールアドレス文字列から、ローカルパートを$1、ドメイン名を$2として取得する正規表現を作れ、という問題です。

私的解答
def getEMAddress(str)
  str =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
  localPart = $1
  domainName = $2
  return "Local part is '#{localPart}'. Domain name is '#{domainName}'"
end
p getEMAddress("info@example.com") #=> "Local part is 'info'. Domain name is 'example.com'"

メールアドレスの正規表現に関しては完全な定義が難しいらしいので、ある程度わりきる必要がありそうです。

(2)

問題

正規表現は難しい! なんて難しいんだ!」という文字列を、「正規表現は簡単だ! なんて簡単なんだ!」という文字列に変換しろ、という問題です。

私的解答

str = "正規表現は難しい! なんて難しいんだ!"
p str.gsub(/難しいんだ/, "簡単なんだ").gsub(/難しい/, "簡単だ") #=> "正規表現は簡単だ! なんて簡単なんだ!"

いっぺんに置き換えるベストな正規表現が思い浮かばなかったので、二回にわけてみたところ模範解答と同じことしてました(笑)

(3)

問題

アルファベットとハイフンから成る文字列を与えられると、ハイフンで区切られた部分を Capitalize するメソッド word_capitalize を定義しろ、という問題です。

私的解答
def word_capitalize(str)
  newAry = []
  ary = str.split(/\-/)
  ary.each do |w|
    newAry << w.capitalize
  end
  return newAry.join('-')
end
p word_capitalize("in-reply-to") #=> "In-Reply-To"
p word_capitalize("X-MAILER") #=> "X-Mailer"

配列に分解した後もう一度ハイフンでつないでます。
模範解答のように、チェインメソッドの使用によって、一行でも書けるのでこの点は記憶に刻みこみたいです。