正则表达式:再次使用捕获组

时间:2016-09-19 18:46:54

标签: regex backreference capture-group posix-ere

我遇到了命名捕获组的问题并重新使用它们。似乎当我命名捕获组A并且它首先捕获类似“asd”的东西并且我使用\ k并尝试再次使用捕获组A的表达式时,它不起作用,因为它与正则表达式I不匹配最初写在A组,但它试图匹配以前匹配的A,这是“asd”。

所以,如果我有类似的东西:

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

我输入:

aa

这很有效,因为捕获组A首先匹配字母a而\k<A>现在也在寻找a。

然而,键入as不起作用,因为A首先匹配a而\k<A>正在寻找另一个a。

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

使用pcre可以使用递归 但是,递归是一个误称的错误,它更像是一个函数调用。

首选方式:

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

内联方式:

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

两者都做同样的事情。使用内联方式时,它仍然只是一个函数调用 当你从一个函数中调用自己时,这更具递归性 即(?<A>(?:a|b|c)(?&A)*)并需要特别保护。