2016-09-19 44 views
1

我遇到命名捕获组的问题并重新使用它们。看起来像我命名捕获组A时,它首先捕获类似“asd”的东西,然后使用\ k并尝试再次使用捕获组A的表达式,但它不起作用,因为它不匹配正则表达式I originaly在A组中写道,但是它试图匹配先前匹配的内容,即“asd”。正则表达式:再次使用捕获组

所以,如果我有这样的:

^(?<A>(?:a|s|d))\k<A>$ 

我键入:

aa 

这工作,因为捕获组的第一个匹配的字母和\k<A>现在也在寻找一个。

但是,在as中键入不起作用,因为第一个匹配a和\k<A>正在寻找另一个a。

我想要做的是再次使用捕获组A的正则表达式本身。所以我想\k<A> = (?:a|s|d)

这里有什么问题,有没有办法解决它?

谢谢!

+2

您正在寻找[递归](http://www.regular-expressions.info/recurse.html)。不幸的是,这不是一个广泛支持的功能。我不认为posix-ere支持它。 –

+0

@Rawing是的,这工作。我使用\ g'name'来代替,但是我的实际正则表达式还存在其他一些问题,但现在一切正在运行。提交这个答案作为答案,我会给你的观点。 – Piwwoli

+0

如果您可以使用'\ g'name'',posix-ere标签在这里是错误的。什么是环境? PHP?红宝石? –

回答

1

使用pcre你可以使用递归。
但是,递归是一个用词不当,它更像是一个函数调用。

的首选方式:

^
(?&A) 
(?&A) 
$ 
(?(DEFINE)  # Functions 
     (?<A>       # (1 start) 
      (?: a | s | d) 
    )        # (1 end) 
) 

内联方式:

^
(?<A>       # (1 start) 
     (?: a | s | d) 
)        # (1 end) 
(?&A) 
$ 

两个做同样的事情。在使用内联方式时,它仍然只是一个函数调用。
当你从一个函数内部调用自己时,这是更加递归的。
I.e. (?<A>(?:a|b|c)(?&A)*)并需要特殊保护。