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

时间:2017-06-04 10:58:33

标签: r regex hyphen

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

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

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

3 个答案:

答案 0 :(得分:4)

正如@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("-|[\U{2013}]",x )

<强>输出

 grep("-|[\U{2013}]",x )
[1] 1 2 3

答案 1 :(得分:2)

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

答案 2 :(得分:1)

要匹配任何类型的短划线,请使用\p{Pd} PCRE正则表达式:

grep("\\p{Pd}", v1, perl=TRUE)

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