78 votes

Comment obtenir une sous-chaîne de NSString?

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

La valeur de retour je veux, c'est @"hello World".

157voto

Regexident Points 17722

Option 1:

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

Option 2:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=value:).+?(?=:value)" options:0 error:nil];
NSRange needleRange = [regex rangeOfFirstMatchInString:haystack options:NSMatchingAnchored range:NSMakeRange(0, haystack.length)];
NSString *needle = [haystack substringWithRange:needleRange];

Celui-ci pourrait être un peu plus haut pour votre trivial cas bien.

Option 3:

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

Celle-ci crée trois chaînes temporaires et un tableau tandis que le fractionnement.


Tous les extraits de supposer que ce qui est recherché est en fait contenue dans la chaîne.

74voto

Shaun Neal Points 397

Ici est un peu moins compliqué de répondre:

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

Voir aussi substringWithRange et substringFromIndex

16voto

Garett Points 192

Voici une fonction simple qui 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];
}

Utilisation:

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

12voto

jeff9888 Points 275

Voici une petite combinaison de @Regexident l'Option 1 et @Garett réponses, pour obtenir une puissante chaîne de coupe entre un préfixe et le suffixe, avec PLUS de...ANDMORE mots sur elle.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X