Just do IT

思うは招く

Ruby基礎問題100本ノック#19 正規表現1

お題

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

引用:「たのしいRuby 第6版」P.364より

回答

email = "test@domain.com"
email.scan(/(\w+)@(\w+\.\w+)/) do |m|
  p "$1: #{$1}"
  p "$2: #{$2}"
end
=>
"$1: test"
"$2: domain.com"

説明

今回は自分で勝手に作ったメールアドレスを使った。

email = "test@domain.com"

scanメソッドの引数に正規表現を設定すると、取得した文字列を使って処理ができる。

email.scan(/(\w+)@(\w+\.\w+)/) do |m|
  p "$1: #{$1}"
  p "$2: #{$2}"
end

\wは英数字、+は1回以上の繰り返しを意味する。つまり、\w+は「アルファベットまたは数字が1文字以上ある」ものを取得する。

@はアットマークとして取得するので、そのまま@を入れている。

\w+\.\w+は、domain.comのなかにドットがあるため、\を入れてピリオドをエスケープし、ピリオドという文字列として認識させている。

また、$1や$2などと取得するキャプチャ機能を使うには、キャプチャしたい文字列に対する正規表現()で囲む。よって(\w+)となる。

配列にキャプチャされて使えるようになる。

email = "test@domain.com"
email.scan(/(\w+)@(\w+\.\w+)/) do |m|
  p "配列: #{m}"
  p "$1: #{$1}"
  p "$2: #{$2}"
end
=>
"配列: [\"test\", \"domain.com\"]"
"$1: test"
"$2: domain.com"

学び

()でキャプチャができることを知った。

また、今回作ったメールアドレスの正規表現は大雑把すぎる。現実的なメールアドレスの正規表現は次の記事が詳しい。

qiita.com