Java で文字列が電話番号形式に一致するかどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、正規表現 (Regex) を使用して Java で文字列が電話番号の形式に一致するかどうかを確認する方法を学びます。まず、一般的な電話番号の形式に一致するように特別に設計された Regex パターンを作成します。

その後、Java の Matcher クラスを使用して、作成した Regex パターンに対して与えられた電話番号の文字列を検証します。最後に、Regex パターンを調整することで、電話番号の形式のさまざまなバリエーションを処理し、一致させる方法を探ります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/StringManipulationGroup -.-> java/regex("RegEx") subgraph Lab Skills java/regex -.-> lab-559991{{"Java で文字列が電話番号形式に一致するかどうかをチェックする方法"}} end

電話番号の正規表現を作成する

このステップでは、正規表現 (Regex) について学び、電話番号に一致する正規表現を作成する方法を説明します。正規表現は、文字列内のパターンマッチングに使用される強力なツールです。テキストパターンを記述するための特別な言語のようなものです。

なぜ電話番号に正規表現が必要なのでしょうか?電話番号はさまざまな形式で表されます(例:123-456-7890(123) 456-7890123.456.7890)。正規表現を使用することで、これらすべてのバリエーションに一致するパターンを定義することができます。

正規表現を使用して文字列が電話番号のように見えるかどうかをチェックする簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルが開いていない場合は、開きます。

  2. ファイルの内容全体を次のコードに置き換えます。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String phoneNumber = "123-456-7890"; // チェックする文字列
            String regex = "\\d{3}-\\d{3}-\\d{4}"; // 正規表現パターン
    
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(phoneNumber);
    
            boolean isMatch = matcher.matches();
    
            if (isMatch) {
                System.out.println(phoneNumber + " is a valid phone number format.");
            } else {
                System.out.println(phoneNumber + " is not a valid phone number format.");
            }
        }
    }

    このコードの新しい部分を見てみましょう。

    • import java.util.regex.Matcher;import java.util.regex.Pattern;:これらの行は、Java で正規表現を扱うために必要なクラスをインポートします。
    • String phoneNumber = "123-456-7890";:これはテストしたい文字列です。
    • String regex = "\\d{3}-\\d{3}-\\d{4}";:これが最初の正規表現パターンです。分解して説明しましょう。
      • \\d:任意の数字 (0 - 9) に一致します。Java 文字列では \ が特殊文字なので、\\ としてエスケープする必要があります。
      • {3}:直前の要素を正確に 3 回一致させます。
      • -:ハイフン文字そのものに一致します。
      • したがって、\\d{3}-\\d{3}-\\d{4} は、3 桁の数字、ハイフン、3 桁の数字、ハイフン、4 桁の数字に一致します。
    • Pattern pattern = Pattern.compile(regex);:これは正規表現文字列を Pattern オブジェクトにコンパイルします。これにより、繰り返しのマッチングが効率的になります。
    • Matcher matcher = pattern.matcher(phoneNumber);:これは、コンパイルされた pattern を使用して phoneNumber 文字列に対してマッチング操作を行う Matcher オブジェクトを作成します。
    • boolean isMatch = matcher.matches();:これは、入力文字列 (phoneNumber) 全体をパターンに一致させようとします。文字列全体が一致する場合は true を返し、そうでない場合は false を返します。
    • ifelse ブロックは、文字列がパターンに一致したかどうかに基づいてメッセージを出力します。
  3. ファイルを保存します(Ctrl + S または Cmd + S)。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java

    エラーがなければ、HelloJava.class ファイルが作成されます。

  5. コンパイルされたプログラムを実行します。

    java HelloJava

    出力には、簡単な正規表現によると "123-456-7890" が有効な電話番号形式であることが表示されるはずです。

このステップでは、Java で正規表現を使用する基本を学び、特定の電話番号形式に一致する簡単なパターンを作成しました。次のステップでは、正規表現をより柔軟にして、さまざまな形式を扱えるようにします。

Matcher を使って電話番号を検証する

前のステップでは、簡単な正規表現パターンを作成し、Matcher クラスの matches() メソッドを使用して、文字列全体がパターンに一致するかどうかを確認しました。このステップでは、Matcher クラスをさらに詳しく調べ、その動作を見ていきます。

Matcher クラスは、マッチング操作を実行するエンジンです。Pattern オブジェクトから作成され、入力文字列内でパターンの出現を見つけるために使用されます。

プログラムを変更して、別の文字列をテストし、matches() メソッドの動作を確認しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. phoneNumber 文字列を、現在のパターン \\d{3}-\\d{3}-\\d{4} に完全に一致しないものに変更します。たとえば、次の行を

    String phoneNumber = "123-456-7890"; // チェックする文字列

    次のように変更します。

    String phoneNumber = "My phone number is 123-456-7890."; // チェックする文字列
  3. ファイルを保存します(Ctrl + S または Cmd + S)。

  4. ターミナルで変更したプログラムをコンパイルします。

    javac HelloJava.java
  5. コンパイルしたプログラムを実行します。

    java HelloJava

    今回は、次のような出力が表示されるはずです。

    My phone number is 123-456-7890. is not a valid phone number format.

    なぜこのような結果になったのでしょうか?matches() メソッドは、入力文字列全体をパターンに一致させようとするためです。入力文字列には電話番号のパターン以外のものも含まれているため、matches()false を返します。

    文字列内のどこかにパターンが存在するかどうかを見つけたい場合は、find() のような別のメソッドを使用します。これについては後で説明します。現時点では、matches() を使用して文字列全体が特定の形式に準拠しているかどうかを検証することに焦点を当てています。

    Java で正規表現を使用する際に、matches()find() の違いを理解することは非常に重要です。matches() は文字列全体の厳密な検証に使用され、find() はより大きな文字列内でパターンを検索するために使用されます。

このステップでは、Matcher クラスの matches() メソッドの動作を確認し、文字列形式を検証する際にその動作を理解することが重要である理由を学びました。

さまざまな電話番号形式を扱う

現実世界では、電話番号が常に XXX-XXX-XXXX 形式に従うわけではありません。ドット (.)、スペース ( )、または括弧 (()) を使用することもあります。このステップでは、これらのバリエーションの一部を扱えるように正規表現パターンを変更します。

パターンをより柔軟にするために、いくつかの正規表現の概念を導入します。

  • ?: 直前の要素をオプションにします(0 回または 1 回)。
  • *: 直前の要素を 0 回以上一致させます。
  • +: 直前の要素を 1 回以上一致させます。
  • []: 文字セットを定義します。括弧内の任意の単一文字に一致します。
  • |: OR 演算子として機能します。| の前または後のパターンのいずれかに一致します。

HelloJava.java ファイルを更新して、より柔軟な正規表現パターンを使用しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. regex 文字列を次のように変更します。

    String regex = "\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}"; // より柔軟な正規表現パターン

    この新しいパターンを分解してみましょう。

    • \\(?: オプションの開き括弧 ( に一致します。正規表現で ( は特殊な意味を持つため、\\ でエスケープする必要があり、? がオプションにします。
    • \\d{3}: 正確に 3 桁の数字に一致します。
    • \\)?: オプションの閉じ括弧 ) に一致します。
    • [-.\\s]?: これは文字セット [] で、ハイフン (-)、ドット (.)、または空白文字 (\\s) のいずれかに一致します。? がこの区切り文字をオプションにします。
    • \\d{3}: 正確に 3 桁の数字に一致します。
    • [-.\\s]?: 再度、オプションのハイフン、ドット、または空白の区切り文字に一致します。
    • \\d{4}: 正確に 4 桁の数字に一致します。

    このパターンは、123-456-7890(123) 456-7890123.456.7890123 456 7890、さらには 1234567890(区切り文字なし)のような形式に一致することができます。

  3. この新しいパターンをさまざまな電話番号形式でテストしましょう。phoneNumber 文字列をいくつかの異なる例に置き換えます。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String[] phoneNumbers = {
                "123-456-7890",
                "(123) 456-7890",
                "123.456.7890",
                "123 456 7890",
                "1234567890",
                "invalid-number", // これは一致しないはず
                "123-456-789" // これは一致しないはず
            };
    
            String regex = "\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}"; // より柔軟な正規表現パターン
    
            Pattern pattern = Pattern.compile(regex);
    
            for (String phoneNumber : phoneNumbers) {
                Matcher matcher = pattern.matcher(phoneNumber);
                boolean isMatch = matcher.matches();
    
                if (isMatch) {
                    System.out.println(phoneNumber + " is a valid phone number format.");
                } else {
                    System.out.println(phoneNumber + " is not a valid phone number format.");
                }
            }
        }
    }

    複数の入力を簡単にテストするために String 配列 phoneNumbers を導入し、それを繰り返し処理する for ループを追加しました。

  4. ファイルを保存します(Ctrl + S または Cmd + S)。

  5. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
  6. コンパイルしたプログラムを実行します。

    java HelloJava

    パターンに一致する文字列が表示される、次のような出力が表示されるはずです。

    123-456-7890 is a valid phone number format.
    (123) 456-7890 is a valid phone number format.
    123.456.7890 is a valid phone number format.
    123 456 7890 is a valid phone number format.
    1234567890 is a valid phone number format.
    invalid-number is not a valid phone number format.
    123-456-789 is not a valid phone number format.

これで、いくつかの一般的な電話番号形式を扱える、より堅牢な正規表現パターンを作成しました。これは、文字列の検証と解析における正規表現の強力さと柔軟性を示しています。

まとめ

この実験では、Java で正規表現 (Regular Expressions, Regex) を使用して、文字列が電話番号の形式に一致するかどうかをチェックする方法を学びました。まず、Regex の概念とパターンマッチングにおける重要性、特にさまざまな電話番号形式の扱いについて理解しました。その後、java.util.regex パッケージを利用した簡単な Java プログラムを作成しました。

最初のステップでは、形式 "XXX-XXX-XXXX" に一致する基本的な Regex パターン \\d{3}-\\d{3}-\\d{4} を作成しました。Pattern.compile() を使用して正規表現を Pattern オブジェクトにコンパイルし、Pattern.matcher() を使用して入力文字列に対する Matcher オブジェクトを作成しました。最後に、matcher.matches() を使用して文字列全体がパターンに一致するかどうかをチェックし、結果を出力しました。これにより、Java で Regex を使用した電話番号の検証の基礎が築かれました。