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