32 votes

Objectif C: Comment extraire une partie d'une chaîne (par exemple commencer par '#')

J'ai une chaîne comme indiqué ci-dessous,

 NSString * aString = @"This is the #substring1 and #subString2 I want";
 

Comment puis-je sélectionner uniquement le texte commençant par '#' (et se terminant par un espace), dans ce cas 'subString1' et 'subString2'?

Remarque: la question a été modifiée pour plus de clarté

56voto

ughoavgfhw Points 28400

Vous pouvez le faire à l'aide d'un NSScanner de diviser la chaîne en place. Ce code permet de faire une boucle par une chaîne et de remplir un tableau avec des sous-chaînes.

NSString * aString = @"This is the #substring1 and #subString2 I want";
NSMutableArray *substrings = [NSMutableArray new];
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before #
while(![scanner isAtEnd]) {
    NSString *substring = nil;
    [scanner scanString:@"#" intoString:nil]; // Scan the # character
    if([scanner scanUpToString:@" " intoString:&substring]) {
        // If the space immediately followed the #, this will be skipped
        [substrings addObject:substring];
    }
    [scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before next #
}
// do something with substrings
[substrings release];

Voici comment fonctionne le code:

  1. Analyser jusqu'à un #. Si elle n'est pas trouvée, le scanner sera à la fin de la chaîne.
  2. Si le scanner est à la fin de la chaîne, nous sommes fait.
  3. Analyse le caractère#, de sorte qu'il n'est pas dans la sortie.
  4. Numérisez jusqu'à un espace, avec les personnages qui sont numérisés stockés dans substring. Si le # a été le dernier caractère, ou qui était immédiatement suivi d'un espace, la méthode retournera PAS. Sinon, il sera de retour OUI.
  5. Si les personnages ont été numérisés (le renvoi de la méthode OUI), ajoutez - substring de la substrings tableau.
  6. GOTO 1

35voto

Varun Chatterji Points 2114
[aString substringWithRange:NSMakeRange(13, 10)] 

serait vous donner substring1

Vous pouvez calculer la distance à l'aide de:

NSRange startRange = [aString rangeOfString:@"#"];
NSRange endRange = [original rangeOfString:@"1"];

NSRange searchRange = NSMakeRange(startRange.location , endRange.location);
[aString substringWithRange:searchRange] 

serait vous donner substring1

Lire la suite: La Position d'un caractère dans une NSString ou NSMutableString

et

http://iphonedevelopertips.com/cocoa/nsrange-and-nsstring-objects.html

11voto

Rob Caraway Points 398

Version assez simple et facile à comprendre, évitant les NSRange stuff:

 NSArray * words = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
NSMutableArray * mutableWords = [NSMutableArray new];
for (NSString * word in words){
    if ([word length] > 0 && [word characterAtIndex:0] == '#'){
        NSString * editedWord = [word substringFromIndex:1];
        [mutableWords addObject:editedWord];
    }
}
 

5voto

Brain2000 Points 865

En supposant que vous cherchiez à trouver la première chaîne qui commence par une livre et se termine par un espace, cela pourrait fonctionner. Je n'ai pas de XCode devant moi, alors pardonnez-moi s'il y a une erreur de syntaxe ou une longueur de 1 quelque part:

 -(NSString *)StartsWithPound:(NSString *)str {
    NSRange range = [str rangeOfString:@"#"];
    if(range.length) {
        NSRange rangeend = [str rangeOfString:@" " options:NSLiteralSearch range:NSMakeRange(range.location,[str length] - range.location - 1)];
        if(rangeend.length) {
            return [str substringWithRange:NSMakeRange(range.location,rangeend.location - range.location)];
        }
        else
        {
            return [str substringFromIndex:range.location];
        }
    }
    else {
        return @"";
    }
}
 

4voto

Kris Jurgowski Points 360

Une autre solution simple:

 NSRange hashtag = [aString rangeOfString:@"#"];
NSRange word = [[aString substringFromIndex:hashtag.location] rangeOfString@" "];
NSString *hashtagWord = [aString substringWithRange:NSMakeRange(hashtag.location, word.location)];
 

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