最早开始的比赛获胜?

syg*_*syg 1 regex r

有人告诉我,正则表达式遵循这条规则:最早开始获胜的比赛.

> 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)

为什么现在不服从?

rua*_*akh 5

这是因为.,默认情况下,意味着"除换行之外的任何字符"; 所以完整的字符串\na\nab实际上不匹配\n.*b(因为\n中间没有匹配.).匹配它的唯一部分是子字符串\nab.

要更改.为"任何字符,甚至是换行符",您可以(?s)在模式中更早地插入魔术序列:

gsub("(?s)\n.*?b", "", aab, perl=T)
Run Code Online (Sandbox Code Playgroud)

打开s选项(表示"单行"模式,虽然名称具有误导性:它唯一的作用就是改变.这种方式的含义).