【Java】正規表現の貪欲な数量詞(Greedy Quantifier)とは?最長一致の仕組みを解説
貪欲な数量詞(Greedy Quantifier)とは
貪欲な数量詞は、Javaの正規表現においてデフォルトで使用される数量詞です。貪欲な数量詞は、入力文字列に対してできるだけ多くの文字にマッチしようとする(最長一致)という特徴を持っています。もしマッチが成立しなかった場合は、末尾の1文字を手放して再度マッチを試みます。この「少しでも多く取ろうとする」動作から「貪欲(greedy)」という名前が付いています。
以下に、主な貪欲な数量詞の一覧を示します。
| 数量詞 | 説明 |
|---|---|
| re* | 0回以上の出現にマッチします。 |
| re? | 0回または1回の出現にマッチします。 |
| re+ | 1回以上の出現にマッチします。 |
| re{n} | ちょうどn回の出現にマッチします。 |
| re{n} | n回以上の出現にマッチします。 |
| re{n, m} | n回以上・m回以下の出現にマッチします。 |
なお、貪欲な数量詞には、できるだけ少なくマッチする「控えめな数量詞(Reluctant Quantifier:re*? など)」や、一度マッチしたらバックトラックしない「絶対的数量詞(Possessive Quantifier:re*+ など)」も存在します。用途に応じて使い分けることで、意図したパターンマッチングを実現できます。
サンプルコード
次のJavaプログラムでは、1桁以上の数字にマッチさせる正規表現「[0-9]+」を使用しています。入力文字列が「45545」の場合、「4」「45」「455」なども条件を満たしますが、貪欲な数量詞を使っているため、最も長い「45545」全体がマッチ結果となります。
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 = "[0-9]+";
// パターンオブジェクトを作成
Pattern pattern = Pattern.compile(regex);
// コンパイルしたパターンを文字列に適用
Matcher matcher = pattern.matcher(input);
System.out.println("Matched text: ");
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
実行結果
Enter input text:
45545
Matched text:
45545
このように、貪欲な数量詞は候補の中から最長の一致を選択して返すことが確認できます。逆に、最短一致をさせたい場合は「+?」のように数量詞の直後に「?」を付けた控えめな数量詞を使用してください。
-
Java正規表現のサブ式(?>re)――バックトラックしない独立パターンの解説
Javaの正規表現におけるサブ式・メタ文字「(?>re)」は、バックトラック(後戻り)を行わない独立したパターンを表します。これは「原子グループ(atomic group)」とも呼ばれ、一度マッチに成功すると、その結果を確定してそれ以降のマッチ処理で再評価されません。バックトラックとは?通常、正規表現エンジンはパターン全体がマッチするように、部分的なマッチ結果を巻き戻して別の組み合わせを試す「バックトラック」を行います。しかし「(?>re)」で囲まれた部分は独立して扱われるため、内部でのマッチが確定した後に外側のパターンとの整合性が取れない場合でも、巻き戻しによる再試行が行われませ
-
Javaの正規表現で文字列から数値を抽出する方法
Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。文字列からすべての数値を抽出するimport java.util.regex.Matcher; imp