Проблема получения вложенных групп в Regex - PullRequest
3 голосов
/ 27 августа 2011

С учетом следующего текста:

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

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

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

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

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

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

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

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

Привет

Victor

Ответы [ 4 ]

4 голосов
/ 27 августа 2011

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

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

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

1 голос
/ 27 августа 2011

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

1 голос
/ 27 августа 2011

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

(?:\[([^\]]+)\])?(?:\[([^\]]+)\])? #....etc....# \n(.+)
0 голосов
/ 27 августа 2011

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

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

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

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