考虑以下命令:
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。即使如此,它也不完全贪婪(即如果它是贪婪的,它将捕获所有的E)。更奇怪的是,它实际上仍然匹配模式,即使sub结果表明.+?部分留下了EE,而这些已经不能被正则表达式的其余部分匹配了。这表明在计算匹配子表达式的长度时存在偏移问题,而不是实际匹配中的问题。
最后一个与之前完全相同,但是使用 PCRE 运行,可以得到预期的结果。
我是遗漏了什么还是这种行为未经记录/存在缺陷?