R 正则表达式不匹配所有连字符

Posted

技术标签:

【中文标题】R 正则表达式不匹配所有连字符【英文标题】:R regex not matching all hyphens 【发布时间】:2017-11-05 07:17:48 【问题描述】:

在以下示例中,仅匹配第三个字符串,即使所有三个字符串中都有连字符:

grep("-", c("January 7–9, 2015", "January a–b, 2015", "Janua-ry 14, 2015"))
[1] 3

如何用 grep 匹配所有三个连字符?

【问题讨论】:

【参考方案1】:

正如@akrun 正确指出的那样,其他两个字符不是连字符(它们被称为EN DASH),如果您使用Encdoing 函数,您可以在下面看到它们的样子。

x <- c("January 7–9, 2015", "January a–b, 2015", "Janua-ry 14, 2015")
Encoding(x) <- "UTF-8"
print(x)

输出

[1] "January 7<U+2013>9, 2015" "January a<U+2013>b, 2015"
[3] "Janua-ry 14, 2015" 

有很多方法可以匹配这些编码模式,您可以使用 \U 后跟 utf 编码数字对应物,如下所示来匹配您的 grep。

grep("-|[\U2013]",x )

输出

 grep("-|[\U2013]",x )
[1] 1 2 3

【讨论】:

【参考方案2】:

要匹配任何类型的破折号,请使用\pPd PCRE 正则表达式:

grep("\\pPd", v1, perl=TRUE)

perl=TRUE 强制 R 使用 PCRE 正则表达式引擎解析模式,\pPd 匹配任何类型的 Unicode 破折号/连字符。

【讨论】:

【参考方案3】:

3 个连字符不匹配的原因是只有 3 个是标准连字符。一种方法是通过不匹配字母数字、, 和空格字符来仅匹配那些连字符

grep("[^[:alnum:], ]+", v1)
#[1] 1 2 3

另一种选择是复制前两个字符串相同的连字符并使用|与标准连字符匹配

grep("–|-", v1)
#[1] 1 2 3

数据

v1 <- c("January 7–9, 2015", "January a–b, 2015", "Janua-ry 14, 2015")

【讨论】:

以上是关于R 正则表达式不匹配所有连字符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式,匹配除 \r \n 之外的所有内容作为普通字符

正则表达式.+可以匹配空格,但是[.\w]+却不匹配,为啥?

关于正则表达式的一些基础知识

正则表达式匹配

正则表达式与新行之间的内容不匹配 (\r\n)

C# 正则表达式