Цель C: Как извлечь часть строки (например, начать с '#')
У меня есть строка, как показано ниже,
NSString * aString = @"This is the #substring1 and #subString2 I want";
Как я могу выбрать только текст, начинающийся с "#" (и заканчивается пробелом), в данном случае "subString1" и "subString2"?
Примечание. Вопрос был изменен для ясности.
Ответы
Ответ 1
Вы можете сделать это, используя NSScanner, чтобы разбить строку вверх. Этот код будет проходить через строку и заполнить массив подстроками.
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];
Вот как работает код:
- Сканировать до #. Если он не найден, сканер будет в конце строки.
- Если сканер находится в конце строки, мы закончили.
- Отсканируйте символ # так, чтобы он не находился на выходе.
- Сканировать до пробела, с отсканированными символами, хранящимися в
substring
. Если либо символ # был последним, либо сразу же за ним пробел, метод вернет NO. В противном случае он вернет YES.
- Если символы были отсканированы (метод вернулся ДА), добавьте
substring
в массив substrings
.
- GOTO 1
Ответ 2
[aString substringWithRange:NSMakeRange(13, 10)]
даст вам подстроку1
Вы можете рассчитать диапазон, используя:
NSRange startRange = [aString rangeOfString:@"#"];
NSRange endRange = [original rangeOfString:@"1"];
NSRange searchRange = NSMakeRange(startRange.location , endRange.location);
[aString substringWithRange:searchRange]
даст вам подстроку1
Подробнее:
Позиция символа в NSString или NSMutableString
и
http://iosdevelopertips.com/cocoa/nsrange-and-nsstring-objects.html
Ответ 3
Довольно простая, понятная версия, избегающая 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];
}
}
Ответ 4
Предполагая, что вы ищете первую строку, которая начинается с фунта и заканчивается пробелом, это может сработать. У меня нет XCode передо мной, так что простите меня, если есть синтаксическая ошибка или длина где-то где-то:
-(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
Еще одно простое решение:
NSRange hashtag = [aString rangeOfString:@"#"];
NSRange word = [[aString substringFromIndex:hashtag.location] [email protected]" "];
NSString *hashtagWord = [aString substringWithRange:NSMakeRange(hashtag.location, word.location)];
Ответ 6
Это то, что я сделал бы:
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];
}
}
Затем вы можете делать то, что вам нужно, с экземплярами whatYouWant
. Если вы хотите узнать, какая строка (если это подстрока 1 или 2), проверьте индекс строки word
в массиве listOfWords
.
Надеюсь, это поможет.
Ответ 7
Общий и простой код для выбора всех слов, начинающихся с "#" в NSString, это:
NSString * aString = @"This is the #substring1 and #subString2 ...";
NSMutableArray *[email protected][].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];
}
если вам все еще нужна оригинальная строка, вы можете сделать копию.
Инлайн-условие используется в том случае, если ваш выбранный элемент является последним словом