Именованные группы в рекурсивном шаблоне Match - PullRequest
1 голос
/ 25 ноября 2011

Я сопоставляюсь с LaTeX-командами вида \ command {...} {...}. Второй аргумент является необязательным. Мой RegEx - только слегка модифицированная версия одного примера в perl6 faq , потому что мне нужно позаботиться о том, чтобы внутри аргументов могли быть вложенные команды LaTeX.

Я хочу использовать именованные группы. Как я могу это сделать? Я пытался использовать (? : ...) вместе с (? & First), но это дает мне ошибку "бесконечной рекурсии". Я мог бы быть немного над головой с точки зрения RegExes здесь, но это работало очень хорошо до сих пор.

my $regex = qr/
          \\command
            (\{
              (?:
                [^\{\}]++
                  |
                (?1)
              )*
            \})
           (\{
              (?:
                [^\{\}]++
                  |
                (?2)
              )*
           \})?
        /x;

$s =~ m/$regex/g

1 Ответ

0 голосов
/ 25 ноября 2011

Вы должны иметь возможность использовать именованные группы, такие как s/(?<first>foo+)/\k<first>bar/ или s/(?first:foo+)/\g{first}bar/, но (?<first>:...) рассматривает : как часть шаблона.

Я не уверен, почему ваши (?PARNO) выражения вызывают бесконечную рекурсию, но у manual есть дополнительная родственная группа, когда они делают то же самое.

...