string = c("apple", "apples", "applez") grep("apple", string) This would give me the index for all three elements in string. But I want an exact match on the word "apple" (i.e I just want grep() to return index 1).
Use word boundary \b which matches a between a word and non-word character,
string = c("apple", "apples", "applez") grep("\\bapple\\b", string) [1] 1 OR
Use anchors. ^ Asserts that we are at the start. $ Asserts that we are at the end.
grep("^apple$", string) [1] 1 You could store the regex inside a variable and then use it like below.
pat <- "\\bapple\\b" grep(pat, string) [1] 1 pat <- "^apple$" grep(pat, string) [1] 1 Update:
paste("^",pat,"$", sep="") [1] "^apple$" string [1] "apple" "apple:s" "applez" pat [1] "apple" grep(paste("^",pat,"$", sep=""), string) [1] 1 paste0("^",pat,"$") saves a few characters of typing over paste. No need for sep=""For exact matching, it makes the most sense to use ==. Additionally, this will be faster than grep(), and is obviously much easier.
which(string == "apple") # [1] 1 which(string %in% "apple") also works and you mention speed, I would like to know if == is faster than %in%?
==ormatch.anyand==is better option if you don't needgreparguments such asignore.case = trueorvalue = true