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.

Alex
la source
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
Jacob Relkin
la source
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");
}
Amit Singh
la source
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/

siburb
la source
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.

Frontières de la santé
la source
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
Maniganda Saravanan
la source
2

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true
Govind
la source
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.

Hot Licks
la source