Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで1つの入力に対して複数の正規表現パターンをチェックする方法

Javaでユーザーの入力値を検証する際、「複数の正規表現パターンのいずれかに一致するかどうか」を確認したいケースはよくあります。例えば、電話番号として10桁の数字であるか、あるいは母音で始まる文字列であるかなど、複数の条件を同時に判定したい場合です。

本記事では、Javaで複数の正規表現パターンをチェックする2つの代表的な方法を、サンプルコードと実行結果とともにわかりやすく解説します。

方法1:「|」(OR)メタ文字を使う

Javaの正規表現におけるメタ文字「|」を使うと、複数の正規表現を1つのパターンにまとめることができます。「|」は「または(OR)」を意味し、左右のどちらかのパターンに一致すればマッチしたことになります。

記述形式は以下の通りです。各正規表現を「|」で区切って連結します。

exp1|exp2|exp3

サンプルコード

以下の例では、「10桁の数字」または「母音(a・e・i・o・u)で始まる文字列」という2つのパターンを1つの正規表現にまとめて、ユーザー入力を検証しています。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SampleExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter your input: ");
        String input = sc.nextLine();

        // 正規表現(10桁の数字 OR 母音で始まる文字列)
        String regex = "\\d{10}|^[aeiou]";

        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);

        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(input);

        if (matcher.find()) {
            System.out.println(input + " is valid");
        } else {
            System.out.println(input + " is not valid");
        }
    }
}

実行結果1

10桁の数字を入力した場合、最初のパターン「\d{10}」に一致するため有効と判定されます。

Enter your input:
9848033228
9848033228 is valid

実行結果2

母音「a」で始まる文字列を入力した場合も、2つ目のパターン「^[aeiou]」に一致するため有効と判定されます。

Enter your input:
an apple a day keeps doctor away
an apple a day keeps doctor away is valid

方法2:Listオブジェクトで複数のPatternを管理する

もう1つの方法は、正規表現ごとに個別のPatternオブジェクトを生成し、それらをListに格納して順番にマッチングを行うアプローチです。

この方法のメリットは、どのパターンに一致したのか(または一致しなかったのか)を個別に把握できる点です。「|」による結合では全体の合否しか分かりませんが、List方式なら各パターンごとの判定結果を出力できます。

基本的な流れは以下の通りです。

List<Pattern> list = new ArrayList<>();
list.add(Pattern.compile(regex1));
list.add(Pattern.compile(regex2));

for (Pattern pattern : list) {
    Matcher matcher = pattern.matcher(input);
    if (matcher.find()) {
        // 一致した場合の処理
    } else {
        // 一致しなかった場合の処理
    }
}

サンプルコード

以下の例では、2つの正規表現をそれぞれPatternオブジェクトとしてコンパイルし、リストに追加してループ処理で検証しています。pattern.pattern()メソッドを使うことで、どの正規表現に対する判定結果かも出力できます。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MultipleRegex {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter your input: ");
        String input = sc.nextLine();

        // 正規表現を2つ定義
        String regex1 = "\\d{10}";
        String regex2 = "^[aeiou]";

        // Patternオブジェクトを作成
        Pattern pattern1 = Pattern.compile(regex1);
        Pattern pattern2 = Pattern.compile(regex2);

        // Listオブジェクトに追加
        List<Pattern> patterns = new ArrayList<>();
        patterns.add(pattern1);
        patterns.add(pattern2);

        // 各パターンで順番にマッチング
        for (Pattern pattern : patterns) {
            Matcher matcher = pattern.matcher(input);
            if (matcher.find()) {
                System.out.println("For regex " + pattern.pattern() + " " + input + " is valid");
            } else {
                System.out.println("For regex " + pattern.pattern() + " " + input + " is not valid");
            }
        }
    }
}

実行結果1

10桁の数字を入力した場合、パターンごとの判定結果が個別に出力されます。

Enter your input:
9848033228
For regex \d{10} 9848033228 is valid
For regex ^[aeiou] 9848033228 is not valid

実行結果2

母音で始まる文字列の場合も、同様に各パターンの合否が明確に表示されます。

Enter your input:
an apple a day keeps doctor away
For regex \d{10} an apple a day keeps doctor away is not valid
For regex ^[aeiou] an apple a day keeps doctor away is valid

まとめ

Javaで複数の正規表現パターンをチェックするには、主に以下の2つの方法があります。

  • 「|」メタ文字を使う方法: 複数のパターンを1つの正規表現にまとめられるためシンプル。ただし、どのパターンに一致したかは分からない。
  • ListでPatternを管理する方法: パターンごとに個別の判定結果が得られるため、詳細な検証やログ出力が必要な場合に適している。

用途に応じて使い分けることで、柔軟かつ効率的な入力バリデーションを実装できます。

  1. Javaの正規表現でMM/DD/YYYY形式の日付を検証する方法

    Java の java.util.regex パッケージには、文字シーケンスの中から特定のパターンを見つけ出すためのさまざまなクラスが用意されています。 このパッケージの中心となる Pattern クラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行う際には、主に次の2つのメソッドを使用します。 compile() — 正規表現を表す文字列を受け取り、コンパイル済みの Pattern オブジェクトを返します。 matcher() — 検証対象の文字列を受け取り、現在の Pattern オブジェクトが表すパターンと照合するための Matcher オブジェクト

  2. Javaの正規表現を使って文字列からHTMLタグを抽出する方法

    Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのさまざまなクラスが用意されています。 このパッケージのPatternクラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行うために、次の2つのメソッドが提供されています。 compile() − 正規表現を表す文字列を引数として受け取り、Patternクラスのオブジェクトを返します。 matcher() − 対象となる文字列を受け取り、その文字列を現在のPatternオブジェクトが表すパターンと照合するためのMatcherオブジェクトを生成します。