電話番号の形式チェック(正規表現) | 甘グラマー ~癒しを求めて・・・~

電話番号の形式チェック(正規表現)

先日、今のプロジェクトで、システム間で電話番号の形式チェックの方法が異なっていて上手く動作しない現象が起きた。


このシステムの電話番号のフォーマットチェックは次のようになっている。

1.”‐”(ハイフン)付きで12桁または13桁以外はエラー

2.次の正規表現にマッチしていなければエラー

  "^0[1-9][0-9]{0,3}-[0-9]{1,4}-[0-9]{4}$"


上記のチェックはWebでよく見かける"^[0-9]{2,5}-[0-9]{1,4}-[0-9]{4}$"だけのチェックよりは多少厳しい条件になっているが、実はこれでも全然正しくチェックできていない。理由はいくつかある。

 ・市外局番(国内プレフィックスを含む)が6桁の地域が日本には存在する

 ・”‐”付きで11桁の地域も存在する

 ・4桁-3桁-4桁などの存在し得ない電話番号も入力が可能である

などなど色々出てくる。では完全にチェックすることは可能なのだろうか?



ここで、日本の電話番号の形式についてまとめてみよう。


電話番号とは0~9の数字を組み合わせたもの

一般固定電話は0AB~J形式。(Aは0以外、B~Jは数字。ただしIは”1”と紛らわしいのでAB~Jには含まれない)

携帯電話は0A0BCDEFGHJ形式。

※他にも0AB0、00などからはじまる番号もあるが、一般的なシステムで入力されることはほとんど無いのでここでは除外します。

そして、一般固定電話は以下のような形式に従う

 ・先頭に0(国内プレフィックス)

 ・市外局番(1~5桁)

 ・市内局番(0~4桁)

 ・市外局番+市内局番=5桁(一部地域は4桁)

 ・加入者番号(4桁)


と、こんな感じなのだ。フォーマットチェックをする上で面倒なことは、合計の桁数が単一では無いことだ。しかもそれはハイフンが無い場合で、ハイフンありの場合にはハイフンで区切られている各部分の桁数が決まっていないのでもっと面倒だ。簡単に言ってしまうと、一番最初に書いた正規表現のような簡単な形で電話番号のフォーマットチェックを行うことはできないのだ。


実際に書こうとすれば、OR条件を組み合わせて以下のようなパターンに当てはまるかをチェックする必要がある。

 ・0A0-BCDE-FGHJ(携帯電話)

 ・0A-BCDE-FGHJ

 ・0AB-CDEーFGHJ

 ・0ABC-DE-FGHJ

 ・0ABCDーE-FGHJ

 ・0ABCDEーFGHJ

 ・0ABC-D-EFGH(箱根など。2007年2月25日からは0ABC-8D-EFGHとなるらしい。)


今回のシステムのように他のシステムと受け渡しがある場合にはフォーマットチェックは必要になる。が、どうせ上記のチェックを通っても使われていない組み合わせも存在してしまう。肝心なのはシステム間で矛盾が起きないようにすることだ。結局、受け渡しするシステムで一番厳しいところのチェックを入れておけばいいとか・・・。