電話番号を取得するための正規表現

Pocket

日本の電話番号を正規表現を使って取得する方法を考えます。

一般電話

電話番号に関しては総務省のページがあります。

総務省|電気通信番号の利用・指定|市外局番の一覧

なぜかExcelファイルではなくWordファイルとPDFファイルがダウンロードできます。
東京の市外局番は「3」ですが国内プレフィックス「0」を付けて「03」と表記するのが一般的ですので、以下、そうします。

電話番号は「市外局番 市内局番 加入者番号」という形式になっています。
市外局番と市内局番はあわせると6桁になります。例えば、市外局番が2桁の場合、市内局番は4桁になります。
市外局番は2桁から5桁まであります。
加入者番号は4桁です。

  • 狛江市役所 03-3430-1111
  • 江別市役所 011-382-4141
  • 恵庭市役所 0123-33-3131
  • 三笠市役所 01267-2-3182

携帯電話

携帯電話はPHSを含めて「3桁 4桁 4桁」という形式です。最初の3桁は「070」「080」「090」です。

区切り記号

一般電話も携帯電話も形式としては「市外局番」「市内局番」「加入者番号」からなります。
単純に10桁または11桁の数列としてもよいのですが、一般的には区切り記号を使っています。

  • 066-012-3456
  • 066(012)3456
  • (066)012-3456

1番目が、一般的だと思います。
2番目は、市内通話は市外局番が不要なので、市内局番を括って「(012)3456」と書いていた名残でしょう。携帯電話がない時代の話です。
3番目は、逆に市外局番を括る書き方です。海外だとこれが一般的で「省略できる」という意味らしいです。

正規表現

JavaScriptを使います。半角だけを考慮することにします。

単に区切りだけならば次のようになります。

「\d+\D\d+\D\d+」

「\d」は数字、「\D」は数字以外を表します。
しかし、これでは「2014年2月12」にもマッチしてしまいます。
桁数を考慮すると次のようになります。

「0\d{1,4}\D\d{2,4}\D\d{4}」

「0\d{1,4}」は「0」から始まる2桁から5桁までの数字、「\d{2,4}」は2桁から4桁までの数字、「\d{4}」は4桁の数字を表します。
普通はこれで充分だと思います。
ただし「03-123-4567」のようなケースにもマッチしてしまいます。入力した値が正しいかをチェックするために使うには弱いかもしれません。
区切り毎の桁数を考慮すると次のようになります。

「0([7-9]0\D\d{4}|\d\D\d{4}|\d{2}\D\d{3}|\d{3}\D\d{2}|\d{4}\D\d)\D\d{4}」

0[7-9]0\D\d{4}\D\d{4} 3桁-4桁-4桁(携帯電話)
0\d\D\d{4}\D\d{4} 2桁-4桁-4桁
0\d{2}\D\d{3}\D\d{4} 3桁-3桁-4桁
0\d{3}\D\d{2}\D\d{4} 4桁-2桁-4桁
0\d{4}\D\d\D\d{4} 5桁-1桁-4桁

これらを一つにまとめたものです。先頭の「0」と末尾の4桁が共通なのでそれ以外を括っています。

サンプル

テキストから電話番号を抽出する関数を書いてみました。
区切りは「\D」とすると改行も拾ってしまうので「[^\d\n]」としています。また前後にスペースが入るなど1文字とは限らないので「[^\d\n]+」としました。
マッチした文字列(電話番号)について、区切り記号を通常の半角ハイフンに置換しています。

function get_phones(list) {
  var matches, i;
  matches = list.match(/0([7-9]0[^\d\n]+\d{4}|\d[^\d\n]+\d{4}|\d{2}[^\d\n]+\d{3}|\d{3}[^\d\n]+\d{2}|\d{4}[^\d\n]+\d)[^\d\n]+\d{4}/g);
  if (matches) {
    for (i = 0; i < matches.length; i++) {
      matches[i] = matches[i].replace(/(\d+)\D+(\d+)\D+(\d+)/,function($0,$1,$2,$3){
        return $1 + "-" + $2 + "-" + $3;
      });
    }
    return matches.join("\n");
  }else{
    return "";
  }
}

フリーダイヤルは「0120-nn-nnnn」でなく「0120-nnn-nnn」「0120-nnnnnn」と書くケースがありますが対応していません。
また区切り記号を省略して「0660123456」と書くケースにも対応していません。

[ 2014年2月13日 | カテゴリー: JavaScript | タグ: , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報