web-dev-qa-db-fra.com

Détecter si un NSString contient ...?

Comment puis-je détecter si une chaîne contient un certain mot? Par exemple, j'ai une chaîne ci-dessous qui se lit comme suit:

@"Here is my string."

J'aimerais savoir si je peux détecter un mot dans la chaîne, tel que "est" par exemple.

124
Alex

Voici comment je le ferais:

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...
   }
}

Vous pouvez facilement ajouter ceci en tant que catégorie sur 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
192
Jacob Relkin

Utilisez le code suivant pour analyser le mot dans la phrase.

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

Dans iOS8, vous pouvez maintenant utiliser:

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

Il y a un article intéressant sur la façon de le "modifier" sur iOS7 ici: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/

22
siburb

Je recommande d'utiliser NSLinguisticTagger . Nous pouvons l'utiliser pour rechercher 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]);
                            }];

Cela génère:

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

Il ignore Hismississippi et isthmus et identifie même is à l'intérieur de isn't.

3
Heath Borders

J'espère que cela vous aidera, .. ajoutez cette ligne au fichier .m ou créez une classe séparée et intégrez ce code.

@implementation NSString (Contains)

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

Avec iOS 8 et Swift, nous pouvons utiliser la méthode localizedCaseInsensitiveContainsString

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

 string.localizedCaseInsensitiveContainsString(substring) // true
2
iGo

Une solution complète rechercherait d'abord la chaîne (sans les espaces), puis vérifierait si le caractère immédiatement précédent est vide ou au début de la ligne. De même, vérifiez si le caractère immédiatement suivant est vide ou en fin de ligne. Si les deux tests réussissent, vous avez une correspondance. En fonction de vos besoins, vous pouvez également vérifier ,, ., (), etc.

Bien entendu, une autre approche consiste à analyser la chaîne en mots et à vérifier chaque mot individuellement.

0
Hot Licks