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を管理する方法: パターンごとに個別の判定結果が得られるため、詳細な検証やログ出力が必要な場合に適している。
用途に応じて使い分けることで、柔軟かつ効率的な入力バリデーションを実装できます。
-
Javaの正規表現でMM/DD/YYYY形式の日付を検証する方法
Java の java.util.regex パッケージには、文字シーケンスの中から特定のパターンを見つけ出すためのさまざまなクラスが用意されています。 このパッケージの中心となる Pattern クラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行う際には、主に次の2つのメソッドを使用します。 compile() — 正規表現を表す文字列を受け取り、コンパイル済みの Pattern オブジェクトを返します。 matcher() — 検証対象の文字列を受け取り、現在の Pattern オブジェクトが表すパターンと照合するための Matcher オブジェクト
-
Javaの正規表現を使って文字列からHTMLタグを抽出する方法
Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのさまざまなクラスが用意されています。 このパッケージのPatternクラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行うために、次の2つのメソッドが提供されています。 compile() − 正規表現を表す文字列を引数として受け取り、Patternクラスのオブジェクトを返します。 matcher() − 対象となる文字列を受け取り、その文字列を現在のPatternオブジェクトが表すパターンと照合するためのMatcherオブジェクトを生成します。