web-dev-qa-db-fra.com

Comment obtenir une sous-chaîne de NSString?

Si je veux obtenir une valeur de NSString @"value:hello World:value", que dois-je utiliser?

La valeur de retour que je veux est @"hello World".

76
Csabi

Option 1:

NSString *haystack = @"value:hello World:value";
NSString *haystackPrefix = @"value:";
NSString *haystackSuffix = @":value";
NSRange needleRange = NSMakeRange(haystackPrefix.length,
                                  haystack.length - haystackPrefix.length - haystackSuffix.length);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle); // -> "hello World"

Option 2:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)];
NSRange needleRange = [match rangeAtIndex: 1];
NSString *needle = [haystack substringWithRange:needleRange];

Celui-ci pourrait être un peu excessif pour votre cas plutôt trivial cependant.

Option 3:

NSString *needle = [haystack componentsSeparatedByString:@":"][1];

Celui-ci crée trois chaînes temporaires et un tableau lors du fractionnement.


Tous les extraits supposent que ce qui est recherché est réellement contenu dans la chaîne.

156
Regexident

Voici une réponse un peu moins compliquée:

NSString *myString = @"abcdefg";
NSString *mySmallerString = [myString substringToIndex:4];

Voir aussi substringWithRange et substringFromIndex

71
Shaun Neal

Voici une fonction simple qui vous permet de faire ce que vous cherchez:

- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator
{
    NSRange firstInstance = [value rangeOfString:separator];
    NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator];
    NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location);

    return [value substringWithRange:finalRange];
}

Usage:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"];
16
Garett

Voici une petite combinaison des réponses @Regexident Option 1 et @Garett, pour obtenir un coupe-fil puissant entre un préfixe et un suffixe, avec des mots MORE ... ANDMORE.

NSString *haystack = @"MOREvalue:hello World:valueANDMORE";
NSString *prefix = @"value:";
NSString *suffix = @":value";
NSRange prefixRange = [haystack rangeOfString:prefix];
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix];
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle);
12
Jeffrey Neo

Utilisez ceci aussi

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];

Remarque - Votre NSMakeRange(start, end) doit être NSMakeRange(start, end- start);

12
Abhishek Mishra