点元字符如何匹配换行符?

it_*_*ure 5 regex r

我认为.正则表达式中的点将匹配任何字符,除了行尾字符。

但是,在 R 中,我发现点可以匹配任何内容,包括换行符\n\r\r\n

grep(c("\r","\n","\r\n"),pattern=".")
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

有人能解释一下这个矛盾吗?

flo*_*del 6

这里的页面http://www.regular-expressions.info/dot.html解释了点与行尾字符不匹配的规则主要是由于历史原因而存在的:

第一个使用正则表达式的工具是基于行的。他们将逐行读取文件,并将正则表达式分别应用于每一行。效果是使用这些工具,字符串永远不会包含换行符,因此点永远不会匹配它们。

然而,

现代工具和语言可以将正则表达式应用于非常大的字符串甚至整个文件。除了 JavaScript 和 VBScript,这里讨论的所有正则表达式都有一个选项,可以使点匹配所有字符,包括换行符。

显然,R 就是这样一种语言,默认情况下,点将匹配每个字符。(我向您指出了上面约书亚的评论,建议您查看?regexPOSIX 1003.2 标准。)


我上面链接的页面也提到了 Perl 并建议在其默认模式下,点将不匹配换行符。

请注意 R 的grep函数如何具有perl选项。如果你打开它,你会得到不同的输出:

> grep(".", c("\r","\n","\r\n"), perl = TRUE)
[1] 1 3
Run Code Online (Sandbox Code Playgroud)

这告诉我这\n是换行符,而不是\r. 东西比较cat("\r")cat("\n")可以证实。

(如果有什么不同的话,我在 Mac OS 上。)