Проблема получения вложенных групп в Regex
Учитывая следующий текст:
//[&][$][*]\n81723&8992%9892*2343%8734
Мне нужно получить:
1. &
2. $
3. *
4. 81723&8992%9892*2343%8734
Первая строка определяет разделители, которые разделяют числа во второй строке. Существует неопределенное количество разделителей.
Я сделал это регулярное выражение:
//(?:\[([^\]]+)\])+\n(.+)
Но только 2 группы получаются. Первый - последний разделитель, а второй - строка, содержащая числа. Я пытался, но я не мог получить все разделители. Я не очень хорош в регулярных выражениях, но я думаю, что первая группа перезаписывается на каждой итерации (?:[([^]]+)])+, И я не могу решить эту проблему.
Любая помощь?
С уважением
Виктор
4 ответа
Это не вложенная группа, с которой вы имеете дело, это повторная группа. И вы правы: когда группа захвата контролируется квантификатором, она обновляется на каждой итерации, поэтому конечное значение - это то, что было получено в последний раз.
То, что вы пытаетесь сделать, не возможно ни в каком аромате регулярных выражений, с которым я знаком.
Вот более полное объяснение: повторение захвата группы против захвата повторяющейся группы
Вы не можете написать что-то вроде (foo)+
и матч против "foofoofoo" и ожидаем получить три группы обратно. Вы получаете только один за открытый парен. Это означает, что вам нужно больше групп, которые вы написали.
Лучшее, что я вижу, что вы могли бы сделать (с помощью регулярных выражений), было бы что-то вроде этого:
(?:\[([^\]]+)\])?(?:\[([^\]]+)\])? #....etc....# \n(.+)
Следующее регулярное выражение работает для JavaScript:
(\[.+\])(\[.+\])(\[.+\])\\n(.*)
Это предполагает ваш &
$
*
будет иметь значения.