检测 NSString 是否包含... ?

如何检测一个字符串是否包含某个单词? 例如,我有一个字符串,其下面是:

@"Here is my string."

我想知道我是否能够检测到字符串中的一个单词,例如“ is”。

78772 次浏览

我会这么做:

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...
}
}

你可以很容易地把它作为一个类别添加到 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

一个完整的解决方案将首先扫描字符串(不添加空格) ,然后检查紧邻的前一个字符是空格还是行的开头。类似地,检查紧跟在后面的字符是空字符还是行尾字符。如果两个测试都通过,那么就有匹配结果了。根据您的需要,您还可以检查 ,.()等。

当然,另一种方法是将字符串解析为单词,并逐个检查每个单词。

我建议使用 NSLinguistic Tagger。我们可以用它来搜索 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.

使用以下代码扫描句子中的单词。

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

我希望这可以帮助您,. . 添加这一行在.m 文件或创建一个单独的类和集成此代码。

@implementation NSString (Contains)


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

使用 iOS8和 Swift,我们可以使用 localizedCaseInsentiveContainsString 方法

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


string.localizedCaseInsensitiveContainsString(substring) // true

在 iOS8中,你现在可以使用:

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

这里有一篇关于如何“改造”iOS7的有趣文章: Http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/