【发布时间】:2018-08-17 17:56:29
【问题描述】:
我正在尝试学习正则表达式中的递归,并对 PCRE 风格中的概念有一个基本的了解。我想断一个字符串:
Geese (Flock) Dogs (Pack)
进入:
Full Match: Geese (Flock) Dogs (Pack)
Group 1: Geese (Flock)
Group 2: Geese
Group 3: (Flock)
Group 4: Dogs (Pack)
Group 5: Dogs
Group 6: (Pack)
我知道这两个正则表达式都不能做到这一点,但我更好奇first 模式有效而second 无效的原因。
Pattern 1: ((.*?)(\(\w{1,}\)))((.*?)(\g<3>))*
Pattern 2: ((.*?)(\(\w{1,}\)))((\g<2>)(\g<3>))*
另外,例如,如果您正在处理一个长字符串,并且一个模式重复自身,是否可以不断扩展完整匹配,并逐步增加组,而无需编写与正则表达式分开的循环语句。
Full Match: Geese (Flock) Dogs (Pack) Elephants (Herd)
Group 1: Geese (Flock)
Group 2: Geese
Group 3: (Flock)
Group 4: Dogs (Pack)
Group 5: Dogs
Group 6: (Pack)
Group 7: Elephants (Herd)
Group 8: Elephants
Group 9: (Herd)
这是closest我遇到的这种模式,但是中间组:Dogs (Pack) 变成了 Group 0。
((.*?)(\(\w{1,}\)))((.*?)(\g<3>))*
【问题讨论】:
-
关于 Q2,重复捕获组只保留最后匹配的出现,这是 SO 上的常见问题。 Q1 很容易回答,但需要时间来解释:recursion levels are atomic in PCRE。
-
另外,请参阅this thread,这甚至可能是欺骗的原因。
-
谢谢你会看的。
-
现在,如果您已经阅读了我在该主题上的回答,一切都清楚了吗?或者您需要澄清一下吗?
-
关于第一部分,我已经浏览了链接和您的 SO 答案,但它仍然没有点击。我理解原子性,一旦找到匹配项,它就不会重新输入。我这里做错的其实和第一组的使用有关,是和组的定位有关,还是两者的结合?
标签: regex pcre regex-group regex-greedy regex-recursion