Обнаружение, если NSString содержит…?


124

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

@"Here is my string."

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


возможный дубликат Searching NSString Cocoa?
kennytm

26
ты можешь принять ответ?
Джейкоб Релкин

Дешевое и грязное решение, если предполагается, что строка не содержит знаков препинания, состоит в том, чтобы объединить пробелы спереди и сзади ОБЕИХ строк, а затем сделать это rangeOfString.
Hot Licks

Ответы:


192

Вот как бы я это сделал:

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

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

Меня ошеломляет то, что они не входят в стандартный класс. Спасибо, @Jacob!
big_m

1
На самом деле, "длина" NSRange должна быть проверена ... а не "местоположение". Здесь это прямо из источника: "Эти методы возвращают length == 0, если целевая строка не найдена. Итак, чтобы проверить наличие: ([ str rangeOfString: @ "target"]. length> 0). Обратите внимание, что длина диапазона, возвращаемого этими методами, может отличаться от длины целевой строки, из-за составных символов и т. д. "
GtotheB

Начиная с iOS 8.0, containsStringв NSString появился новый метод .
tedyyu 06

89

Используйте следующий код для сканирования слова в предложении.

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

как я могу получить местоположения при использовании этого метода в массиве?
судья

Зависит от того, что вы используете для поиска в массиве. Я думаю, что без использования компараторов лучше всего перебрать массив и проверить каждую строку на наличие строки поиска. NSString * searchString; for (NSString * строка в массиве) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Не в строке} else {// В этой строке}} Затем вы можете добавить строки, которые содержат его в новом изменяемом массиве, который позволяет вам отображать их, если вы ищете
simon_smiley

ps Все форматирование в приведенном выше коде правильное, но, очевидно, оно
искажается,

22

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

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

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


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

2
Это определенно не частный API. Посмотрите файл NSString.h, и вы его увидите.
Брайан Сачетта,

3

Я рекомендую использовать 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

Он игнорирует His mississippiи isthmusдаже идентифицирует isвнутри isn't.


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 и Swift мы можем использовать метод localizedCaseInsensitiveContainsString

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

 string.localizedCaseInsensitiveContainsString(substring) // true

0

Полное решение сначала будет сканировать строку (без добавленных пробелов), а затем проверять, является ли непосредственно предшествующий символ пустым или началом строки. Аналогичным образом проверьте, является ли следующий за ним символ пустым или концом строки. Если оба теста пройдены, значит у вас совпадение. В зависимости от ваших потребностей вы можете также проверить ,, ., ()и т.д.

Альтернативный подход, конечно же, состоит в том, чтобы разбить строку на слова и проверить каждое слово по отдельности.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.