在objective-C中解析以@和#开头的字符串

时间:2012-05-26 04:18:25

标签: iphone objective-c ios regex ipad

所以我试图解析一个具有以下格式的字符串:

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

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

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

以下是我现在的表现:

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

        }
    }
}

我已经通过空间工作分离了组件,但如果它没有空间怎么办...如何迭代这些单词?我正在考虑使用正则表达式..但我不知道如何在Objective-C中编写这样的正则表达式。任何想法,对于能够涵盖这两种情况的正则表达式吗?

这是我的第一次尝试:

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){

    }

哪个不起作用..我认为我的正则表达式是错误的。

3 个答案:

答案 0 :(得分:2)

这是一种使用NSScanner的方法,它将分离的字符串和它们的范围的字符串表示形式放入一个数组中(这假设您的原始字符串以#开头 - 如果它没有,您需要它,然后在开始时将哈希预先添加到字符串中。

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);

答案 1 :(得分:1)

我认为你真正想要的正则表达式是[@#]?\\w+。它会找到一组字母,可选地以@或#开头。你的表达式不起作用,因为它寻找任何非空格字符,包括@和#。 (根据“单词”中的内容,您可能需要比\w更具特异性的内容,但问题并不清楚。)

答案 2 :(得分:0)

如果你需要范围,那么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]);

或者,如果您只使用ASCII alpha字,则[@#][a-zA-z]+可以正常工作。