Question Comment puis-je vérifier si une chaîne contient une autre chaîne dans Objective-C?


Comment puis-je vérifier si une chaîne (NSString) contient une autre chaîne plus petite?

J'espérais quelque chose comme:

NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);

Mais le plus proche que j'ai pu trouver était:

if ([string rangeOfString:@"hello"] == 0) {
    NSLog(@"sub string doesnt exist");
} 
else {
    NSLog(@"exists");
}

Quoi qu'il en soit, est-ce la meilleure façon de trouver si une chaîne contient une autre chaîne?


1141
2018-05-02 15:34


origine


Réponses:


NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}

La clé est de noter que rangeOfString: retourne un NSRange struct, et la documentation dit qu'il renvoie la structure {NSNotFound, 0} si la "meule de foin" ne contient pas "l'aiguille".


Et si vous êtes sur iOS 8 ou OS X Yosemite, vous pouvez maintenant faire: (* REMARQUE: Cela va bloquer votre application si ce code est appelé sur un appareil iOS7).

NSString *string = @"hello bla blah";
if ([string containsString:@"bla"]) {
  NSLog(@"string contains bla!");
} else {
  NSLog(@"string does not contain bla");
}

 


2360
2018-05-02 16:20



NOTE: Cette réponse est maintenant obsolète

Créez une catégorie pour NSString:

@interface NSString ( SubstringSearch )
    - (BOOL)containsString:(NSString *)substring;
@end

// - - - - 

@implementation NSString ( SubstringSearch )

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

@end

EDIT: Observez le commentaire de Daniel Galasko ci-dessous concernant la dénomination 


155
2017-07-09 02:40



Comme cela semble être un résultat de haut niveau dans Google, je veux ajouter ceci:

iOS 8 et OS X 10.10 ajouter le containsString: méthode pour NSString. Une version mise à jour de l'exemple de Dave DeLong pour ces systèmes:

NSString *string = @"hello bla bla";
if ([string containsString:@"bla"]) {
    NSLog(@"string contains bla!");
} else {
    NSLog(@"string does not contain bla");
}

47
2018-06-08 21:14



NSString *myString = @"hello bla bla";
NSRange rangeValue = [myString rangeOfString:@"hello" options:NSCaseInsensitiveSearch];

if (rangeValue.length > 0)
{
    NSLog(@"string contains hello");
} 
else 
{
    NSLog(@"string does not contain hello!");
}

// Vous pouvez alternativement utiliser aussi:

if (rangeValue.location == NSNotFound) 
{
    NSLog(@"string does not contain hello");
} 
else 
{
    NSLog(@"string contains hello!");
}

35
2018-06-27 12:40



Avec iOS 8 et Rapide, on peut utiliser localizedCaseInsensitiveContainsString  méthode

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

 string.localizedCaseInsensitiveContainsString(substring) // true

21
2018-06-25 08:53



Donc, personnellement, je déteste vraiment NSNotFound mais comprenez sa nécessité.

Mais certaines personnes peuvent ne pas comprendre la complexité de la comparaison avec NSNotFound

Par exemple, ce code:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if([string rangeOfString:otherString].location != NSNotFound)
        return YES;
    else
        return NO;
}

a ses problèmes:

1) Évidemment si otherString = nil ce code va planter. un test simple serait:

NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");

résulte en !! CRASH !!

2) Ce qui n'est pas si évident pour quelqu'un de nouveau à l'objectif-c est que le même code ne va pas tomber en panne quand string = nil. Par exemple, ce code:

NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");

et ce code:

NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");

entraînera à la fois

does string contains string - YES

Ce qui n'est clairement PAS ce que vous voulez.

Donc la meilleure solution que je crois fonctionne est d'utiliser le fait que rangeOfString renvoie la longueur de 0 alors un meilleur code plus fiable est ceci:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if(otherString && [string rangeOfString:otherString].length)
        return YES;
    else
        return NO;
}

OU SIMPLEMENT:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    return (otherString && [string rangeOfString:otherString].length);
}

ce qui sera pour les cas 1 et 2 reviendra

does string contains string - NO

C'est mes 2 cents ;-)

S'il vous plaît vérifier mon Essentiel pour plus de code utile.


12
2017-08-06 06:36



Une version améliorée de P ila solution, une catégorie sur NSString, qui non seulement dira, si une chaîne est trouvée dans une autre chaîne, mais prend aussi une plage par référence, est:

@interface NSString (Contains)
-(BOOL)containsString: (NSString*)substring
              atRange:(NSRange*)range;

-(BOOL)containsString:(NSString *)substring;
@end

@implementation NSString (Contains)

-(BOOL)containsString:(NSString *)substring
              atRange:(NSRange *)range{

    NSRange r = [self rangeOfString : substring];
    BOOL found = ( r.location != NSNotFound );
    if (range != NULL) *range = r;
    return found;
}

-(BOOL)containsString:(NSString *)substring
{
    return [self containsString:substring
                        atRange:NULL];
}

@end

Utilisez-le comme:

NSString *string = @"Hello, World!";

//If you only want to ensure a string contains a certain substring
if ([string containsString:@"ello" atRange:NULL]) {
    NSLog(@"YES");
}

// Or simply
if ([string containsString:@"ello"]) {
    NSLog(@"YES");
}

//If you also want to know substring's range
NSRange range;
if ([string containsString:@"ello" atRange:&range]) {
    NSLog(@"%@", NSStringFromRange(range));
}

11
2018-01-29 23:48



Voici un extrait de fonction copier-coller:

-(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText
{
    return [StrText rangeOfString:StrSearchTerm 
        options:NSCaseInsensitiveSearch].location != NSNotFound;
}

8
2017-08-29 15:07



Oneliner (Plus petite quantité de code, DRY, car vous n'en avez qu'une NSLog):

NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 

6
2018-01-29 23:21