web-dev-qa-db-fra.com

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

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

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

Comment 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é.

32
Zhen

Vous pouvez le faire en utilisant un NSScanner pour scinder la chaîne. Ce code parcourt une chaîne et remplit 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. Numérisez jusqu'à un #. Si ce n'est pas trouvé, le scanner sera à la fin de la chaîne.
  2. Si le scanner est à la fin de la chaîne, nous avons terminé.
  3. Numérisez le caractère # afin qu'il ne soit pas dans la sortie.
  4. Numérisez dans un espace avec les caractères analysés enregistrés dans substring. Si le # était le dernier caractère ou s'il était immédiatement suivi d'un espace, la méthode retournera NO. Sinon, il retournera OUI.
  5. Si des caractères ont été analysés (la méthode a retourné YES), ajoutez substring au tableau substrings.
  6. GOTO 1
56
ughoavgfhw
[aString substringWithRange:NSMakeRange(13, 10)] 

vous donnerait une sous-chaîne1

Vous pouvez calculer la plage en utilisant:

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

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

vous donnerait une sous-chaîne1

En savoir plus: Position d’un caractère dans une chaîne NSString ou NSMutableString

et 

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

33
Varun Chatterji

Version assez simple et facile à comprendre en évitant les choses NSRange:

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];
    }
}
11
Rob Caraway

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

-(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 @"";
    }
}
5
Brain2000

Une autre solution simple:

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

Voici ce que je ferais:

NSString *givenStringWithWhatYouNeed = @"What you want to look through";
NSArray *listOfWords = [givenStringWithWhatYouNeed componentsSeparatedByString:@" "];
for (NSString *Word in listOfWords) {
    if ([[Word substringWithRange:NSMakeRange(0, 1)]isEqualToString:@"#"]) {
        NSString *whatYouWant = [[Word componentsSeparatedByString:@"#"]lastObject];
    }
}

Ensuite, vous pouvez faire ce dont vous avez besoin avec les instances whatYouWant. Si vous voulez savoir de quelle chaîne il s'agit (s'il s'agit de la sous-chaîne 1 ou 2), vérifiez l'index de chaîne Word dans le tableau listOfWords.

J'espère que ça aide.

1
Septronic

Un code général et simple pour sélectionner tous les mots commençant par "#" dans un NSString est:

NSString * aString = @"This is the #substring1 and #subString2 ...";
NSMutableArray *selection=@[].mutableCopy;
while ([aString rangeOfString:@"#"].location != NSNotFound)
{
    aString = [aString substringFromIndex:[aString rangeOfString:@"#"].location +1];
    NSString *item=([aString rangeOfString:@" "].location != NSNotFound)?[aString substringToIndex:[aString rangeOfString:@" "].location]:aString;
    [selection addObject:item];
}

si vous avez toujours besoin de la chaîne d'origine, vous pouvez en faire une copie . 

0
Enrico Cupellini