お題
電子メールアドレス「ローカルパート@ドメイン名」の文字列から、ローカルパートを$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"
学び
()
でキャプチャができることを知った。