Java正規表現の非キャプチャグループとは?キャプチャグループとの違いと使い方を解説
Javaの正規表現では、キャプチャグループ(capturing group)を使うことで、複数の文字をひとつのまとまり(ユニット)として扱うことができます。グループ化したい文字列は、括弧 () の中に記述するだけです。
例えば、次のようなパターンを見てみましょう。
(.*)(\d+)(.*)
このように複数のグループを含むパターンでマッチングを行うと、各グループのマッチ結果が個別に記録されます。結果を取得するには、group() メソッドにグループ番号(1、2、3…)を渡します。なお、グループ0 はマッチした文字列全体を表します。
キャプチャグループの使用例
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
非キャプチャグループとは
非キャプチャグループ(non-capturing group)は、キャプチャグループと同じ機能を持ちながら、マッチ結果を記録しないという点が異なります。
例えば、テキストからURLや電話番号などを抽出する場合、目的の部分文字列の先頭部分が共通していることがあります。このようなケースでは、一部のグループの結果を取得する必要がないため、非キャプチャグループを使うのが有効です。
非キャプチャグループは (?: で始まり、) で終わる形式で記述します。
使用例
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));
} 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: (digits) in middle
上記の出力を見ると、数字部分 \d+ を非キャプチャグループ (?:\d+) に変更したことで、そのマッチ結果が記録されず、後続のグループ番号がひとつずつ前倒しになっていることが分かります。
注意: 非キャプチャグループはグループ番号のカウント対象に含まれません。つまり、group() メソッドで参照することはできません。
-
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