在Objective-C中parsing以@和#开头的string

所以我试图parsing一个string,它具有以下格式:

baz @ marroon#red#blue#大@猫#狗

或者,也可以用空格分隔:

baz @marroon #red #blue @big @cat #dog

以下是我现在正在做的事情:

- (void) parseTagsInComment:(NSString *) comment { if ([comment length] > 0){ NSArray * stringArray = [comment componentsSeparatedByString:@" "]; for (NSString * word in stringArray){ } } } 

我已经有了空间分隔的组件,但是如果没有空间的话,我该如何迭代这些词呢? 我正在考虑使用正则expression式..但我不知道如何在Objective-C中编写这样的正则expression式。 任何想法,为一个正则expression式,将涵盖这两种情况?

这是我第一次尝试:

 NSError * error; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(@|#)\\S+" options:NSRegularExpressionCaseInsensitive error:&error]; NSArray* wordArray = [regex matchesInString:comment options:0 range:NSMakeRange(0, [comment length])]; for (NSString * word in wordArray){ } 

哪个不起作用..我想我的正则expression式是错误的。

这是一种使用NSScanner的方法,将分隔的string和它们的范围的string表示forms放入一个数组中(假设您的原始string以#开头 – 如果不是,您需要它,在开始处将哈希预先加到string上)。

 NSMutableArray *array = [NSMutableArray array]; NSString *str = @"#baz@marroon#red#blue #big@cat#dog"; NSScanner *scanner = [NSScanner scannerWithString:str]; NSCharacterSet *searchSet = [NSCharacterSet characterSetWithCharactersInString:@"#@"]; NSString *outputString; while (![scanner isAtEnd]) { [scanner scanUpToCharactersFromSet:searchSet intoString:nil]; [scanner scanCharactersFromSet:searchSet intoString:&outputString]; NSString *symbol = [outputString copy]; [scanner scanUpToCharactersFromSet:searchSet intoString:&outputString]; NSString *wholePiece = [[symbol stringByAppendingString:outputString]stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSString *rangeString = NSStringFromRange([str rangeOfString:wholePiece]); [array addObject:wholePiece]; [array addObject:rangeString]; } NSLog(@"%@",array); 

我认为你真正想要的正则expression式是[@#]?\\w+ 。 它会查找可选的以@或#开头的字母组。 你的expression不起作用,因为它寻找任何非空格字符,其中包括@和#。 (根据“单词”中的含义,你可能需要一些或多或less比\w更具体的东西,但这个问题并不清楚。)

如果你需要的范围,那么NSRegularExpression可能效果不错:

 NSString *comment = @"@baz@marroon#red#blue #big@cat#dog"; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[#@]\\w+" options:0 error:nil]; NSArray* wordArray = [regex matchesInString:comment options:0 range:NSMakeRange(0, [comment length])]; for (NSTextCheckingResult *result in wordArray) NSLog(@"%@", [comment substringWithRange:result.range]); 

或者, [@#][a-zA-z]+适用于ASCII字母。