9

考虑以下命令:

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 运行,并且按预期工作。

我错过了什么还是这种行为没有记录/错误?

4

1 回答 1

2

R 使用libtre0.8 版。为了获得更高的稳定性,您应该始终使用perl = TRUE.

注意

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

作品。

于 2014-02-27T02:16:04.713 回答