Java正規表現の論理演算子とは?XY・X|Y・キャプチャグループの使い方を解説
Javaの正規表現では、複数の条件を組み合わせるための論理演算子が3種類用意されています。それぞれの書き方と動作を、実際に実行できるサンプルコードとともに見ていきましょう。
- XY:Xの直後にYが続く場合に一致(連結)
- X|Y:XまたはYのいずれかに一致(選択)
- (X):キャプチャグループ。複数の文字を1つの単位として扱う
XY:Xの後にYが続くパターン
これは最も基本的な形式で、2つの文字が連続して出現する箇所に一致します。例えば「am」という正規表現は、入力文字列の中に「a」の直後に「m」が続く部分があるかどうかを判定します。
サンプルコード
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "am";
// Patternオブジェクトを作成
Pattern pattern = Pattern.compile(regex);
// 文字列に対してコンパイル済みパターンを適用
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("Match occurred");
} else {
System.out.println("Match not occurred");
}
}
}実行結果1(一致する場合)
Enter input text:
sample text
Match occurred「sample text」という入力には「am」が含まれているため、「Match occurred(一致あり)」と表示されます。
実行結果2(一致しない場合)
Enter input text:
hello how are you
Match not occurred一方、「hello how are you」には「am」が含まれていないため、「Match not occurred(一致なし)」となります。
X|Y:XまたはYのいずれかに一致
「|」(パイプ)で区切られた2つの式または文字のうち、どちらかに一致すればマッチします。「AまたはB」という選択条件を表現したいときに使用します。
サンプルコード
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String args[]) {
String regex = "Hello|welcome";
String input = "Hello how are you welcome to Tutorialspoint";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("Number of matches: " + count);
}
}実行結果
Number of matches: 2この例では「Hello」と「welcome」のどちらかに一致する箇所をカウントしています。入力文字列には両方が1回ずつ含まれているため、合計2件の一致が検出されました。
(X):キャプチャグループ
キャプチャグループを使うと、複数の文字を1つの単位として扱えます。グループ化したい文字を丸括弧 () で囲むだけで作成でき、マッチ後は group() メソッドで各グループに対応する部分文字列を取り出せます。
group(0):マッチした文字列全体group(1):1番目の括弧に対応する部分group(2):2番目の括弧に対応する部分(以降も同様)
サンプルコード
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CapturingGroups {
public static void main(String args[]) {
System.out.println("Enter input text");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "(.*)(\\d+)(.*)";
// Patternオブジェクトを作成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトを作成
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("Found value: " + matcher.group(0));
System.out.println("Found value: " + matcher.group(1));
System.out.println("Found value: " + matcher.group(2));
System.out.println("Found value: " + matcher.group(3));
} else {
System.out.println("NO MATCH");
}
}
}実行結果
Enter input text
sample data with 1234 (digits) in middle
Found value: sample data with 1234 (digits) in middle
Found value: sample data with 123
Found value: 4
Found value: (digits) in middleこの正規表現 (.*)(\d+)(.*) は、「任意の文字列」「1つ以上の数字」「任意の文字列」という3つのグループに分けてマッチを行います。なお .* は貪欲マッチ(できるだけ長く一致しようとする性質)を持つため、最初のグループが「sample data with 123」まで伸び、数字部分は最後の1桁「4」だけが group(2) に残ります。group(0) にはマッチ全体が格納される点にも注意してください。
まとめ
| 演算子 | 意味 |
|---|---|
| XY | Xの直後にYが続く場合に一致 |
| X|Y | XまたはYのいずれかに一致 |
| (X) | 複数の文字を1つの単位(グループ)として扱い、後から参照できる |
これらの論理演算子を組み合わせることで、より柔軟で強力なパターンマッチングを実現できます。ぜひ実際にコードを動かしながら、それぞれの挙動の違いを確かめてみてください。
-
Javaの正規表現におけるサブ式(グループ化)の使い方
Javaの正規表現において、サブ式(メタ文字)( )は、複数の正規表現をひとつのグループにまとめ、マッチしたテキストを記憶する働きを持ちます。グループ化を活用すると、選択(|)の適用範囲を限定したり、マッチした一部分の文字列を後から取り出したりできるようになります。 例1:基本的なグループ化 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Example { public static void main(String args[]) { String input =
-
Javaの正規表現で文字列から数値を抽出する方法
Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。文字列からすべての数値を抽出するimport java.util.regex.Matcher; imp