電話番号のバリデーションについて調べてみたことをまとめました。
結論
先に結論だけ知りたい人向け。
ハイフン付きの日本の電話番号を正規表現で表現すると以下の通り。
^(?:0[5-9]0-\d{4}-\d{4}|0(?:\d-\d{4}|\d{2}-\d{3}|\d{3}-\d{2}|\d{4}-\d)-\d{4}|0(?!990)\d{3}-\d{3}-\d{3}|0\d{3}-\d{3}-\d{4})$
携帯電話・固定電話・フリーダイヤル等の主要な番号形式に対応し、緊急通報番号(110 等)や情報料代理徴収番号(0990)は除外しました。
これは形式のみの検証であり、番号の実在性までは判定できません。
ライブラリを使用してよいなら Google の libphonenumber の利用を推奨します。
目的
ユーザーの連絡先として入力された電話番号が、日本の電話番号として妥当な形式かどうかを正規表現で検証したいというのが動機です。
検証はなるべく簡潔に行いたいため、正規表現によるパターンマッチングで実装します。
外部ライブラリの利用が許容される場合は、Google の libphonenumber を使うほうがより正確な検証が可能です。
なお、本記事ではハイフン付き(例: 03-1234-5678)の番号を対象とします。
ハイフンなしの番号であれば正規表現ももっと単純になります。
日本の電話番号の形式
総務省のウェブページで日本の電話番号を調査したところ、連絡先として使用される番号には以下のパターンが存在することがわかりました。X は 0〜9 の任意の数字を表します。
携帯電話・PHS・IP電話(11桁)
| 形式 | 用途 |
|---|---|
050-XXXX-XXXX |
IP電話 |
060-XXXX-XXXX |
FMC サービス等(現状ほぼ未使用) |
070-XXXX-XXXX |
PHS・携帯電話 |
080-XXXX-XXXX |
携帯電話 |
090-XXXX-XXXX |
携帯電話 |
着信課金・統一番号(10桁・11桁)
| 形式 | 桁数 | 用途 |
|---|---|---|
0120-XXX-XXX |
10桁 | フリーダイヤル(着信課金) |
0800-XXX-XXXX |
11桁 | フリーコール(着信課金) |
0570-XXX-XXX |
10桁 | ナビダイヤル(統一番号) |
固定電話(10桁)
市外局番の桁数に応じて、ハイフンの位置が変わります。
| 形式 | 市外局番の桁数 | 例 |
|---|---|---|
0X-XXXX-XXXX |
2桁 | 東京 03、大阪 06 等 |
0XX-XXX-XXXX |
3桁 | 横浜 045、名古屋 052 等 |
0XXX-XX-XXXX |
4桁 | |
0XXXX-X-XXXX |
5桁 |
除外すべき番号
以下の番号は連絡先として使用できないため、バリデーションで除外する必要があります。
データ通信(M2M)等専用番号
主に IoT 機器などの通信モジュールに割り当てられる番号であり、音声通話には使用されません。
-
020-XXXX-XXXX(11桁) -
0200-XXXXXX-XXXX(14桁)
情報料代理徴収機能用電話番号
ダイヤルQ2 等のサービスで使用されていた番号です。
0990-XXX-XXX
緊急通報・特番(3桁・4桁等)
警察(110)、消防・救急(119)、番号案内(104)、電報(115)、災害用伝言ダイヤル(171)等の短い特番は、そもそも上記のどのパターンにも一致しないため、正規表現上は自動的に除外されます。
正規表現
上記の許可パターンをまとめると、以下の正規表現になります。
^0[5-9]0-\d{4}-\d{4}$|^0(\d-\d{4}|\d{2}-\d{3}|\d{3}-\d{2}|\d{4}-\d)-\d{4}$|^0(?!990)\d{3}-\d{3}-\d{3}$|^0\d{3}-\d{3}-\d{4}$
各パートの対応は以下の通りです。
| 正規表現 | 対象 |
|---|---|
^0[5-9]0-\d{4}-\d{4}$ |
携帯電話・PHS・IP電話(050〜090) |
^0(\d-\d{4}|\d{2}-\d{3}|\d{3}-\d{2}|\d{4}-\d)-\d{4}$ |
固定電話(10桁) |
^0(?!990)\d{3}-\d{3}-\d{3}$ |
0120・0570 等の10桁番号(0990 を否定先読みで除外) |
^0\d{3}-\d{3}-\d{4}$ |
0800 等の11桁番号 |
さらに読みやすさを考慮してまとめると、以下の正規表現になります。
^(?:0[5-9]0-\d{4}-\d{4}|0(?:\d-\d{4}|\d{2}-\d{3}|\d{3}-\d{2}|\d{4}-\d)-\d{4}|0(?!990)\d{3}-\d{3}-\d{3}|0\d{3}-\d{3}-\d{4})$
注意点
この正規表現は、日本の電話番号を厳密に判定するものではなく、主な桁数とハイフン位置をもとにした簡易的な形式検証です。番号が実際に割り当て済みかどうかは判定できず、たとえば 050-0XXX-XXXX のような現在未割当の番号帯も形式上は通過します。また、市外局番の実在性などまでは検証していないため、日本の番号計画上あり得ない番号も通過します。