java - поиск - Регулярное выражение с переменным числом групп?



регулярные выражения java слово (4)

Можно ли создать регулярное выражение с переменным числом групп?

После запуска этого, например ...

Pattern p = Pattern.compile("ab([cd])*ef");
Matcher m = p.matcher("abcddcef");
m.matches();

... Я хотел бы иметь что-то вроде

  • m.group(1) = "c"
  • m.group(2) = "d"
  • m.group(3) = "d"
  • m.group(4) = "c" .

(Предыстория: я разбираю некоторые строки данных, и одно из «полей» повторяется. Я хотел бы избежать цикла matcher.find для этих полей.)

Как отметил @Tim Pietzcker в комментариях, perl6 и .NET имеют эту функцию.

https://src-bin.com



Answer #2

Согласно documentation , регулярные выражения Java не могут это сделать:

Захваченный вход, связанный с группой, всегда является подпоследовательностью, которую группа недавно сопоставила. Если группа оценивается второй раз из-за количественной оценки, то ее ранее зафиксированное значение, если оно есть, будет сохранено, если вторая оценка не удалась. Согласование строки «aba» с выражением (a (b)?) +, Например, оставляет группу 2, установленную в «b». Весь захваченный вход отбрасывается в начале каждого матча.

(выделено мной)


Answer #3

Я бы подумал, что откат тормозит это поведение и говорит о влиянии /([\S\s])/ в его накопительном состоянии группировки на нечто вроде Библии. Даже если это можно сделать, вывод непознаваем, поскольку группы потеряют позиционное значение. Лучше сделать отдельное регулярное выражение на подобном виде в глобальном смысле и внести его в массив.


Answer #4

Я не использовал java regex, но для многих языков ответ: Нет.

Группы захвата, кажется, создаются, когда регулярное выражение анализируется и заполняется, когда оно соответствует строке. Выражение (a)|(b)(c) имеет три группы захвата, только если один или два из них могут быть заполнены. (a)* имеет только одну группу, парсер покидает последний матч в группе после сопоставления.





regex