与R正则表达式匹配的差异

时间:2018-02-15 05:28:14

标签: r regex

我无法弄清楚为什么这个R正则表达式与这两个字符串的两个都不匹配。据我了解,这个表达式应匹配字符串中出现两次相同的小写字母的任何字符串。它匹配其中一个字符串(“Moro”),但不匹配第二个(“moro”),即使两个字符串都包含重复的小写“o”。这是怎么回事?

在R(3.4.3)中执行:

grep("([a-z]).*\\1", c("Moro", "moro"), value=TRUE)

[1] "Moro"

这个正则表达式也是如此,我认为它与上面的正则表达式相同:

grep("([[:lower:]]).*\\1", c("Moro", "moro"), value=TRUE)

[1] "Moro"

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这似乎是一个正则表达式的风味问题。如果您设置perl = T,则有效:

grep("([a-z]).*\\1", c("Moro", "moro", "mora"), value=TRUE, perl = T)
# [1] "Moro" "moro"

值得注意的是stringrstringi开箱即用:

stringr::str_detect(c("Moro", "moro", "mora"), "([a-z]).*\\1")
# [1]  TRUE  TRUE FALSE

stringi::stri_detect(c("Moro", "moro", "mora"), regex = "([a-z]).*\\1")
# [1]  TRUE  TRUE FALSE

答案 1 :(得分:1)

我不确定,但我的猜测是因为它试图匹配任何字符。如果您使用简单的[o],它将起作用:

grep("([a-z]).*\\1", c("Moro", "moro"), value=TRUE)
# [1] "Moro"
grep("([o]).*\\1", c("Moro", "moro"), value=TRUE)
# [1] "Moro" "moro"