新規登録のフォームを作成しているときなど、電話番号を正規表現で確認してエラーチェックをしたいということはよくあるだろう。なんらかのデータ移行作業にJavaを使っているようなときも同様だ。
このページではJavaおよび他のプログラミング言語で、電話番号をどうやって正規表現で書けばいいかをまとめている。参考にしてほしい。
目次
正規表現による電話番号の扱い方
Javaの正規表現を使うと、電話番号のチェックをしたりテキストの中から電話番号を抽出したりすることができる。
最初に、対象となる電話番号はどのような形式があるのかを確認しておこう。固定電話の場合は、先頭が0である、その後市外局番と市内局番をあわせた5桁の数字、さらに4桁の加入者番号の数字が続く。市外局番と市内局番は地域によってその桁数が異なっている。市外局番、市内局番と加入者番号の各番号は、一般的にハイフン[-]で区切られている。
- 03-2222-2222 (東京)
- 0422-22-2222 (東京都小金井市)
また、最初の0と市外局番が括弧[( )]で囲まれる形式もある。
- (03)2222-2222
- (0422)22-2222
携帯電話の場合は、先頭の3文字が070、080、090である。その後、4桁の数字、さらに4桁の数字が続く。
- 070-2222-2222
- 080-2222-2222
- 090-2222-2222
IP電話の場合は、先頭の3文字が050である。その後、携帯電話と同じように4桁の数字、さらに4桁の数字が続く。
- 050-2222-2222
フリーダイヤルの場合は、先頭が0120である。その後、3桁の数字、さらに3桁の数字が続く。
- 0120-222-222
Javaにおける電話番号の正規表現
では、これらの電話番号の正規表現はどうなるかを見てみよう。電話番号と対応する正規表現は以下のようになる。固定電話は、市外局番と市内局番の形式が他にもあるが、ここではその中のふたつを取り上げた。
基本は次のような表記になる。
0\d{1,4}-\d{1,4}-\d{4}
電話番号の種類 |
電話番号 |
正規表現 |
固定電話 |
03-2222-2222 |
^0\d-\d{4}-\d{4}$ |
0422-22-2222 |
^0\d{3}-\d{2}-\d{4}$ |
|
(03)2222-2222 |
^\(0\d\)\d{4}-\d{4}$ |
|
(0422)22-2222 |
^\(0\d{3}\)\d{2}-\d{4}$ |
|
携帯電話 |
070-2222-2222 080-2222-2222 090-2222-2222 |
^(070|080|090)-\d{4}-\d{4}$ |
IP電話 |
050-2222-2222 |
^050-\d{4}-\d{4}$ |
フリーダイヤル |
0120-222-222 |
^0120-\d{3}-\d{3}$ |
各プログラミング言語における正規表現表記
この比較表は、Java以外のプログラミング言語で東京の固定電話番号の正規表現を扱うとどうなるかを示している。
電話番号 |
言語 |
正規表現 |
03-2222-2222 |
Java |
^0\d-\d{4}-\d{4}$ |
Ruby |
Javaと同じ |
|
PHP |
/^0\d-\d{4}-\d{4}$/ |
|
C/C++ |
Javaと同じ |
電話番号をチェックするサンプルプログラム
それでは実際にサンプルプログラムを確認してみよう。このサンプルプログラムでは、電話番号が形式に合致しているかどうか正規表現を使ってチェックしている。電話番号「03-2222-1111」については、番号が正しい場合だけでなく、誤った場合に不正な番号として検出されることも確認している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import java.util.regex.Pattern; import java.util.regex.Matcher; public class CheckTelephoneNumber { public static void main(String args[]) { checkRightTelephoneNumbers();//[1] checkWrongTelephoneNumbers();//[2] } private static void checkRightTelephoneNumbers() {//[3] System.out.println("[4] 正しい電話番号"); checkTelephoneNumberByRegularExpression("03-1111-2222");//[5] checkTelephoneNumberByRegularExpression("(03)3333-4444");//[6]; checkTelephoneNumberByRegularExpression("070-5555-6666");//[7] checkTelephoneNumberByRegularExpression("050-7777-8888");//[8] checkTelephoneNumberByRegularExpression("0120-222-222");//[9] } private static void checkWrongTelephoneNumbers() {//[10] System.out.println("[11] 誤った電話番号"); checkTelephoneNumberByRegularExpression("0-1111-2222");//[12] checkTelephoneNumberByRegularExpression("03-111-2222");//[13] checkTelephoneNumberByRegularExpression("03-1111-222");//[14] checkTelephoneNumberByRegularExpression("031-1111-2222");//[15] checkTelephoneNumberByRegularExpression("03-11111-2222");//[16] checkTelephoneNumberByRegularExpression("03-1111-22221");//[17] checkTelephoneNumberByRegularExpression("0X-1111-2222");//[18] checkTelephoneNumberByRegularExpression("03-111X-2222");//[19] checkTelephoneNumberByRegularExpression("03-1111-222X");//[20] checkTelephoneNumberByRegularExpression("03A1111-2222");//[21] checkTelephoneNumberByRegularExpression("03-1111A2222");//[22] } private static void checkTelephoneNumberByRegularExpression(String number) {//[30] boolean result;//[31] result = checkTelephoneNumber(number, "^0\\d-\\d{4}-\\d{4}$", "固定");//[32] if (result) return;;//[33] result = checkTelephoneNumber(number, "^\\(0\\d\\)\\d{4}-\\d{4}$", "固定");//[34] if (result) return;;//[35] result = checkTelephoneNumber(number, "^(070|080|090)-\\d{4}-\\d{4}$", "携帯");//[36] if (result) return;;//[37] result = checkTelephoneNumber(number, "^050-\\d{4}-\\d{4}$", "IP");//[38] if (result) return;;//[39] result = checkTelephoneNumber(number, "^0120-\\d{3}-\\d{3}$", "フリーダイアル");//[40] if (result) return;;//[41] System.out.println("[42] 不正な電話番号:" + number); } private static boolean checkTelephoneNumber(String number, String regularExpression, String type) {//[50] Pattern pattern = Pattern.compile(regularExpression);//[51] Matcher matcher = pattern.matcher(number);//[52] if (matcher.find()) {//[53] System.out.println("[54] " + type + "電話番号:" + matcher.group()); return true;//[55] } return false;//[56] } } |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[4] 正しい電話番号 [54] 固定電話番号:03-1111-2222 [54] 固定電話番号:(03)3333-4444 [54] 携帯電話番号:070-5555-6666 [54] IP電話番号:050-7777-8888 [54] フリーダイアル電話番号:0120-222-222 [11] 誤った電話番号 [42] 不正な電話番号:0-1111-2222 [42] 不正な電話番号:03-111-2222 [42] 不正な電話番号:03-1111-222 [42] 不正な電話番号:031-1111-2222 [42] 不正な電話番号:03-11111-2222 [42] 不正な電話番号:03-1111-22221 [42] 不正な電話番号:0X-1111-2222 [42] 不正な電話番号:03-111X-2222 [42] 不正な電話番号:03-1111-222X [42] 不正な電話番号:03A1111-2222 [42] 不正な電話番号:03-1111A2222 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
このサンプルプログラムでは、正しい形式の電話番号と誤った形式の電話番号をチェックして、正規表現によって正しくチェックが行われるかをテストしている。
テストに使用した正しい形式の電話番号は次の通りである。
電話番号の種類 |
電話番号 |
固定電話 |
03-2222-2222 |
(03)3333-4444 |
|
携帯電話 |
070-5555-6666 |
IP電話 |
050-7777-8888 |
フリーダイヤル |
0120-222-222 |
テストに使用した誤った形式の電話番号は次の通りである。
電話番号 |
不正な箇所 |
0-1111-2222 |
最初の2桁の桁数が不足 |
03-111-2222 |
2番目の4桁の桁数が不足 |
03-1111-222 |
最後の4桁の桁数が不足 |
031-1111-2222 |
最初の2桁の桁数が超過 |
03-11111-2222 |
2番目の4桁の桁数が超過 |
03-1111-22221 |
最後の4桁の桁数が超過 |
0X-1111-2222 |
最初の2桁の桁に数値以外の文字の混入 |
03-111X-2222 |
2番目の4桁の桁に数値以外の文字の混入 |
03-1111-222X |
最後の4桁の桁に数値以外の文字の混入 |
03A1111-2222 |
最初のハイフンがハイフン以外の文字 |
03-1111A2222 |
最後のハイフンがハイフン以外の文字 |
正しい形式ならば、電話番号の種類に加えて形式にマッチした電話番号を表示する。また、どの形式にもマッチしなかったならば、「不正な電話番号」として元の文字列をそのまま表示している。
まとめ
このページでは電話番号の正規表現の書き方をまとめてきた。Javaをメインとして他の言語でも、書き方を簡単にお伝えしている。
電話番号の正規表現を使うときには確認してみて欲しい。
固定電話が2桁とは正しい情報ですか?
参考URL:http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a.html
いつもご愛読いただきありがとうございます。
「固定電話の場合は、先頭が0である、その後市外局番と市内局番をあわせた5桁の数字、さらに4桁の加入者番号の数字が続く」という記述はありますが、ご指摘に該当する箇所はどの文章になりますでしょうか。
お手数ですがご教示いただけますと幸いです。