Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式递归:第n个子模式_Regex_Pcre_Regex Group_Regex Greedy_Regex Recursion - Fatal编程技术网

Regex 正则表达式递归:第n个子模式

Regex 正则表达式递归:第n个子模式,regex,pcre,regex-group,regex-greedy,regex-recursion,Regex,Pcre,Regex Group,Regex Greedy,Regex Recursion,我试图学习正则表达式中的递归,并对PCRE风格中的概念有一个基本的理解。我想打断一根线: Geese (Flock) Dogs (Pack) 进入: 我知道两个正则表达式都没有做到这一点,但我更好奇的是为什么这个模式有效,而另一个却没有 Pattern 1: ((.*?)(\(\w{1,}\)))((.*?)(\g<3>))* Pattern 2: ((.*?)(\(\w{1,}\)))((\g<2>)(\g<3>))* 这是我得出的结论,是这个模式,但

我试图学习正则表达式中的递归,并对PCRE风格中的概念有一个基本的理解。我想打断一根线:

Geese (Flock) Dogs (Pack) 
进入:

我知道两个正则表达式都没有做到这一点,但我更好奇的是为什么这个模式有效,而另一个却没有

Pattern 1: ((.*?)(\(\w{1,}\)))((.*?)(\g<3>))*
Pattern 2: ((.*?)(\(\w{1,}\)))((\g<2>)(\g<3>))*
这是我得出的结论,是这个模式,但是中间的组:狗(群)变成了0组

((.*?)(\(\w{1,}\)))((.*?)(\g<3>))*
(.*)(\(\w{1,}\)(.*)(\g))*

请注意PCRE中的递归级别是原子级的。一旦这些模式找到匹配项,就不会重新尝试

见:

如果递归失败后正则表达式的剩余部分返回递归。他们根据需要尝试递归的所有排列,以允许正则表达式的其余部分匹配。将递归视为。PCRE通常在递归过程中回溯,但一旦递归匹配,它就不会尝试递归的任何进一步排列,即使正则表达式的其余部分无法匹配。结果是Perl和Ruby可能会找到PCRE找不到的正则表达式匹配,或者Perl和Ruby可能会找到不同的正则表达式匹配

您的第二个模式,在第一个递归级别,如下所示

((.*?)(\(\w{1,}\)))(((?>.*?))((?>\(\w{1,}\))))*
                     ^^^^^^^  ^^^^^^^^^^^^^^
看。也就是说,
\g
(?>.*?
,而不是
*?
。这意味着,在
(*?)(\(\w{1,}\)
模式匹配
鹅(群)
之后,正则表达式引擎尝试匹配
(?>*)
,发现它是一个不必消耗任何字符的惰性模式,跳过它(并且永远不会回到这个模式),并尝试匹配
(\w{1,}\)
。由于没有
之后的
,正则表达式返回它所使用的内容


至于第二个问题,这是一个普遍的问题。使用PCRE正则表达式无法获取任意数量的捕获,因为在重复捕获的情况下,只有最后捕获的值存储在组缓冲区中。结果数组中的子匹配数不能超过正则表达式模式中的捕获组数。有关更多详细信息,请参阅。

关于第二季度,重复捕获组只保留最后一次匹配的事件,这是一个常见的问题。问题1很容易回答,但需要时间来解释:。此外,请看,这甚至可能是一个重复的原因。感谢您将仔细阅读。现在,如果您已经在该线程中阅读了我的答案,是否全部清楚?或者你需要澄清吗?关于第一部分,我已经浏览了链接,你的答案也是如此,但仍然没有点击。我理解原子性,一旦找到匹配项,就不会重新输入。我在这里所做的错误实际上与第一组的使用有关,是与组的定位有关,还是两者的结合?
((.*?)(\(\w{1,}\)))((.*?)(\g<3>))*
((.*?)(\(\w{1,}\)))(((?>.*?))((?>\(\w{1,}\))))*
                     ^^^^^^^  ^^^^^^^^^^^^^^