Detecting if an NSString contains...?
Objective CStringNsstringObjective 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
options:(NSStringCompareOptions)options;
@end
@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];
}
@end
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: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/
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:@[
NSLinguisticTagSchemeTokenType,
]
options:
NSLinguisticTaggerOmitPunctuation |
NSLinguisticTaggerOmitWhitespace |
NSLinguisticTaggerOmitOther ];
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"];
[linguisticTagger enumerateTagsInRange:NSMakeRange(0,
[[linguisticTagger string] length])
scheme:NSLinguisticTagSchemeTokenType
options:
NSLinguisticTaggerOmitPunctuation |
NSLinguisticTaggerOmitWhitespace |
NSLinguisticTaggerOmitOther |
NSLinguisticTaggerJoinNames
usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@",
tag,
NSStringFromRange(tokenRange),
NSStringFromRange(sentenceRange),
[[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;
}
@end
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.