我尝试从字符串中提取简单的字符串而不成功它看起来很简单,但结果却是如此
字符串
这就是我所拥有的:
-(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
答案 0 :(得分:1)
我明白你要做什么。 NSTextCheckingResult的文档显示结果中可能包含多个范围,但您只是引用第一个范围。
例如,您的RegEx和您的字符串将匹配1个,其中包含1个捕获组。这些是:
虽然您只有一个NSTextCheckingResult
,但其中有多个范围。你正在使用
NSString* substringForMatch = [line substringWithRange:match.range];
这将返回上面列出的第一个结果。你想要的是第二个。为了得到这个,你需要使用
NSString* substringForMatch = [line substringWithRange:[match rangeAtIndex:1]];
为确保不超过rangeAtIndex:
,属性numberOfRanges
存在,以允许您保持在范围内。请注意,[match rangeAtIndex:0]
上的match.range
是相同的。