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.
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
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");
}
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/
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 His
mississippi
et isthmus
et identifie même is
à l'intérieur de isn't
.
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
Avec iOS 8 et Swift, nous pouvons utiliser la méthode localizedCaseInsensitiveContainsString
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
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.