1. ホーム
  2. java

[解決済み] Java Regex Capturing Groups

2022-04-21 02:38:38

質問

私はこのコードブロックを理解しようとしています。最初のものでは、式で何を探しているのでしょうか?

私の理解では、任意の文字(0回以上*)の後に0から9までの任意の数字(1回以上+)が続き、その後に任意の文字(0回以上*)が続くということです。

これを実行すると、結果は

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

どなたか一緒に見ていただけませんか?

Capturingグループを使用する利点は何ですか?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTut3 {

    public static void main(String args[]) {
        String line = "This order was placed for QT3000! OK?"; 
        String pattern = "(.*)(\\d+)(.*)";

        // Create a Pattern object
        Pattern r = Pattern.compile(pattern);

        // Now create matcher object.
        Matcher m = r.matcher(line);

        if (m.find()) {
            System.out.println("Found value: " + m.group(0));
            System.out.println("Found value: " + m.group(1));
            System.out.println("Found value: " + m.group(2));
        } else {
            System.out.println("NO MATCH");
        }
    }

}

解決方法は?

あなたが抱えている問題は、量詞の種類にあります。あなたが使っているのは 欲張り の量詞は、最初のグループ(インデックス 1 - インデックス0は全体を表す Pattern であるため)、できる限り一致させるということです。 任意の 文字にマッチします。 何文字でも の条件を満たすように、次のグループの条件を満たすように)。

要するに、第1グループ .* が次のグループである限り、何でもマッチします。 \\d+ は何か(この場合は最後の桁)にマッチすることができます。

3番目のグループのように、最後の一桁以降にマッチします。

に変更すると 渋い の量詞を1番目のグループに入れると、あなたが期待しているような結果、すなわち 3000 の部分です。

に注意してください。 クエスチョンマーク を1グループ目にしています。

String line = "This order was placed for QT3000! OK?";
Pattern pattern = Pattern.compile("(.*?)(\\d+)(.*)");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
    System.out.println("group 1: " + matcher.group(1));
    System.out.println("group 2: " + matcher.group(2));
    System.out.println("group 3: " + matcher.group(3));
}

出力します。

group 1: This order was placed for QT
group 2: 3000
group 3: ! OK?

Javaに関する詳細情報 Pattern こちら .

最後に、キャプチャグループは丸括弧で区切られ、後方参照を使用するのに非常に便利な方法です。 Pattern を入力にマッチングさせる。

Java 6ではグループは順番でしか参照できません(ネストしたグループと微妙な順番に注意)。

Java 7では、名前付きグループを使えるので、もっと簡単です。