Регулярные выражения: некоторые группы отсутствуют - PullRequest
3 голосов
/ 03 ноября 2011

У меня следующий код Java:

String s2 = "SUM   12  32 42";
Pattern pat1 = Pattern.compile("(PROD)|(SUM)(\\s+(\\d+))+");
Matcher m = pat1.matcher(s2);
System.out.println(m.matches());
System.out.println(m.groupCount());
for (int i = 1; i <=  m.groupCount(); ++i) {
        System.out.println(m.group(i));
}

, который производит:

true
4
null
SUM
 42
42

Интересно, что такое null и почему 12 и 32 отсутствуют (я ожидал найти их среди групп).

Ответы [ 3 ]

5 голосов
/ 03 ноября 2011

Повторная группа будет содержать совпадение подстроки last , совпадающей с выражением для группы.

Было бы хорошо, если бы механизм регулярных выражений возвращал all подстроки, которые соответствуют группе.К сожалению, это не поддерживается:

Более того, группы являются статическими и нумеруются следующим образом:

                    0
          _______________________
         /                       \
         (PROD)|(SUM)(\\s+(\\d+))+
         \____/ \___/|    \____/| 
           1      2  |       4  |
                      \________/ 
                           3  
4 голосов
/ 03 ноября 2011

Группа X из этой части вашего регулярного выражения:

(\\s+(\\d+))+
|          |
+----------+--> X

сначала будет соответствовать 12, затем 32 и, наконец, 42. Каждый раз значение X изменяется и заменяет предыдущее. Если вы хотите все значения, вам потребуется подход Pattern & Matcher.find():

String s = "SUM   12  32 42 PROD 1 2";
Matcher m = Pattern.compile("(PROD|SUM)((\\s+\\d+)+)").matcher(s);
while(m.find()) {
    System.out.println("Matched : " + m.group(1));
    Matcher values = Pattern.compile("\\d+").matcher(m.group(2));
    while(values.find()) {
        System.out.println("        : " + values.group());
    }
}

который напечатает:

Matched : SUM
        : 12
        : 32
        : 42
Matched : PROD
        : 1
        : 2

И вы видите напечатанный null, потому что в группе 1 есть PROD, который вам не соответствует.

0 голосов
/ 03 ноября 2011
I wonder what's a null

Группы захвата индексируются слева направо, начиная с единицы. Группа ноль обозначает весь шаблон, поэтому выражение m.group (0) эквивалентно m.group ().

http://download.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#group%28int%29

данная строка не соответствует всему шаблону.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...