はじめに
この実験では、正規表現 (Regex) を使用して Java で文字列が電話番号の形式に一致するかどうかを確認する方法を学びます。まず、一般的な電話番号の形式に一致するように特別に設計された Regex パターンを作成します。
その後、Java の Matcher クラスを使用して、作成した Regex パターンに対して与えられた電話番号の文字列を検証します。最後に、Regex パターンを調整することで、電話番号の形式のさまざまなバリエーションを処理し、一致させる方法を探ります。
電話番号の正規表現を作成する
このステップでは、正規表現 (Regex) について学び、電話番号に一致する正規表現を作成する方法を説明します。正規表現は、文字列内のパターンマッチングに使用される強力なツールです。テキストパターンを記述するための特別な言語のようなものです。
なぜ電話番号に正規表現が必要なのでしょうか?電話番号はさまざまな形式で表されます(例:123-456-7890、(123) 456-7890、123.456.7890)。正規表現を使用することで、これらすべてのバリエーションに一致するパターンを定義することができます。
正規表現を使用して文字列が電話番号のように見えるかどうかをチェックする簡単な Java プログラムを作成しましょう。
WebIDE エディタで
HelloJava.javaファイルが開いていない場合は、開きます。ファイルの内容全体を次のコードに置き換えます。
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を返します。ifとelseブロックは、文字列がパターンに一致したかどうかに基づいてメッセージを出力します。
ファイルを保存します(Ctrl + S または Cmd + S)。
ターミナルでプログラムをコンパイルします。
javac HelloJava.javaエラーがなければ、
HelloJava.classファイルが作成されます。コンパイルされたプログラムを実行します。
java HelloJava出力には、簡単な正規表現によると "123-456-7890" が有効な電話番号形式であることが表示されるはずです。
このステップでは、Java で正規表現を使用する基本を学び、特定の電話番号形式に一致する簡単なパターンを作成しました。次のステップでは、正規表現をより柔軟にして、さまざまな形式を扱えるようにします。
Matcher を使用して電話番号を検証する
前のステップでは、簡単な正規表現パターンを作成し、Matcher クラスの matches() メソッドを使用して、文字列全体がパターンに一致するかどうかを確認しました。このステップでは、Matcher クラスをさらに詳しく調べ、その動作を見ていきます。
Matcher クラスは、マッチング操作を実行するエンジンです。Pattern オブジェクトから作成され、入力文字列内でパターンの出現を見つけるために使用されます。
プログラムを変更して、別の文字列をテストし、matches() メソッドの動作を確認しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。phoneNumber文字列を、現在のパターン\\d{3}-\\d{3}-\\d{4}に完全に一致しないものに変更します。たとえば、次の行をString phoneNumber = "123-456-7890"; // チェックする文字列次のように変更します。
String phoneNumber = "My phone number is 123-456-7890."; // チェックする文字列ファイルを保存します(Ctrl + S または Cmd + S)。
ターミナルで変更したプログラムをコンパイルします。
javac HelloJava.javaコンパイルしたプログラムを実行します。
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 ファイルを更新して、より柔軟な正規表現パターンを使用しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。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-7890、123.456.7890、123 456 7890、さらには1234567890(区切り文字なし)のような形式に一致することができます。この新しいパターンをさまざまな電話番号形式でテストしましょう。
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ループを追加しました。ファイルを保存します(Ctrl + S または Cmd + S)。
ターミナルでプログラムをコンパイルします。
javac HelloJava.javaコンパイルしたプログラムを実行します。
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 を使用した電話番号の検証の基礎が築かれました。



