1

正規表現の一致の適切なグループを取得するのに問題があります。私のコードは次のように要約されます。

Pattern fileNamePattern = Pattern.compile("\\w+_\\w+_\\w+_(\\w+)_(\\d*_\\d*)\\.xml");
Matcher fileNameMatcher = fileNamePattern.matcher("test_test_test_test_20110101_0000.xml");

System.out.println(fileNameMatcher.groupCount());

if (fileNameMatcher.matches()) {
    for (int i = 0; i < fileNameMatcher.groupCount(); ++i) {
        System.out.println(fileNameMatcher.group(i));
    }
}

出力は次のようになると思います。

2
test
20110101_0000

ただし、その:

2
test_test_test_test_20110101_0000.xml
test

誰か説明がありますか?

4

4 に答える 4

6

Group(0)は完全一致であり、group(1)、group(2)、...は正規表現によって一致するサブグループです。
なぜ「テスト」があなたのグループに含まれることを期待するのですか?テストに一致するグループを定義していません(正規表現にはグループ\ d * _ \ d *のみが含まれています)。

于 2011-04-19T13:04:05.377 に答える
2

グループ0は完全一致です。実際のグループは1で始まります。つまり、これが必要です。

System.out.println(fileNameMatcher.group(i + 1)); 
于 2011-04-19T13:01:29.753 に答える
2
  • group(0)完全に一致する必要があります( "test_test_test_test_20110101_0000.xml");
  • group(1)正規表現( "20110101_0000")の唯一のキャプチャグループである必要があります。

これが私が得ているものです。なぜあなたが異なる値を取得するのかについて私は困惑していますgroup(1)

于 2011-04-19T13:02:31.443 に答える
2

実際には、forループは "< = "を使用してgroupCount()を含める必要があります:

for (int i = 0; i <= fileNameMatcher.groupCount(); ++i) {
    System.out.println(fileNameMatcher.group(i));
}

したがって、出力は次のようになります。

2
test_test_test_test_20110101_0000.xml
test
20110101_0000

groupCount()は、文字列全体に一致するグループ0をカウントしません。

最初のグループは、(\ w +)と一致する「テスト」になります

2番目のグループは(\ d * _ \ d *)と一致する「20110101_0000」になります

于 2014-02-24T20:23:33.373 に答える