Hatena::Grouprubyist

Ruby初心者prinyの学習帳 RSSフィード

2008-12-31練習:たのしいRuby P.266 (1)

練習問題 (1)
メールアドレスのローカルパートを $1 として、ドメイン名を $2 として取得する正規表現を作りましょう。

アットマークが 1 つだけ含まれる文字列を対象と考えて、/\A([^@]+)@([^@]+)\z/ でいいのかな。

フリー百科事典『ウィキペディア(Wikipedia)』- メールアドレス を参考に、もう少しメールアドレスっぽいものが対象になるようにしよう。

実際のメールアドレスでは、ローカルパートで、quoted-string の形式だとさらに使える文字が増えるとか、ピリオドが連続しているのはダメとか、ドメイン名の先頭の文字はアルファベットの大文字、小文字か数字である必要があるとか、ほかにも、いろいろあるみたいだけど、深みにはまって抜けられなくなりそうなので、quoted-string の形式で使える文字のことは置いといて、さらに、条件つき(最後には使えないよ、とか)で使える文字は、単純に「使える文字」として扱うことにする。

コード

def get_localpart_and_domain(str)
  /\A([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~\.-]+)@([a-zA-Z0-9\.-]+)\z/ =~ str
  [$1, $2]
end

p get_localpart_and_domain("Abc@example.com")
p get_localpart_and_domain("hoge+123/Y=A*X@example.com")
p get_localpart_and_domain("!#$%&'*+-/=?^_`.{|}~@example.com")

実行結果

あらま。エラーになった。

get_localpart_and_domain.rb:2: syntax error, unexpected $undefined
  /\A([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~\.-]+)@([a-zA-Z0-9\.-]+)\z/ =~ str
                   ^
get_localpart_and_domain.rb:8: unterminated string meets end of file
get_localpart_and_domain.rb:8: syntax error, unexpected tSTRING_END, expecting tSTRING_CON
TENT or tREGEXP_END or tSTRING_DBEG or tSTRING_DVAR

閉じ忘れがあるって言われているのかな。正規表現のオプションに x を指定していないのに、# の後ろがコメントとして扱われている?よくわからないまま、なんとなく、# と $ の場所を入れ替えてみた。

コード 2

def get_localpart_and_domain(str)
  /\A([a-zA-Z0-9!$#%&'*+\/=?^_`{|}~\.-]+)@([a-zA-Z0-9\.-]+)\z/ =~ str
  [$1, $2]
end

p get_localpart_and_domain("Abc@example.com")
p get_localpart_and_domain("hoge+123/Y=A*X@example.com")
p get_localpart_and_domain("!$#%&'*+-/=?^_`.{|}~@example.com")

実行結果 2

["Abc", "example.com"]
["hoge+123/Y=A*X", "example.com"]
["!$#%&'*+-/=?^_`.{|}~", "example.com"]

エラーが出なくなった。「#$」という順番がダメだったってこと?今度は「#!$」にしてみた。

コード 3

def get_localpart_and_domain(str)
  /\A([a-zA-Z0-9#!$%&'*+\/=?^_`{|}~\.-]+)@([a-zA-Z0-9\.-]+)\z/ =~ str
  [$1, $2]
end

p get_localpart_and_domain("Abc@example.com")
p get_localpart_and_domain("hoge+123/Y=A*X@example.com")
p get_localpart_and_domain("#!$%&'*+-/=?^_`.{|}~@example.com")

実行結果 3

["Abc", "example.com"]
["hoge+123/Y=A*X", "example.com"]
["#!$%&'*+-/=?^_`.{|}~", "example.com"]

これもエラーにはならなかった。

なぞな動き。練習問題の本質ではなさそうなとこで、はまってしまった。検索しようにも「#$」では検索できないし。こまった・・・。

holysugarholysugar 2009/01/02 02:38 #による式展開をしようとしてますね。

http://www.ruby-lang.org/ja/man/html/_A5EAA5C6A5E9A5EB.html#a.bc.b0.c5.b8.b3.ab
を見てください。
正規表現中で特殊な働きをする文字については常にエスケープしておくと不安が無くなるかもしれません。

prinypriny 2009/01/02 21:13 なるほど。ありがとうございます。勉強になりました。

ゲスト



トラックバック - http://rubyist.g.hatena.ne.jp/priny/20081231