Захват Java регулярных выражений не работает - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть регулярное выражение:

l:([0-9]+)

Это должно соответствовать этой строке и возвращать три захвата (согласно Rubular )

"l:32, l:98, l:234"

Вот мойкод:

Pattern p ...
Matcher m = p.matcher(...);
m.find();
System.out.println(m.groupCount());

Это выводит 1 (группу), когда их три, поэтому я могу сделать только m.group(1), который вернет только 32.

Ответы [ 4 ]

3 голосов
/ 18 ноября 2011

Вызов Matcher.find находит следующий экземпляр совпадения или возвращает false, если их больше нет.Попробуйте позвонить ему три раза и посмотрите, есть ли у вас все ожидаемые группы.

Чтобы уточнить, m.group(1) пытается найти первое выражение группы в вашем регулярном выражении .У вас есть только одно такое групповое выражение в вашем регулярном выражении, поэтому group(2) никогда не будет иметь смысла.Вам, вероятно, нужно вызывать m.find() в цикле, пока он не вернет false, захватывая групповой результат на каждой итерации.

1 голос
/ 18 ноября 2011

Если формат входной строки фиксирован, вы можете использовать следующее регулярное выражение

"l:32, l:98, l:234".split("(, )?l:")

Выход

[, 32, 98, 234]
1 голос
/ 18 ноября 2011

Matcher.find() возвращает false, если совпадений больше нет, поэтому вы можете выполнить while loop, получая и обрабатывая каждое group.Например, если вы хотите распечатать все совпадения, вы можете использовать следующее:

    Matcher m;
    Pattern p = Pattern.compile("l:([0-9]+)");
    m = p.matcher("l:32, l:98, l:1234");

    while (m.find()) {
        System.out.println(m.group());
    }
1 голос
/ 18 ноября 2011

Я думаю, что это должно быть

Pattern p ...
Matcher m = p.matcher(...);
int count = 0;

while(m.find()) {
    count++;
}
System.out.println(count);

find ищет следующее совпадение, поэтому использование цикла while найдет все совпадения.

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