2010-07-20 96 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

相關問題