以递归模式匹配的命名组

时间:2011-11-25 02:16:56

标签: regex perl recursive-regex

我在\ command {...} {...}形式的LaTeX-Commands上匹配。第二个参数是可选的。我的RegEx只是perl6 faq中一个示例的略微修改版本,因为我需要注意参数中可能存在嵌套LaTeX命令的情况。

我想使用命名组。我怎样才能做到这一点?我尝试使用(?< first>:...)和(?& first),但它给了我一个“无限递归”错误。对于这里的RegExes,我可能有点过头了,但到目前为止这种方法效果非常好。

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

$s =~ m/$regex/g

1 个答案:

答案 0 :(得分:0)

您应该可以使用s/(?<first>foo+)/\k<first>bar/s/(?first:foo+)/\g{first}bar/等命名群组,但(?<first>:...)会将:视为模式的一部分。

我不确定为什么你的(?PARNO)表达式会导致无限递归,但manual在执行完全相同的事情时会有一个额外的paren组。