java.util.regex.Matcher запутанная группа - PullRequest
1 голос
/ 19 апреля 2011

У меня проблемы с получением правильной группы для регулярных выражений. Мой код сводится к следующему:

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 ]

5 голосов
/ 19 апреля 2011

Группа (0) - это полное совпадение, а группа (1), группа (2), ... - это подгруппы, соответствующие регулярному выражению. Почему вы ожидаете, что «тест» будет содержаться в ваших группах? Вы не определили группу для соответствия тесту (ваше регулярное выражение содержит только группу \ d * _ \ d *).

2 голосов
/ 25 февраля 2014

на самом деле ваш цикл for должен ВКЛЮЧИТЬ groupCount (), используя "<<strong> = ":

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, совпадающую со всей строкой.

первая группа будет "test", как соответствует (\ w +), а

вторая группа будет "20110101_0000", как соответствует(\ d * _ \ d *)

2 голосов
/ 19 апреля 2011
  • group(0) должно соответствовать полному совпадению ("test_test_test_test_20110101_0000.xml");
  • group(1) должна быть единственной группой захвата в вашем регулярном выражении ("20110101_0000").

Это то, что я получаю. Я озадачен тем, почему вы получите другое значение для group(1).

2 голосов
/ 19 апреля 2011

Группа 0 - это весь матч. Реальные группы начинаются с 1, т. Е. Вам нужно это:

System.out.println(fileNameMatcher.group(i + 1)); 
...