有人告诉我,正则表达式遵循这条规则:最早开始获胜的比赛。
> aab <- "aab"
> gsub("a.*?b", "", aab, perl=T)
[1] ""
> gsub("a.*b", "", aab, perl=T)
[1] ""
目前,似乎遵守了这条规则,但是......
> aab <- "\na\nab"
> gsub("\n.*?b", "", aab, perl=T)
[1] "\na"
> gsub("\n.*b", "",aab, perl=T)
[1] "\na"
为什么现在不服从?
答案 0 :(得分:5)
这是因为默认情况下.
表示“除换行符以外的任何字符”;所以完整字符串\na\nab
实际上无法与\n.*b
匹配(因为中间的\n
与.
不匹配)。匹配它的唯一部分是子串\nab
。
要将.
更改为“任何字符,甚至是换行符”,您可以在模式的前面插入魔术序列(?s)
:
gsub("(?s)\n.*?b", "", aab, perl=T)
打开s
选项(表示“单行”模式,虽然该名称具有误导性:它的唯一作用是以这种方式更改.
的含义。)