Comment puis-je vérifier si une chaîne contient une autre chaîne en Objective-C?
Comment puis-je vérifier si une chaîne de caractères (NSString
) contient une autre chaîne de plus petite?
Je m'attendais à quelque chose comme:
NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);
Mais la plus proche que j'ai pu trouver était:
if ([string rangeOfString:@"hello"] == 0) {
NSLog(@"sub string doesnt exist");
}
else {
NSLog(@"exists");
}
De toute façon, c'est que la meilleure façon de savoir si une chaîne contient une autre chaîne?
- J'aimerais voir il ajouté en tant que bien, mais dans l'intervalle, il est relativement facile d'ajouter comme une catégorie sur NSString.
- À l'aide de
if ([string rangeOfString:@"hello"] == 0) {...}
il y a une erreur d'incompatibilité de type pour NSRange et int. pour corriger cela, vous devez modifier la ligne à la suivante:if ([string rangeOfString:@"hello"].length == 0) {...}
- iOS 8 ajoute containsString: et voici un mini-invasive façon d'ajouter iOS 7 support petersteinberger.com/blog/2014/...
- J'ai été un développeur iOS depuis le début et je ne cesse de revoir ce post pour un rapide copier-coller. Je n'arrive pas à mémoriser celui-ci. Les plus visités stackoverflow post dans mon histoire.
- juste l'utilisation de Swift 😉
Vous devez vous connecter pour publier un commentaire.
La clé est de remarquer que
rangeOfString:
retourne unNSRange
struct, et la documentation dit qu'il renvoie la struct{NSNotFound, 0}
si la "botte de foin" ne contient pas le "aiguille".Et si vous êtes sur iOS 8 ou OS X Yosemite, vous pouvez maintenant faire: (*NOTE: Ce SERA le crash de votre application si ce code est appelé sur un iOS7 appareil).
(C'est aussi comment il fonctionnera en Swift)
[stringToSearch localizedStandardContainsString:string]
a été introduit dans iOS9.[string rangeOfString:@"bla"].location != NSNotFound
sera true lorsque la chaîne estnil
!- (void)setupContainsString { SEL containsStringSelector = @selector(containsString:); IMP containsStringIMP = imp_implementationWithBlock(^(id _self, NSString *string) {\ NSRange range = [_self rangeOfString:string]; return range.length != 0; }); //The method is added only if class has no implementation of it class_addMethod([NSString class], containsStringSelector, containsStringIMP, "c@@:"); }
REMARQUE: Cette réponse est aujourd'hui obsolète
Créer une catégorie pour les NSString:
EDIT: Observer Daniel Galasko de commentaire ci-dessous en matière de nommage
return [self rangeOfString:substring].location != NSNotFound;
et de l'inclure dans mon refactoring de la bibliothèque, es_ios_utils. github.com/peterdeweese/es_ios_utilsDepuis ce qui semble être un haut rang de résultats dans Google, je tiens à ajouter ceci:
iOS 8 et OS X 10.10 ajouter le
containsString:
méthode pourNSString
. Une version mise à jour de Dave DeLong l'exemple de ces systèmes://Vous pouvez aussi l'utiliser à la suite de trop :
Avec iOS 8 et Swift, nous pouvons utiliser
localizedCaseInsensitiveContainsString
méthodeDonc personnellement je déteste vraiment
NSNotFound
mais en comprendre la nécessité.Mais certaines personnes peuvent ne pas comprendre les complexités de la comparaison de contre NSNotFound
Par exemple, ce code:
a ses problèmes:
1) Évidemment, si
otherString = nil
ce code panne. un test simple serait:résultats !! CRASH !!
2) Ce n'est pas évident pour quelqu'un de nouveau à l'objective-c est que le même code ne va PAS planter quand
string = nil
.Par exemple, ce code:
et ce code:
permettra à la fois de résultat dans
Qui n'est clairement PAS ce que vous voulez.
Donc, la meilleure solution qui, je crois, consiste à utiliser le fait que rangeOfString renvoie la longueur de 0 alors un mieux plus fiable code est: est-ce
OU TOUT SIMPLEMENT:
qui seront pour les cas 1 et 2 sera de retour
C'est mes 2 cents 😉
S'il vous plaît vérifier mon Gist pour plus de code utile.
Une version améliorée de P's solution, de la catégorie sur NSString, que dire, si une chaîne dans une autre chaîne, mais prend également une gamme par référence est:
L'utiliser comme:
Voici un copier-coller de la fonction extrait:
Oneliner (plus Petite quantité de code. SEC, car vous avez seulement un
NSLog
):essayer cela,
Meilleure solution. Aussi simple que cela! Si vous souhaitez trouver un mot ou une
partie de la chaîne. Vous pouvez utiliser ce code. Dans cet exemple, nous allons vérifier si la valeur de la parole contient "acter".
Si vous avez besoin cette fois d'écrire:
Dans le cas de swift, ce qui peut être utilisé
Dans Swift 4:
Si ne pas s'inquiéter chaîne sensible à la casse.
Essayez cette fois.
Veuillez utilisez ce code
Utiliser l'option NSCaseInsensitiveSearch avec rangeOfString:options:
Résultat de sortie est trouvé:Oui
Les options peuvent être "ou ed" ensemble et comprennent:
NSCaseInsensitiveSearch
NSLiteralSearch
NSBackwardsSearch et plus
Première chaîne de contenir ou non de la deuxième chaîne,
SWift 4 Et Au-Dessus De
Essayez ceci:
Swift 4.1 , 4.2:
Pour Objective-C:
Si certaine position de la chaîne est nécessaire, ce code provient de la place dans Swift 3.0: