Detecting if an NSString contains...?

Objective CStringNsstring

Objective C Problem Overview

How can I detect if a string contains a certain word? For example, I have a string below which reads:

@"Here is my string."

I'd like to know if I can detect a word in the string, such as "is" for example.

Objective C Solutions

Solution 1 - Objective C

Here's how I would do it:

NSString *someString = @"Here is my string";
NSRange isRange = [someString rangeOfString:@"is " options:NSCaseInsensitiveSearch];
if(isRange.location == 0) {
   //found it...
} else {
   NSRange isSpacedRange = [someString rangeOfString:@" is " options:NSCaseInsensitiveSearch];
   if(isSpacedRange.location != NSNotFound) {
      //found it...

You can easily add this as a category onto NSString:

@interface NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string;
- (BOOL)containsString:(NSString *)string


@implementation NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options {
   NSRange rng = [self rangeOfString:string options:options];
   return rng.location != NSNotFound;

- (BOOL)containsString:(NSString *)string {
   return [self containsString:string options:0];


Solution 2 - Objective C

Use the following code to scan the word in sentence.

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");

Solution 3 - Objective C

In iOS8 you can now use:

BOOL containsString = [@"Here is my string." containsString:@"is"];

There's an interesting post on how to "retrofit" it to iOS7 here:

Solution 4 - Objective C

I recommend using NSLinguisticTagger. We can use it to search Here is my string. His isn't a mississippi isthmus. It is?

NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[
                                        NSLinguisticTaggerOmitPunctuation |
                                        NSLinguisticTaggerOmitWhitespace |
                                        NSLinguisticTaggerOmitOther ];
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"];
[linguisticTagger enumerateTagsInRange:NSMakeRange(0,
                                                   [[linguisticTagger string] length])
 NSLinguisticTaggerOmitPunctuation |
 NSLinguisticTaggerOmitWhitespace |
 NSLinguisticTaggerOmitOther |
                            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@",
                                      [[linguisticTagger string] substringWithRange:tokenRange]);

This outputs:

tag: Word, tokenRange: {0, 4}, sentenceRange: {0, 19}, token: Here
tag: Word, tokenRange: {5, 2}, sentenceRange: {0, 19}, token: is
tag: Word, tokenRange: {8, 2}, sentenceRange: {0, 19}, token: my
tag: Word, tokenRange: {11, 6}, sentenceRange: {0, 19}, token: string
tag: Word, tokenRange: {19, 3}, sentenceRange: {19, 33}, token: His
tag: Word, tokenRange: {23, 2}, sentenceRange: {19, 33}, token: is
tag: Word, tokenRange: {25, 3}, sentenceRange: {19, 33}, token: n't
tag: Word, tokenRange: {29, 1}, sentenceRange: {19, 33}, token: a
tag: Word, tokenRange: {31, 11}, sentenceRange: {19, 33}, token: mississippi
tag: Word, tokenRange: {43, 7}, sentenceRange: {19, 33}, token: isthmus
tag: Word, tokenRange: {52, 2}, sentenceRange: {52, 6}, token: It
tag: Word, tokenRange: {55, 2}, sentenceRange: {52, 6}, token: is

It ignores His mississippi and isthmus and even identifies is inside of isn't.

Solution 5 - Objective C

I hope this helps you,.. add this line at .m file or create a separate class and integrate this code.

@implementation NSString (Contains)

- (BOOL) containsString: (NSString*) substring
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;

Solution 6 - Objective C

With iOS 8 and Swift, we can use localizedCaseInsensitiveContainsString method

 let string: NSString = "Café"
 let substring: NSString = "É"

 string.localizedCaseInsensitiveContainsString(substring) // true

Solution 7 - Objective C

A complete solution would first scan for the string (without added blanks), then check if the immediately prior character is either blank or beginning of line. Similarly check if the immediately following character is either blank or end of line. If both tests pass then you have a match. Depending on your needs you might also check for ,, ., (), etc.

An alternative approach, of course, is to parse the string into words and check each word individually.


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexView Question on Stackoverflow
Solution 1 - Objective CJacob RelkinView Answer on Stackoverflow
Solution 2 - Objective CAmit SinghView Answer on Stackoverflow
Solution 3 - Objective CsiburbView Answer on Stackoverflow
Solution 4 - Objective CHeath BordersView Answer on Stackoverflow
Solution 5 - Objective CManiganda saravananView Answer on Stackoverflow
Solution 6 - Objective CGovindView Answer on Stackoverflow
Solution 7 - Objective CHot LicksView Answer on Stackoverflow