0

我尝试从字符串中提取简单的字符串但没有成功,它看起来很简单,但结果总是因为
这里的字符串是我所拥有的:

-(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

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

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 命令是:

使 CC=clang

4

1 回答 1

1

我明白你想做什么。NSTextCheckingResult的文档显示结果中可以有多个范围,但您只引用第一个范围。

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

  1. 1 巴索蒂,马塞尔
  2. 巴索蒂,马塞尔

虽然您只有一个NSTextCheckingResult,但其中有多个范围。你正在使用

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

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

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

为确保您不超过rangeAtIndex:,该属性的numberOfRanges存在是为了让您保持在范围内。请记住,[match rangeAtIndex:0]match.range.

于 2013-01-29T10:16:52.997 回答