R正则表达式不匹配所有连字符
R regex not matching all hyphens
在以下示例中,只有第三个字符串匹配,即使所有三个字符串中都有连字符:
grep("-", c("January 7–9, 2015", "January a–b, 2015", "Janua-ry 14, 2015"))
[1] 3
如何将所有三个连字符与 grep 匹配?
3个连字符不匹配的原因是因为只有3是标准连字符。一种方法是通过不匹配字母数字、,
和 space 字符来仅匹配那些连字符字符
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")
正如@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
要匹配任何类型的破折号,请使用 \p{Pd}
PCRE 正则表达式:
grep("\p{Pd}", v1, perl=TRUE)
perl=TRUE
强制 R 使用 PCRE 正则表达式引擎解析模式,\p{Pd}
匹配任何类型的 Unicode dash/hyphen。
在以下示例中,只有第三个字符串匹配,即使所有三个字符串中都有连字符:
grep("-", c("January 7–9, 2015", "January a–b, 2015", "Janua-ry 14, 2015"))
[1] 3
如何将所有三个连字符与 grep 匹配?
3个连字符不匹配的原因是因为只有3是标准连字符。一种方法是通过不匹配字母数字、,
和 space 字符来仅匹配那些连字符字符
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")
正如@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
要匹配任何类型的破折号,请使用 \p{Pd}
PCRE 正则表达式:
grep("\p{Pd}", v1, perl=TRUE)
perl=TRUE
强制 R 使用 PCRE 正则表达式引擎解析模式,\p{Pd}
匹配任何类型的 Unicode dash/hyphen。