目标C:如何提取部分string(例如,以'#'开头)

我有一个string,如下所示,

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

我怎样才能select只以'#'开始(以空格结束)的文本,在这种情况下'subString1'和'subString2'?

注意:为了清晰起见编辑了问题

你可以使用NSScanner来分割string。 这段代码将遍历一个string,并用子string填充一个数组。

 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. 扫描到一个#。 如果没有find,扫描仪将在string的末尾。
  2. 如果扫描器在string的末尾,我们就完成了。
  3. 扫描#字符,使其不在输出中。
  4. 扫描到一个空间,扫描存储在substring的字符。 如果#是最后一个字符,或者紧跟着一个空格,那么方法将返回NO。 否则,它将返回YES。
  5. 如果扫描了字符(方法返回YES),则将substring添加到substrings数组中。
  6. GOTO 1
 [aString substringWithRange:NSMakeRange(13, 10)] 

会给你substring1

您可以使用以下方式计算范围:

 NSRange startRange = [aString rangeOfString:@"#"]; NSRange endRange = [original rangeOfString:@"1"]; NSRange searchRange = NSMakeRange(startRange.location , endRange.location); [aString substringWithRange:searchRange] 

会给你substring1

阅读更多: NSString或NSMutableString中字符的位置

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

很简单,易于理解的版本避免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]; } } 

假设你正在寻找第一个以磅开头的string,并以空格结束,这可能会起作用。 我没有在我面前的XCode,所以请原谅我,如果有一个语法错误或长度closures1某处:

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

另一个简单的方法

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

这是我会做的:

 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实例来做你所需要的。 如果你想知道它是哪一个string(如果是子string1或2),请检查listOfWords数组中string的索引。

我希望这有帮助。

selectNSString中以“#”开始的所有单词的一般和简单的代码是:

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

如果你仍然需要原始string,你可以做一个副本。 内联条件是用来防止你所select的项目是最后一个字