Как захватить группу в следующую первую группу? - PullRequest
0 голосов
/ 12 апреля 2019

Есть строка:

Станция: C1, C2, C3, C4, C5, команда: C5TQ5, C3TQ1, C5TQ1, тест: значение, ...

Когда я получутретью группу я хочу получить до первой следующей группы.

Мой регулярное выражение:

/(\w+?)(:)(.*)/g

Я ожидаю:

станция (группа1)
: (группа2)
C1, C2, C3, C4, C5 (группа 3)

команда (группа 1)
: (группа 2)
C5TQ5, C3TQ1, C5TQ1 (группа 3)

тест (группа1)
: (группа2)
значение (группа3)

и т. д.

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Если я правильно вас понимаю, вы ищете регулярное выражение типа (\w+)(:)(\w+(,(?![^,]+:)\w+)*), где

  1. (\w+) ставит «ключ» в группу 1
  2. (:) помещает двоеточие в группу 2
  3. ((\w+)(,(?![^,]+:)\w+)*) помещает в группу 3 одно буквенно-цифровое слово \w+, за которым может следовать ноль или более слов, разделенных запятой.

Демо-версия:

String data = "station:C1,C2,C3,C4,C5,team:C5TQ5,C3TQ1,C5TQ1,test:value";

Pattern p = Pattern.compile("(\\w+)(:)(\\w+(,(?![^,]+:)\\w+)*)");
Matcher m = p.matcher(data);
while (m.find()){
    System.out.println(m.group(1));
    System.out.println(m.group(2));
    System.out.println(m.group(3));
    System.out.println("===");
}

Выход:

station
:
C1,C2,C3,C4,C5
===
team
:
C5TQ5,C3TQ1,C5TQ1
===
test
:
value
===
1 голос
/ 13 апреля 2019

Вы можете попробовать это:

(\w+)(:)(.*?)(?=,\w+:|,?$)

Это дает положительный прогноз, пока не будет найдена следующая группа или не будет достигнут конец строки.

Результат будет таким:

result

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