2010-07-20 98 views
122

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

@"Here is my string." 

我想知道我是否可以检测字符串中的单词,如“是”例如。

+0

[Searchi ng NSString Cocoa?](http://stackoverflow.com/questions/2609456/searching-nsstring-cocoa) – kennytm 2010-07-20 19:24:40

+26

你能接受答案吗? – 2010-07-21 11:18:25

+0

如果字符串被假定为不包含标点符号,便宜又脏的解决方案是连接BOTH字符串正面和背面上的空白,然后执行'rangeOfString'。 – 2012-09-13 19:13:21

回答

190

这是我会怎么做:

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 
+0

这里是一个方便的类别NSString http://goo.gl/SNkk0 – 2012-11-10 19:04:37

+2

其实你可以只在字符串的开始和结尾添加空格,“is”将匹配字符串以“is”开头 – 2012-11-12 07:41:51

+0

它让我感到惊讶这些不属于标准类。谢谢,@Jacob! – 2013-07-19 19:40:59

0

一个完整的解决方案将首先扫描字符串(不加空格) ,然后检查前面的字符是空白还是行尾。同样检查紧接着的字符是空白还是行尾。如果两项测试都通过,那么你有一场比赛。根据您的需要,您可能还会检查,.,()等。

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

2

我推荐使用NSLinguisticTagger。我们可以用它来搜索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]); 
          }]; 

此输出:

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 

它忽略Hismississippiisthmus,甚至识别isisn't内。

88

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

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

如何在数组上使用此方法时获取位置? – judge 2014-03-09 22:25:59

+0

取决于您在数组中使用搜索的内容。如果不使用比较器,我认为最好的方法是遍历数组并检查每个字符串的搜索字符串。 NSString * searchString; 为(在阵列的NSString *串){ 如果([字符串rangeOfString:searchString的选项:NSCaseInsensitiveSearch]!= .location NSNotFound){ //不在串 } 其他{ //在该串 } } 然后,您可以将包含它的字符串添加到新的可变数组中,以便在搜索时显示它们 – 2014-11-03 23:58:20

+0

ps上述代码中的格式都是正确的,但显然通过在评论 – 2014-11-03 23:58:49

3

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

@implementation NSString (Contains) 

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

与iOS 8和斯威夫特,我们可以使用localizedCaseInsensitiveContainsString方法

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

string.localizedCaseInsensitiveContainsString(substring) // true 
+0

中得到捣碎,但对未来而言是好的。 – 2014-09-04 18:32:59

19

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

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

有一个关于如何 “改造” 成为一个有趣的帖子到iOS7: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/

+0

这将是非常好用的方法。不幸的是,它没有记录,因此是私人API – Centurion 2015-02-12 16:38:37

+2

它绝对不是私人API。看看NSString.h文件,你会看到它。 – 2015-03-31 03:00:40