проблема подсчета групп с регулярным выражением - PullRequest
0 голосов
/ 16 ноября 2011

РЕДАКТИРОВАТЬ: RE в исходном коде не имеет значения (или что это имеет какой-то смысл). Допустим, вы соответствуете (X)|(Y): два шаблона, которые объединяются в RE с ИЛИ. Как узнать, какой шаблон был на самом деле соответствует ??

Я пытаюсь извлечь только текст, который соответствует RE в скобках.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, какая фактическая группа была сопоставлена, поскольку индекс группы не постоянен из-за ИЛИ.

Т.е. в строке, отмеченной XXX m.group(), возвращается весь шаблон

pat1
abcdef2

А m.group(1) производит

pat
null

А m.group(2) производит

null
de

И m.groupCount() - это просто общее количество групп в RE, поэтому оно бесполезно для индексации.

Я хочу, чтобы цикл печатался

pat
de

Жаль, что в java нет оператора m / perl, который будет извлекать материал и красиво помещать его в массив ;-)

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) throws IOException {

        Pattern p = Pattern.compile("([pat]+)1|abc([de]+)f2");
        String original = "  pat1 abcdef2555";

        Matcher m = p.matcher(original);
        boolean result = m.find();

        while (result) {
            System.out.println(m.group());        // XXX want to print only matched GROUP!!
            result = m.find();
        }

    }

}

1 Ответ

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

Я не вижу, чтобы Java поддерживала это напрямую.

(Perl имеет красивый синтаксис для этого, там вы можете использовать (?|([pat]+)1|abc([de]+)f2), и обе группы будут иметь одинаковое число, что, очевидно, не является проблемой, поскольку может быть только одна или другая.)

Итак, чтобы дать вам ответ на

Я хочу, чтобы цикл выводил на печать

погладить
де

Вы должны самостоятельно проверить, доступна группа или нет, поэтому этот цикл даст вам желаемый результат:

while (result) {
    if (m.group(1)!= null) System.out.println(m.group(1));
    if (m.group(2)!= null) System.out.println(m.group(2)); 
    result = m.find();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...