我遇到了命名捕获组的问题并重新使用它们。似乎当我命名捕获组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)
。
这里有什么问题,有办法解决吗?
谢谢!
答案 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)*)
并需要特别保护。