在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字母。