Rubyで郵便番号判定を正規表現で行う

Rubyで郵便番号を正規表現で判定してみましょう。

判定パターン

郵便番号(String型)とみなす文字列のパターンは下記の2パターンとします。

  • "390-1401" (3桁-4桁記法)
  • "3901401" (7桁記法)

matchメソッドを使って出力される結果は次の通りです。

"郵便番号らしき".match()
"390-1401".match() # => #<MatchData>
"3901401".match() # => #<MatchData>
"390-140a".match() # => nil
"390140".match() # => nil
"3900-1401".match() # => nil

郵便番号判定

郵便番号を判定はどのように行えばよいでしょうか。
特徴としては数字3桁-数字4桁の組み合わせであるということです。
数字の判定はこちらの記述でいけますね。

/\d{3}/ # 数字1桁へのマッチを3回繰り返す
/\d{4}/ # 数字1桁へのマッチを4回繰り返す

組み合わせると

/\d{3}-\d{4}/
# 数字3桁と数字4桁の間にハイフンがある文字列へマッチ
"390-1401".match(/\d{3}-\d{4}/)
# => #<MatchData "390-1401">

ただしこの記述では文字列にハイフンがないと、桁数が合っていない場合に対応できません。
そこで先頭数字3文字、最後数字4文字で終わるように指定しましょう。

/\A/d{3}/ # 数字3文字で始まる文字列にマッチ
/\d{4}\z/ # 数字4文字で終わる文字列にマッチ

これらを使って記述すると次の通りです。

/\A\d{3}-?d{4}\z/
# 郵便番号に完全一致する文字列にマッチ
"3900-1401".match(/\A\d{3}-?\d{4}\z/)
# => nil

これで完全一致の判定ができるようになりました。