使用 stringi 和 gsub 的不同输出(在同一字符串上使用相同的模式)

different output using stringi and gsub (using the same pattern on the same string)

我想知道为什么我使用gsub 和stringi 得到两个不同的输出字符串。元字符“.”不在 stringi 中包含新行? stringi 是否读取 "line by line"?

顺便说一句,我没有找到用 stringi 执行 "correct" 替换的方法,所以我需要在这里使用 gsub。

string <- "is it normal?\n\nhttp://www.20minutes.fr"

> gsub(" .*?http"," http", string)
[1] "is http://www.20minutes.fr"

> stri_replace_all_regex(string, " .*?http"," http")
[1] "is it normal?\n\nhttp://www.20minutes.fr"

一种方法是将 . 设置为也匹配行终止符而不是停在一行:

stri_replace_all_regex(string, " .*?http"," http", 
                       opts_regex = stri_opts_regex(dotall = TRUE))

默认情况下——出于历史原因,请参阅this tutorial——在大多数正则表达式引擎中,点不匹配换行符。 正如@lukeA 建议的那样,要匹配换行符,您可以在基于 stringi 正则表达式的函数中将 dotall 选项设置为 TRUE

顺便说一句,gsub(..., perl=TRUE)给出的结果与stringi一致。