Цель C: Как извлечь часть строки (например, начать с '#') - PullRequest
32 голосов
/ 26 июля 2011

У меня есть строка, как показано ниже,

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

Как выбрать только текст, начинающийся с '#' (и заканчивающийся пробелом), в данном случае 'subString1' и 'subString2'?

Примечание: вопрос отредактирован для наглядности

Ответы [ 7 ]

56 голосов
/ 26 июля 2011

Вы можете сделать это, используя 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];

Вот как работает код:

  1. Сканирование до #. Если он не найден, сканер будет в конце строки.
  2. Если сканер находится в конце строки, все готово.
  3. Сканируйте символ #, чтобы его не было на выходе.
  4. Сканирование до пробела с отсканированными символами, сохраненными в substring. Если либо # был последним символом, либо сразу за ним был пробел, метод вернет NO. В противном случае он вернет ДА.
  5. Если символы были отсканированы (метод вернул ДА), добавьте substring в массив substrings.
  6. GOTO 1
33 голосов
/ 26 июля 2011
[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

11 голосов
/ 27 октября 2012

Довольно простая, легкая для понимания версия, избегающая 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];
    }
}
5 голосов
/ 26 июля 2011

Предполагая, что вы ищете первую строку, начинающуюся с фунта и заканчивающуюся пробелом, это может сработать. Передо мной нет кода XCode, так что простите, если где-то есть синтаксическая ошибка или длина равна 1:

-(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 @"";
    }
}
3 голосов
/ 22 августа 2014

Еще одно простое решение:

NSRange hashtag = [aString rangeOfString:@"#"];
NSRange word = [[aString substringFromIndex:hashtag.location] rangeOfString@" "];
NSString *hashtagWord = [aString substringWithRange:NSMakeRange(hashtag.location, word.location)];
1 голос
/ 02 декабря 2015

Вот что я бы сделал:

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.

Надеюсь, это поможет.

0 голосов
/ 05 июня 2015

Общий и простой код для выбора всех слов, начинающихся с «#» в строке NSString:

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];
}

если вам все еще нужна оригинальная строка, вы можете сделать копию. Встроенный условный оператор используется в том случае, если выбранный вами элемент является последним словом

...