Определение группы соответствия шаблону Java - PullRequest
5 голосов
/ 13 июня 2011

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

([a-z]*)( +[a-z]="[0-9]")*

, и оно работает в соответствующих шаблонах, таких как

test a="1" b="2" c="3"...

Есть ли способ захвата каждого имени-значенияпары (например, a = "1") в отдельной группе соответствия?

Как и в приведенном выше примере, я получаю группу соответствия для (test) и только одну группу соответствия для 3 name-valueпары (т. е. последняя, ​​c = "3").Я ожидал бы 3 группы совпадений, 1 для каждой такой пары.

Ответы [ 3 ]

8 голосов
/ 13 июня 2011

Используйте метод Matcher#find() для переключения на следующую группу.

Делайте это в цикле, например:

Matcher matcher = pattern.matcher(test);
while (matcher.find()) {
    //extract groups here
}
8 голосов
/ 13 июня 2011

Я ожидал бы 3 группы совпадений, по 1 на каждую такую ​​пару.

Нет, это всего две группы. Единственный способ получить пары ключ-значение в трех группах - это:

([a-z]*)( +[a-z]="[0-9]")( +[a-z]="[0-9]")( +[a-z]="[0-9]")

Вы можете сопоставить все пары значений ключа в одной группе, а затем использовать для нее отдельный Pattern & Matcher:

import java.util.regex.*;

public class Main {
  public static void main(String[] args) throws Exception {

    String text = "test a=\"1\" b=\"2\" c=\"3\" bar d=\"4\" e=\"5\"";
    System.out.println(text + "\n");

    Matcher m1 = Pattern.compile("([a-z]*)((?:[ \t]+[a-z]=\"[0-9]\")*)").matcher(text);

    while(m1.find()) {

      System.out.println(m1.group(1));

      Matcher m2 = Pattern.compile("([a-z])=\"([0-9])\"").matcher(m1.group(2));

      while (m2.find()) {
        System.out.println("  " + m2.group(1) + " -> " + m2.group(2));
      }
    }
  }
}

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

test a="1" b="2" c="3" bar d="4" e="5"

test
  a -> 1
  b -> 2
  c -> 3

bar
  d -> 4
  e -> 5
2 голосов
/ 13 июня 2011

Не то, что я знаю. Но если вы соответствуете \s+\w="\d", то вы можете вызвать find несколько раз и обработать каждое совпадение самостоятельно.

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