Виявлення, чи містить NSString…?


124

Як я можу визначити, якщо рядок містить певне слово? Наприклад, у мене є рядок, під якою написано:

@"Here is my string."

Мені хотілося б знати, чи можу я виявити слово в рядку, наприклад "є".


можливий дублікат пошуку какао NSString?
kennytm

26
чи можете ви прийняти відповідь?
Яків Релькін

Якщо дешево-брудне рішення, якщо вважається, що рядок не містить розділових знаків, - це об'єднати пробіли на передній і задній сторонах рядків BOTH, тоді зробіть це rangeOfString.
Гарячі лизання

Відповіді:


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
Насправді ви можете просто додати пробіл на початку та в кінці рядка, і "є" буде відповідати рядок починається з "є"
user4951

Мене приголомшує, що вони не входять до стандартного класу. Дякую, @Jacob!
big_m

1
Насправді, "length" NSRange слід перевірити ... не "location". Ось це безпосередньо з джерела: "Ці методи повертають length == 0, якщо цільовий рядок не знайдено. Отже, для перевірки на стримування: ([ str rangeOfString: @ "target"]. length> 0). Зауважте, що довжина діапазону, що повертається цими методами, може бути різною, ніж довжина цільової рядка, через складені символи тощо. "
GtotheB

Починаючи з iOS 8.0, існує новий метод, який називається containsStringекспозицією в NSString.
tedyyu

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 * string in array) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Not in string} 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.