2

私はJava正規表現のチュートリアルをオンラインで学んでいて、1つの小さなプログラムについて混乱しました。

  // String to be scanned to find the pattern.
  String line = "This order was places 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) );
  } 

そして、印刷された結果は次のとおりです。

Found value: This order was places for QT3000! OK?

Found value: This order was places for QT300

Found value: 0

group(1)が上記の値を取得する理由がわかりませんか?「QT3000」の最後のゼロの前に停止するのはなぜですか?

どうもありがとうございます!

4

2 に答える 2

2

(.*)(これはインデックス1-インデックス0は全体的な正規表現です)の最初のグループは貪欲な一致です。全体的な表現を一致させながら、可能な限りキャプチャします。0したがって、文字列の2番目までかかる可能性があり0、一致するだけになり(\\d+)ます。異なる動作が必要な場合は、貪欲な一致と貪欲でない一致を確認するか、より適切なパターンを見つける必要があります。

于 2012-07-11T14:32:35.583 に答える
0

実際、グループ番号を間違えました。

グループ 0 は常に一致する文字列全体になります

グループ 1 は (.*) に一致します。これは、できるだけ多くの文字に一致するため、「貪欲」と呼ばれます (この場合、「この注文は QT300 の場所でした」)

グループ 2 は (\d+) の一致であり、これは正規表現に一致する可能性のある最小値です (この場合は「0」です)

グループ 3 (表示されませんでした) は最後 (.*) であり、"! OK" と一致する必要があります ("?" は特殊な正規表現文字であり、文字通りに一致させたい場合は先頭に \ を付けます)。

グループ 2 の 3000 と一致させたい場合は、次の正規表現を使用します。

String pattern = "(.*?)(\\d+)(.*)";
于 2012-07-11T14:38:49.073 に答える