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

R正则表达式不匹配所有连字符,r,regex,hyphen,R,Regex,Hyphen,在以下示例中,仅匹配第三个字符串,即使这三个字符串中都有连字符: grep("-", c("January 7–9, 2015", "January a–b, 2015", "Janua-ry 14, 2015")) [1] 3 如何将所有三个连字符与grep匹配?三个连字符不匹配的原因是只有三个是标准连字符。一种方法是只匹配那些连字符,而不匹配字母数字、、和空格字符 grep("[^[:alnum:], ]+", v1) #[1] 1 2 3 另一个选项是复制与前两个字符串相同的连字符,并

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

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

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

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

grep("[^[:alnum:], ]+", v1)
#[1] 1 2 3
另一个选项是复制与前两个字符串相同的连字符,并使用
与标准hypen匹配

grep("–|-", v1)
#[1] 1 2 3
数据
v1正如@akrun正确指出的,其他两个字符不是连字符(称为连字号),如果您使用encdo函数,您可以看到它们如下所示

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" 
 grep("-|[\U{2013}]",x )
[1] 1 2 3

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

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

 grep("-|[\U{2013}]",x )
[1] 1 2 3
grep("\\p{Pd}", v1, perl=TRUE)