捕获组内贪婪修饰符的奇怪行为

时间:2014-02-26 23:45:56

标签: regex r posix-ere

请考虑以下命令:

text <- "abcdEEEEfg"

sub("c.+?E", "###", text)
# [1] "ab###EEEfg"                          <<< OKAY
sub("c(.+?)E", "###", text)
# [1] "ab###EEfg"                           <<< WEIRD
sub("c(.+?)E", "###", text, perl=T)
# [1] "ab###EEEfg"                          <<< OKAY  

第一个完全符合我的预期,基本上只匹配第一个E.第二个应该基本上与第一个相同,因为我所做的只是添加一个捕获组(虽然我没有使用它),但由于某种原因,它捕获了一个额外的E.也就是说,它并不是完全贪婪的(即它是否会捕获所有的Es)。即使更奇怪,它实际上仍然匹配模式,即使sub结果表明.+?部分遗漏EE,其不再与正则表达式的其余部分匹配。这表明在计算匹配的子表达式的长度时存在偏移问题,而不是在实际匹配中。

最后一个完全相同,但是使用PCRE运行,并且按预期工作。

我是否遗漏了某些内容,或者此行为是否未记录/错误?

1 个答案:

答案 0 :(得分:2)

R使用版本0.8的libtre。为了获得更高的稳定性,您应始终使用perl = TRUE

请注意

sub("c(.+?)E?", "###", text)

作品。