【发布时间】:2016-12-06 08:44:45
【问题描述】:
我试图多次捕获跟随另一个或他自己的捕获组。我可以一遍又一遍地多次使用相同的字符串。我们就拿下面的一个来做测试吧:
thing: random1_abcd
abcd_n1p3; abcd_n2p1
"random2_abcd" does not exist.
thing: random3_abcd
abcd_n1p1; abcd_n2p3
thing: random4_abcd
abcd_n1p3; abcd_n3p1; abcd_n2p7
thing: random5_abcd
abcd_n4p2; abcd_n3p3; abcd_n6p7; abcd_n1p6
我想捕捉 abcd_X foreach randomX_abcd(并知道它们之间的界限)。我不能抓住 "random2_abcd",因为它不存在!
这是我到目前为止所做的:(\w*_abcd) 是为了捕获 randomX_abcd。我得到了(abcd_\w*) 来捕获 abcd_X 部分。起初我试图抓住每一个 abcd_X 分开。所以我使用了(\w*_abcd)\s*(?: (abcd_\w*);?)+,但它只捕获最后一个 abcd_X 因为它很贪婪。第二组不会出现倍数。 Example
现在我试图只获得 2 个组(不再有多个匹配与相同的捕获组:一个与 randomX_abcd 和另一个与相应的 abcd_X 列表。那里是一个棘手的部分:它可能有多个空格和换行符。但它可能只有一个空格。所以我不能依赖换行符部分。 鉴于我提出了这个新想法:
(\w*_abcd)\s*((?: ?abcd_\w*;?)+)
哪个工作正常,但我想知道。是否有可能实现我的第一个想法:用每个不同的 abcd_X 捕获相同的 randomX_abcd ?
【问题讨论】:
-
不,这是不可能的。因为成功匹配后,正则表达式索引向右推进。您不能在字符串中的同一索引处多次匹配。是你期待的答案吗?
-
好的,我明白了,谢谢。
-
请注意,这可以通过 Perl6 正则表达式实现,即使从同一位置开始,也可以获得任何类型的重叠匹配。