概要
正規表現で電話番号のバリデーションを行う時の注意
正:/0[0-9]{1,4}-[0-9]{1,6}(-[0-9]{0,5})?/
誤:/[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}/
※「誤」では以下のケースに対応できない
・市外局番が5桁(厳密な呼称で言えば「0」+市外局番4桁)
・フリーダイヤルで変な所にハイフンが入っている
※「正」でも判定出来るのは書式のみ
・正確を期すならば「-」を差っ引いて10桁かチェックが必要
・携帯電話も考えるなら10~11桁
・日本国内に限る
事の起こり
電話番号のチェックしてたら三笠市の番号でエラーを吐いた。
三笠市のとある電話番号
01267-x-xxxx
解決までの経緯
電話番号のお勉強
http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a.html#q2
頭の「0」は日本国内プレフィックス
次に1~4桁の市外局番
次に1~4桁の市内局番
(市外局番と市内局番は合わせて5桁)
加入者番号の4桁
「0」+ 5 + 4 = 10桁
なので、
0x – yyyy – zzzz
0xx – yyy – zzzz
0xxx – yy – zzzz
0xxxx – y – zzzz
上記4通りの組み合わせしか無いので
/0[0-9]{1,4}-[0-9]{1,4}-[0-9]{4}/
で事足りる…はずだったが、別の問題が見つかる。
フリーダイヤル
「0120」 + 6桁 = 10桁
本来は
0120 – xxxxxx
の形なのだが、各企業が好き勝手に(覚えやすいように)「-」を入れてくるパターンに遭遇。
なので
0120 – x – xxxxx
0120 – xx – xxxx
0120 – xxx – xxx
0120 – xxxx – xx
0120 – xxxxx – x
0120 – xxxxxx
上記6パターンもカバーしなくてはいけない
/0[0-9]{1,4}-[0-9]{1,6}(-[0-9]{1,5})?/
しかし、このパターンだと
「01234-123456-12345」や「01-2」
なんて入力も通ってしまうので、上記パターンに
0120-[0-9]{1}-[0-9]{5}
|0120-[0-9]{2}-[0-9]{4}
|0120-[0-9]{3}-[0-9]{3}
|0120-[0-9]{4}-[0-9]{2}
|0120-[0-9]{5}-[0-9]{1}
|0120-[0-9]{6}
…を追加するのがアホらしくなったので
「-」以外の桁数を数えて10桁以上はエラーにする事に。
と思ったら携帯電話が11桁。
「-」以外の桁数を数えて10~11桁以外はエラーにしよう。
解決。
終わりに
・状況が許すなら正規表現すっ飛ばして桁数見るのが1番楽。
・フリーダイヤルの区切りがフリーダム問題を無視するなら
/0[0-9]{1,4}-[0-9]{1,4}-[0-9]{4}/
で解決。
・本記事は絶対の解決策ではなく、ケースバイケースで現場単位の柔軟な対応が求められる事を留意して欲しい。