2010-07-20 3 views
122

Как определить, содержит ли строка определенное слово? Например, у меня есть строка, ниже которой гласит:Обнаружение, если NSString содержит ...?

@"Here is my string." 

Я хотел бы знать, если я могу обнаружить слово в строке, например, как «это», например.

+0

Возможный дубликат [Searchi ng NSString Cocoa?] (http://stackoverflow.com/questions/2609456/searching-nsstring-cocoa) – kennytm

+26

вы можете принять ответ? –

+0

Дешевое и грязное решение, если предполагается, что строка не содержит знаков препинания, заключается в конкатенации пробелов на передней и задней части BOTH-строк, а затем на 'rangeOfString'. –

ответ

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 –

+2

На самом деле вы можете просто добавить пробел в начале и конце строки, а «is» будет соответствовать строке начинается с «is» –

+0

Это оглушает меня, что эти не являются частью стандартного класса. Спасибо, @Jacob! –

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 

Он игнорирует Hismississippi и isthmus и даже идентифицирует is внутри isn'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

+0

Зависит от того, что вы используете для поиска в массиве. Без использования компараторов я считаю, что наилучшим способом является цикл через массив и проверка каждой строки для строки поиска. NSString * searchString; для (NSString * строка в массиве) { если ([строка rangeOfString: опции SearchString: NSCaseInsensitiveSearch]! .Location = NSNotFound) { // Не в строке } еще { // В этой строке } } Затем вы можете добавить строки, которые содержат его, в новый изменчивый массив, который позволяет вам отображать их, если вы ищете –

+0

ps. В приведенном выше коде форматирование верен, но, очевидно, его замяли, оставив комментарий –

3

Я надеюсь, что это поможет вам, .. добавьте эту строку в файл .m или создайте отдельный класс и интегрируйте этот код.

@implementation NSString (Contains) 

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

С прошивкой 8 и Swift, мы можем использовать метод localizedCaseInsensitiveContainsString

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

string.localizedCaseInsensitiveContainsString(substring) // true 
+0

слишком рано , но хороший для будущего. –

19

В iOS8 теперь вы можете использовать:

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

Там интересный пост о том, как "модифицировать" его к iOS7 здесь: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/

+0

Это был бы очень хороший удобный метод. К сожалению, он не документирован и, следовательно, является частным API – Centurion

+2

Это, безусловно, не частный API. Проверьте файл NSString.h, и вы увидите его. –

Смежные вопросы