В регулярном выражении Java с квантификаторами, как я могу получить соответствующие группы? - PullRequest
1 голос
/ 23 августа 2009

Я обрабатываю текст с помощью Java Regexes (1.6), которые содержат квантификаторы, и я хочу вернуть количество и значения соответствующих групп. Простой пример:

A BC DEF 1 23 456 7 XY Z

что соответствует:

([A-Z]+){0,9} (\d+){0,9} ([A-Z]+){0,9}

Как узнать номер каждого захвата (здесь 3 4 2) и значения («A», «BC», «DEF», «1», «23», «456», «7», "XY", "Z"). Регулярные выражения создаются вне программы, хотя я могу разработать их для решения этой проблемы, если это возможно.

Ответы [ 2 ]

3 голосов
/ 23 августа 2009

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

((?:[A-Z]+ ?){0,9}) ((?:\d+ ){0,9}) ((?:[A-Z]+ ?){0,9})

, который даст вам снимки "A BC DEF", "1 23 456 7" и "XY Z", которые вы затем можете разделить на пробелы.

1 голос
/ 23 августа 2009

Если вы используете количество в соответствующей группе, соответствующая группа будет возвращать только последнюю соответствующую. Под этим я подразумеваю:

String s = "a ab abc";
Pattern p = Pattern.compile("(\w+){3}");
Matcher m = p.matcher(s);
if (m.match()) {
  // m.group(1) will equal "abc";
}

Альтернатива в вашем случае - сделать что-то вроде этого:

String s = "A BC DEF 1 23 456 7 XY Z";
Pattern p = Pattern.comopile("([A-Z]+|\d+)");
Matcher m = p.matcher(s);
while (m.find()) {
  // print the group
}

Я понимаю, что не имеет такой же семантики, как ваше регулярное выражение (в порядке групп букв и чисел), но это начало. Вы можете реализовать такого рода проверки состояния самостоятельно, если хотите.

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