我无法弄清楚为什么这个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"
感谢您的帮助!
答案 0 :(得分:2)
这似乎是一个正则表达式的风味问题。如果您设置perl = T
,则有效:
grep("([a-z]).*\\1", c("Moro", "moro", "mora"), value=TRUE, perl = T)
# [1] "Moro" "moro"
值得注意的是stringr
和stringi
开箱即用:
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"