80
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).

4
  • 5
    For exact matches, consider using == or match. Commented Nov 8, 2014 at 4:20
  • 1
    What about for gsub instead of grep? Commented Nov 10, 2016 at 0:33
  • Combining any and == is better option if you don't need grep arguments such as ignore.case = true or value = true Commented Feb 5, 2021 at 2:20
  • Related stackoverflow.com/q/7227976/680068 Commented Nov 4, 2021 at 9:17

2 Answers 2

138

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 
Sign up to request clarification or add additional context in comments.

1 Comment

paste0("^",pat,"$") saves a few characters of typing over paste. No need for sep=""
45

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 

1 Comment

Since which(string %in% "apple") also works and you mention speed, I would like to know if == is faster than %in%?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.