32 votes

Objective-C : Comment extraire une partie d'une chaîne de caractères (par exemple, commencer par '#') ?

J'ai une chaîne de caractères 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' ?

Note : La question a été modifiée pour plus de clarté

0 votes

Comment savez-vous où se terminent les sous-chaînes ?

0 votes

D'après la question, je pense qu'il veut dire tout jusqu'à un espace.

56voto

ughoavgfhw Points 28400

Vous pouvez le faire en utilisant un NSScanner pour diviser la chaîne de caractères. Ce code va parcourir une chaîne de caractères et remplir un tableau avec les 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 le code fonctionne :

  1. Scanner jusqu'à un numéro. S'il n'est pas trouvé, le scanner sera à la fin de la chaîne.
  2. Si l'analyseur est à la fin de la chaîne, nous avons terminé.
  3. Scanner le caractère # pour qu'il ne soit pas dans la sortie.
  4. Scannez jusqu'à un espace, les caractères scannés étant stockés dans la mémoire de l'ordinateur. substring . Si le # est le dernier caractère ou s'il est immédiatement suivi d'un espace, la méthode renvoie NO. Sinon, elle renvoie YES.
  5. Si les caractères ont été scannés (la méthode a retourné YES), ajoutez substring à la substrings le tableau.
  6. GOTO 1

1 votes

Merci beaucoup, ça m'a sauvé ce soir !

35voto

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

vous donnerait la sous-chaîne 1

Vous pouvez calculer la portée en utilisant :

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

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

vous donnerait la sous-chaîne 1

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

y

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

1 votes

Substring1 était juste un exemple. Le codage dur pour rechercher "1" est tout simplement mauvais. Ce n'est pas une bonne solution si vous ne savez pas quelle est la chaîne après #. De plus, cela ne répond pas à la question de l'OP de rechercher chaque occurrence de la chaîne après #. Qu'en est-il de la sous-chaîne 2 ?

11voto

Rob Caraway Points 398

Une version assez simple, facile à comprendre, qui évite NSRange truc :

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

2 votes

Merci ! C'est la meilleure réponse car elle est la plus simple et la plus efficace !

0 votes

Ça me donne un avertissement de comparaison. J'ai dû créer une chaîne de caractères compare=@"#", puis utiliser [word characterAtIndex:0] == [compare characterAtIndex:0].

0 votes

Oui, c'est ça, assez simple +1

5voto

Brain2000 Points 865

En supposant que vous cherchez à trouver la première chaîne qui commence par un dièse et se termine par un espace, cela pourrait fonctionner. Je n'ai pas XCode sous les yeux, alors pardonnez-moi s'il y a une erreur de syntaxe ou une erreur de 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