Подтвердить что ты не робот

Цель C: Как извлечь часть строки (например, начать с '#')

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

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

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

Примечание. Вопрос был изменен для ясности.

4b9b3361

Ответ 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];
}

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