上記のメールアドレスが与えられた時に、"example"を返したい。
修正版実装
'example-1..@gmail.com'.slice(/([\w\-.]+)@/, 1) # 1 番目の括弧にマッチする文字列を取得する。
#=> "example-1.."
'example-1..@gmail.com'[/([\w\-.]+)@/, 1] # とも書ける。
#=> "example-1.."
def gen_name_from_email(email)
return email[/([\w\-.]+)@/, 1] || SecureRandom.alphanumeric(10)
end
コメ欄記載感謝!
実装
def gen_name_from_email(email)
email =~ /([\w\-.]+)@/
$1 || SecureRandom.alphanumeric(10) # 念の為、nil対策
end
email = "example-1..@gmail.com" # => example-1..
email = "example-1.." # => nil
=~ (String)
=~でマッチに成功したときは、組み込み変数$&、$1、$2などに値がセットされます。
他にも標準クラスmatchやRegexpクラスのmatchがある模様
メールアドレスで使える文字
- 半角英小文字、数字、「-」(ハイフン)、「.」( ドット)、「_」(アンダーバー)のみ 考慮する
- 文字数は、3文字以上30文字以内 考慮しない
- ひとつ目の文字は、アルファベットまたは数字のみ 考慮しない
正規表現
/w : アルファベット、数字、アンスコ
+ : 直前の文字1回以上の繰り返し
Rubocopのエラー
Rubocop の構文チェックで "Avoid the use of Perl-style backrefs." と警告が表示される