web-dev-qa-db-fra.com

Comment 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 le meilleur moyen de déterminer si une chaîne contient une autre chaîne?

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

La clé remarque que rangeOfString: renvoie une structure NSRange, et la documentation indique qu'il renvoie la structure {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 désormais faire ce qui suit: (* REMARQUE: Ceci plantera 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");
}

(C'est aussi comme ça que ça marcherait à Swift)

????

2417
Dave DeLong

REMARQUE: 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

158
P i

Étant donné que cela semble être un résultat élevé dans Google, je souhaite ajouter ceci:

iOS 8 et OS X 10.10 ajoutent la méthode containsString: à 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");
}
_
52
Lukas
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 aussi utiliser ce qui suit:

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

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true
22
iGo

Donc personnellement, je déteste vraiment NSNotFound mais je comprends 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 un nouvel utilisateur d’objectif-c, c’est que le même code ne plantera PAS lorsque 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 qui, à mon avis, fonctionne est d'utiliser le fait que rangeOfString renvoie la longueur de 0; un code plus fiable est donc le suivant:

- (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);
}

qui reviendra pour les cas 1 et 2

does string contains string - NO

C'est mes 2 centimes ;-)

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

13
ucangetit

Une version améliorée de la solution de P i , une catégorie sur NSString, qui non seulement dira, si une chaîne est trouvé dans une autre chaîne, mais prend également 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));
}
12
vikingosegundo

Voici un extrait de fonction copier-coller:

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

Oneliner (Plus petite quantité de code. DRY, car vous n'avez qu'un seul NSLog):

NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 
6
jerik
NSString *categoryString = @"Holiday Event";
if([categoryString rangeOfString:@"Holiday"].location == NSNotFound)
{
    //categoryString does not contains Holiday
}
else
{
    //categoryString contains Holiday
}
6
Ada

Meilleure solution. Aussi simple que ça! Si vous voulez 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 Word contient "acter".

NSString *Word =@"find a Word or character here";
if ([Word containsString:@"acter"]){
    NSLog(@"It contains acter");
} else {
     NSLog (@"It does not contain acter");
}
5
handiansom

essaye ça,

NSString *string = @"test Data";
if ([[string lowercaseString] rangeOfString:@"data"].location == NSNotFound) 
{
    NSLog(@"string does not contain Data");
}   
else 
{
    NSLog(@"string contains data!");
}
5
Pooja Patel

En cas de Swift, cela peut être utilisé

let string = "Package #23"
if string.containsString("Package #") {
    //String contains substring
}
else {
    //String does not contain substring
}
4
Sreedeepkesav M S

Dans Swift 4:

let a = "Hello, how are you?"
a.contains("Hello")   //will return true
4
Ankit garg

Si vous en avez besoin une fois, écrivez:

NSString *stringToSearchThrough = @"-rangeOfString method finds and returns the range of the first occurrence of a given string within the receiver.";
BOOL contains = [stringToSearchThrough rangeOfString:@"occurence of a given string"].location != NSNotFound;
4
Nikolay Shubenkov

Si vous ne vous souciez pas de la chaîne de caractères sensible à la casse. Essayez ceci une fois.

NSString *string  = @"Hello World!";

if([string rangeOfString:@"hello" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    NSLog(@"found");
}
else
{
    NSLog(@"not found");
}
2
Abhijit

Utilisez l'option NSCaseInsensitiveSearch avec rangeOfString: options:

NSString *me = @"toBe" ;
NSString *target = @"abcdetobe" ;
NSRange range = [target  rangeOfString: me options: NSCaseInsensitiveSearch];
NSLog(@"found: %@", (range.location != NSNotFound) ? @"Yes" : @"No");
if (range.location != NSNotFound) {
// your code
}

Le résultat de sortie est trouvé: oui

Les options peuvent être regroupées et comprennent:

NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch et plus

1
Nayab Muhammad

S'il vous plaît utiliser ce code

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

La première chaîne contient ou non la deuxième chaîne,

NSString *first = @"Banana";
NSString *second = @"BananaMilk";
NSRange range = [first rangeOfString:second options:NSCaseInsensitiveSearch];

if (range.length > 0) {
    NSLog(@"Detected");
}
else {
    NSLog(@"Not detected");
}
0
Kamani Jasmin

Swift 4 et ci-dessus

 let str = "Hello iam midhun"

   if str.contains("iam") {
     //contain substring
   }
   else {
     //doesn't contain substring
   }
0
midhun p

Essaye ça:

Swift 4.1, 4.2:

let stringData = "Black board"

//Swift quick way and case sensitive
if stringData.contains("bla") {
    print("data contains string");
}

//case sensitive
if stringData.range(of: "bla",options: .caseInsensitive) != nil {
    print("data contains string");
}else {
    print("data does not contains string");
}

pour Objective-C:

NSString *stringData = @"Black board";

//Quick way and case sensitive
if ([stringData containsString:@"bla"]) {
    NSLog(@"data contains string");
}

//Case Insensitive
if ([stringData rangeOfString:@"bla" options:NSCaseInsensitiveSearch].location != NSNotFound) {
   NSLog(@"data contains string");
}else {
   NSLog(@"data does not contain string");
}
0
Amir.n3t