1. 概要

場合によっては、テキストを検証して、そのコンテンツが何らかの形式に準拠していることを確認する必要があります。 このクイックチュートリアルでは、正規表現を使用してさまざまな形式の電話番号を検証する方法を説明します。

2. 電話番号を検証するための正規表現

2.1. 10桁の数字

数字が10桁で他に何もないかどうかをチェックする簡単な式から始めましょう

@Test
public void whenMatchesTenDigitsNumber_thenCorrect() {
    Pattern pattern = Pattern.compile("^\\d{10}$");
    Matcher matcher = pattern.matcher("2055550125");
    assertTrue(matcher.matches());
}

この式では、2055550125のような数値を使用できます。

2.2. 空白、ドット、またはハイフンを含む番号

2番目の例では、数字の間にオプションの空白、ドット、またはハイフン(-)許可する方法を見てみましょう。

@Test
public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() {
    Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
    Matcher matcher = pattern.matcher("202 555 0125");
    assertTrue(matcher.matches());
}

この追加の目標(オプションの空白またはハイフン)を達成するために、文字を追加しただけです。

  • [-。]?

このパターンでは、 2055550125 202 555 0125 202.555.0125 202-555-0125などの番号を使用できます。

2.3. 括弧付きの番号

次に、電話の最初の部分を括弧の間に置く可能性を追加しましょう。

@Test
public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
    Pattern pattern = Pattern.compile"^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
    Matcher matcher = pattern.matcher("(202) 555-0125");
    assertTrue(matcher.matches());
}

数値にオプションの括弧を使用できるようにするために、正規表現に次の文字を追加しました。

  • (\\(\\ d {3} \\))| \\ d {3})

この式では、(202)5550125 (202)555-0125 (202)-555-0125などの数値を使用できます。 さらに、この式では、前の例で説明した電話番号も使用できます。

2.4. 国際プレフィックス付きの番号

最後に、電話番号の先頭に国際プレフィックスを許可する方法を見てみましょう。

@Test
public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
  Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
  Matcher matcher = pattern.matcher("+111 (202) 555-0125");
  
  assertTrue(matcher.matches());
}

番号のプレフィックスを許可するために、パターンの先頭に文字を追加しました。

  • (\\ + \\ d {1,3}()?)?

この式により、国際プレフィックスは通常最大3桁の番号であることを考慮して、電話番号に国際プレフィックスを含めることができます。

3. 複数の正規表現の適用

これまで見てきたように、有効な電話番号はいくつかの異なる形式を取ることができます。 したがって、Stringがこれらの形式のいずれかに準拠しているかどうかを確認する必要があります。

前のセクションでは、単純な式から始めて、複数の形式をカバーするという目標を達成するために、より複雑なものを追加しました。 ただし、1つの式だけを使用できない場合があります。 このセクションでは、複数の正規表現を1つの正規表現に結合する方法について説明します。

カバーしたいすべての可能なケースを検証できる共通の正規表現を作成できない場合は、ケースごとに異なる式を定義し、パイプ記号(|)で連結してそれらをすべて一緒に使用できます。

次の式を使用する例を見てみましょう。

  • 前のセクションで使用された式:
    • ^(\\ + \\ d {1,3}()?)?((\\(\\ d {3} \\))| \\ d {3})[-。]?\\ d { 3} [-。]?\\ d {4} $
  • +111 123 456 789:のような数値を許可する正規表現
    • ^(\\ + \\ d {1,3}()?)?(\\ d {3} []?){2} \\ d {3} $
  • +111 123 45 67 89:のような数字を許可するパターン
    • ^(\\ + \\ d {1,3}()?)?(\\ d {3} []?)(\\ d {2} []?){2} \\ d {2} $
@Test
public void whenMatchesPhoneNumber_thenCorrect() {
    String patterns 
      = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$" 
      + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" 
      + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";

    String[] validPhoneNumbers 
      = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", 
      "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};

    Pattern pattern = Pattern.compile(patterns);
    for(String phoneNumber : validPhoneNumbers) {
        Matcher matcher = pattern.matcher(phoneNumber);
        assertTrue(matcher.matches());
    }
}

上記の例でわかるように、パイプシンボルを使用すると、3つの式を一度に使用できるため、1つの正規表現よりも多くのケースをカバーできます。

4. 結論

この記事では、さまざまな正規表現を使用して、Stringに有効な電話番号が含まれているかどうかを確認する方法を説明しました。 また、複数の正規表現を同時に使用する方法も学びました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。