目标c试图从正则表达式中提取字符串组

时间:2013-01-29 09:33:44

标签: objective-c regex

我尝试从字符串中提取简单的字符串而不成功它看起来很简单,但结果却是如此 字符串
这就是我所拥有的:

-(NSString*) ExtractArtistNameFromString:(NSString*) line
{

    NSString* substringForMatch = @""   
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d+\\s+(.*)"
                                                                        options:NSRegularExpressionCaseInsensitive
                                                                        error:&error];

    if (error) {
        NSLog(@"Error:%@", error);  
    }

    NSArray *matches = [regex matchesInString:line
                                              options:0
                                              range:NSMakeRange(0, [line length])]; 

    NSUInteger elements = [matches count];
    NSLog(@"numberOfMatches:%u",elements);

    if(elements > 0)
    {

        for(NSTextCheckingResult *match in matches)
        {
            NSString* substringForMatch = [line substringWithRange:match.range];
            NSUInteger slen = [substringForMatch length];
            NSLog(@"Extracted  : %@",substringForMatch);
            NSLog(@"%u",slen);
            NSLog(@"%@",substringForMatch);
        }        
    }
    return substringForMatch;
} 

输入字符串是:

  

1 Barsotti,Marcel

我试图提取的名称是: Barsotti,Marcel

当我运行应用程序时,我得到了这个结果:

2013-01-29 11:31:24.056 file_parser[2496] numberOfMatches:1
2013-01-29 11:31:24.062 file_parser[2496] Extracted  : 1        Barsotti, Marcel
2013-01-29 11:31:24.064 file_parser[2496] 18
2013-01-29 11:31:24.066 file_parser[2496] 1     Barsotti, Marcel

我在windows中使用GNUsetup,make命令是:

  

make CC = clang

1 个答案:

答案 0 :(得分:1)

我明白你要做什么。 NSTextCheckingResult的文档显示结果中可能包含多个范围,但您只是引用第一个范围。

例如,您的RegEx和您的字符串将匹配1个,其中包含1个捕获组。这些是:

  1. 1 Barsotti,Marcel
  2. Barsotti,Marcel
  3. 虽然您只有一个NSTextCheckingResult,但其中有多个范围。你正在使用

    NSString* substringForMatch = [line substringWithRange:match.range];
    

    这将返回上面列出的第一个结果。你想要的是第二个。为了得到这个,你需要使用

    NSString* substringForMatch = [line substringWithRange:[match rangeAtIndex:1]];
    

    为确保不超过rangeAtIndex:,属性numberOfRanges存在,以允许您保持在范围内。请注意,[match rangeAtIndex:0]上的match.range是相同的。