R регулярное выражение, не совпадающее со всеми дефисами


В следующем примере сопоставляется только третья строка, хотя во всех трех строках есть дефисы:

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

Как я могу сопоставить все три дефиса с grep?

3   2   2017-06-04 13:58:33

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

Как справедливо указывает @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.