Détecter si une NSString contient…?


124

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

Je voudrais savoir si je peux détecter un mot dans la chaîne, comme "est" par exemple.


duplicata possible de Searching NSString Cocoa?
kennytm

26
pouvez-vous accepter une réponse?
Jacob Relkin

Une solution bon marché et sale, si la chaîne est supposée ne contenir aucune ponctuation, est de concaténer des espaces à l'avant et à l'arrière des DEUX chaînes, alors faites rangeOfString.
Hot Licks

Réponses:


192

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 l'ajouter 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

2
En fait, vous pouvez simplement ajouter un espace au début et à la fin de la chaîne et "est" correspondra à la chaîne commençant par "est"
user4951

Cela m'étonne que ceux-ci ne font pas partie de la classe standard. Merci, @Jacob!
big_m

1
En fait, "length" de NSRange doit être testé ... pas "location". Ici, c'est directement à partir de la source: "Ces méthodes retournent length == 0 si la chaîne cible n'est pas trouvée. Donc, pour vérifier le confinement: ([ str rangeOfString: @ "target"]. length> 0). Notez que la longueur de la plage renvoyée par ces méthodes peut être différente de la longueur de la chaîne cible, en raison des caractères composés et autres. "
GtotheB

À partir d'iOS 8.0, il existe une nouvelle méthode appelée containsStringexposée dans NSString.
tedyyu

89

Utilisez le code suivant pour scanner 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");
}

Comment puis-je obtenir les emplacements lorsque j'utilise cette méthode sur un tableau?
juge

Dépend de ce que vous utilisez la recherche dans le tableau. Sans utiliser de comparateurs, je pense que le meilleur moyen est de parcourir le tableau et de vérifier chaque chaîne pour la chaîne de recherche. NSString * searchString; for (NSString * string in array) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Pas dans la chaîne} else {// Dans cette chaîne}} Vous pouvez alors ajouter les chaînes qui font le contenir dans un nouveau tableau mutable qui vous permet de les afficher si vous recherchez
simon_smiley

ps Le formatage est tout correct dans le code ci-dessus mais est évidemment
écrasé

22

Dans iOS8, vous pouvez désormais utiliser:

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

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


Ce serait une très belle méthode pratique. Malheureusement, il n'est pas documenté et est donc une API privée
Centurion

2
Ce n'est certainement pas une API privée. Consultez le fichier NSString.h et vous le verrez.
Brian Sachetta

3

Je recommande d'utiliser NSLinguisticTagger . Nous pouvons l'utiliser pour rechercherHere 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 produit:

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 His mississippiet isthmusidentifie même à l' isintérieur de isn't.


3

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

2

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true

0

Une solution complète rechercherait d'abord la chaîne (sans espaces ajoutés), puis vérifierait si le caractère immédiatement précédent est vide ou en début de 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. Selon vos besoins , vous pouvez également vérifier ,, ., (), etc.

Une approche alternative, bien sûr, consiste à analyser la chaîne en mots et à vérifier chaque mot individuellement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.