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

时间:2013-12-07 03:19:22

标签: regex r

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

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

grep(c("\r","\n","\r\n"),pattern=".")
[1] 1 2 3

有人可以解释这个矛盾吗?

1 个答案:

答案 0 :(得分:4)

此处的页面http://www.regular-expressions.info/dot.html解释了点数与行尾字符不匹配的规则主要是出于历史原因:

  

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

然而,

  

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

显然,R就是这样一种语言,默认情况下,dot会匹配每个字符。 (我指出上面的Joshua的评论,建议你看看?regex和POSIX 1003.2标准。)


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

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

> grep(".", c("\r","\n","\r\n"), perl = TRUE)
[1] 1 3

这告诉我\n是换行符,但不是\r。比较cat("\r")cat("\n")的内容可以确认。

(如果它有任何不同,我在Mac OS上。)