如何检查确切的字串

时间:2019-05-20 18:00:09

标签: r regex grepl

我正在尝试将一大堆单词与一列字符串匹配。这些单词必须完全匹配。

我可以一次只用一个单词,但是对于多个单词我有一些问题。

x = c("red", "redish", "green", "greenish")
grepl("red|green", ignore.case=TRUE, x)

为此,我希望返回“红色”和“绿色”;但不会变红或变绿。

2 个答案:

答案 0 :(得分:4)

正则表达式让您将\\b用于单词边界:

grepl("\\bred\\b|\\bgreen\\b", x, ignore.case = TRUE)
# [1]  TRUE FALSE  TRUE FALSE

如果要匹配较长字符串中的单词,这将很好地工作:

grepl("\\bred\\b|\\bgreen\\b",
      c("I want to match red", "But not Fred",
        "Green yes please", "ignore wintergreen"),
      ignore.case=TRUE)
# [1]  TRUE FALSE  TRUE FALSE

但是,如果您要进行整个字符串匹配,则正则表达式会显得过分杀人,平等匹配会更快:

tolower(x) %in% c("red", "green")
[1]  TRUE FALSE  TRUE FALSE

如果我们以patterns = c("red|green")开头,则可以解决以上两种情况之一:

## use this with `%in%`
individual_words = unlist(strsplit(patterns, split = "\\|")) 

## or paste on the word boundaries for regex
word_boundary_patterns = paste0("\\b", individual_words, "\\b", collapse = "|")

答案 1 :(得分:1)

您还可以分别使用^$指定字符串的开头和结尾:

grepl("^red$|^green$", ignore.case = T, x)