Проблема получения вложенных групп в Regex

Учитывая следующий текст:

//[&][$][*]\n81723&8992%9892*2343%8734

Мне нужно получить:

1. &
2. $
3. *
4. 81723&8992%9892*2343%8734

Первая строка определяет разделители, которые разделяют числа во второй строке. Существует неопределенное количество разделителей.

Я сделал это регулярное выражение:

//(?:\[([^\]]+)\])+\n(.+)

Но только 2 группы получаются. Первый - последний разделитель, а второй - строка, содержащая числа. Я пытался, но я не мог получить все разделители. Я не очень хорош в регулярных выражениях, но я думаю, что первая группа перезаписывается на каждой итерации (?:[([^]]+)])+, И я не могу решить эту проблему.

Любая помощь?

С уважением

Виктор

4 ответа

Решение

Это не вложенная группа, с которой вы имеете дело, это повторная группа. И вы правы: когда группа захвата контролируется квантификатором, она обновляется на каждой итерации, поэтому конечное значение - это то, что было получено в последний раз.

То, что вы пытаетесь сделать, не возможно ни в каком аромате регулярных выражений, с которым я знаком.

Вот более полное объяснение: повторение захвата группы против захвата повторяющейся группы

Вы не можете написать что-то вроде (foo)+ и матч против "foofoofoo" и ожидаем получить три группы обратно. Вы получаете только один за открытый парен. Это означает, что вам нужно больше групп, которые вы написали.

Лучшее, что я вижу, что вы могли бы сделать (с помощью регулярных выражений), было бы что-то вроде этого:

(?:\[([^\]]+)\])?(?:\[([^\]]+)\])? #....etc....# \n(.+)

Следующее регулярное выражение работает для JavaScript:

(\[.+\])(\[.+\])(\[.+\])\\n(.*)

Это предполагает ваш &$* будет иметь значения.

Другие вопросы по тегам