Javaの正規表現(RegEx)で式のn回の出現にマッチさせる方法
Java正規表現における量指定子(Quantifier)の基本
Javaの正規表現API(java.util.regex)が提供する貪欲な量指定子(greedy quantifiers)を利用すると、ある式が繰り返し出現するパターンに簡単にマッチさせることができます。主な量指定子は以下の3種類です。
- Exp{n} … 式 exp がちょうど n 回出現することを表します。
- Exp{n} … 式 exp が少なくとも n 回出現することを表します。
- Exp{n, m} … 式 exp が最低 n 回、最大 m 回出現することを表します。
以下では、これらの量指定子の使い方を3つの具体例で解説します。
例1:{n} で「ちょうどn回」の出現にマッチさせる
最初の例では、正規表現 \w{5} を使って「5文字の単語」を判定するプログラムを紹介します。キーボードから5つの文字列を入力し、それぞれが条件を満たすかどうかを出力します。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String args[]) {
// 5文字の単語を受け入れる正規表現
String regex = "\\w{5}";
Scanner sc = new Scanner(System.in);
System.out.println("Enter 5 input strings: ");
String input[] = new String[5];
for (int i = 0; i < 5; i++) {
input[i] = sc.nextLine();
}
// Patternオブジェクトの生成
Pattern p = Pattern.compile(regex);
for (int i = 0; i < 5; i++) {
// Matcherオブジェクトの生成
Matcher m = p.matcher(input[i]);
if (m.find()) {
System.out.println(input[i] + ": accepted");
} else {
System.out.println(input[i] + ": not accepted");
}
}
}
}ここでは find() メソッドを使っているため、文字列中のどこかに5文字連続した単語構成文字(英数字・アンダースコア)があればマッチとみなされます。4文字の「rama」「raja」は拒否され、5文字以上の「raghu」「megha」「malya」は受け入れられます。
実行結果
Enter 5 input strings: rama raja raghu megha malya rama: not accepted raja: not accepted raghu: accepted megha: accepted malya: accepted
例2:{n, m} で出現回数の範囲を指定する
次の例では、正規表現 \W{2,6} を使用します。\W は「単語構成文字以外」(記号や空白など)に対応するため、このパターンは「長さ2〜6の非単語文字の連続」にマッチします。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String args[]) {
// 長さ2〜6の非単語文字列にマッチする正規表現
String regex = "\\W{2,6}";
Scanner sc = new Scanner(System.in);
System.out.println("Enter 5 input strings: ");
String input[] = new String[5];
for (int i = 0; i < 5; i++) {
input[i] = sc.nextLine();
}
// Patternオブジェクトの生成
Pattern p = Pattern.compile(regex);
for (int i = 0; i < 5; i++) {
// Matcherオブジェクトの生成
Matcher m = p.matcher(input[i]);
if (m.find()) {
System.out.println(input[i] + " matched");
}
}
}
}英字だけで構成された文字列には \W に該当する文字が2つ以上連続して存在しないためマッチしませんが、記号を多く含む文字列はマッチ対象になります。
実行結果
Enter 5 input strings: hello how are you #$#% # #$@%%#&#& sample text #$#% matched #$@%%#&#& matched
例3:名前の入力チェックへの応用
最後の例は、正規表現 [a-zA-Z]{1,20} を使った実践的なバリデーションです。「1〜20文字のアルファベットのみ」で構成された名前かどうかを検証します。ここでは matches() メソッドを使用しており、これは文字列全体がパターンに一致する場合にのみ true を返す点に注意してください。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String args[]) {
String regex = "[a-zA-Z]{1,20}";
Scanner sc = new Scanner(System.in);
System.out.println("Enter students name:");
String name = sc.nextLine();
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(name);
if (m.matches()) {
System.out.println("Name is appropriate");
} else {
System.out.println("Name is inappropriate");
}
}
}入力された「Mouktika」は8文字すべてがアルファベットであるため、条件に適合する名前と判定されます。
実行結果
Enter students name: Mouktika Name is appropriate
まとめ
Javaの正規表現では、量指定子 {n}・{n}・{n, m} を使い分けることで、式の出現回数を柔軟に制御できます。さらに、find() が「部分一致」、matches() が「完全一致」を判定するという違いも理解しておくと、目的に応じた文字列検証を正確に実装できます。
-
Java正規表現(Regex)で固定文字セットにマッチさせる方法
Javaの正規表現における文字クラスを使うと、あらかじめ定義しておいた固定の文字集合の中から「任意の1文字」にマッチさせることができます。たとえば、次のように記述します。 [tmp]:t、m、p のいずれか1文字にマッチします。 [^tp]:t と p 以外の任意の1文字にマッチします(先頭に ^ を付けると否定を意味します)。 角括弧 [ ] 内に候補となる文字を列挙すると、入力文字列の各位置についてその中のどれか1つが存在すればマッチが成立します。この仕組みを利用すると、「特定の文字が文字列内に何回出現するか」を簡単に数えることができます。 例1:指定した文字の出現回数をカウントする
-
Java正規表現(RegEx)で任意の文字にマッチさせる方法
Javaの正規表現におけるメタ文字「.」(ドット)は、任意の1文字にマッチします。マッチ対象はアルファベットでも数字でも、記号などの特殊文字でも構いません。メタ文字「.」の基本「.」は改行文字以外のあらゆる単一文字と一致するため、パターンの柔軟性を高めたい場面で非常に便利です。なお、ドットそのもの(リテラルの「.」)にマッチさせたい場合は、バックスラッシュでエスケープして「\.」と記述します。例1:任意の1文字とのマッチ次のプログラムでは、ユーザーから入力された文字列に対して正規表現「.」を適用し、文字数をカウントしています。import java.util.Scanner; import j