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é.
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:
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.substring
au tableau substrings
.[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
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];
}
}
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 @"";
}
}
Une autre solution simple:
NSRange hashtag = [aString rangeOfString:@"#"];
NSRange Word = [[aString substringFromIndex:hashtag.location] rangeOfString@" "];
NSString *hashtagWord = [aString substringWithRange:NSMakeRange(hashtag.location, Word.location)];
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.
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 .