0

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

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

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

4

3 回答 3

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);
于 2012-05-26T05:55:48.243 回答
1

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

于 2012-05-26T06:47:24.463 回答
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]);

或者,[@#][a-zA-z]+如果您只使用 ASCII 字母单词就可以了。

于 2012-05-26T10:08:59.217 回答