Objective-C,正则表达式匹配重复

时间:2014-07-08 12:12:10

标签: objective-c regex nsregularexpression

我发现正则表达式存在问题以匹配所有组重复。

这是一个简单的例子:

NSString *string = @"A1BA2BA3BC";
NSString *pattern = @"(A[^AB]+B)+C";

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
NSArray *array = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];

返回array有一个元素包含两个范围,整个输入字符串和最后捕获的组"A3B"。前两个组"A1B""A2B"未按预期捕获。

我已经尝试了从贪婪到懒惰的匹配。

1 个答案:

答案 0 :(得分:1)

量词不会产生新的捕获组

除了具有CaptureCollections的.NET之外,向捕获组添加量词不会创建更多捕获。组编号保持不变(在您的情况下为组1),返回的内容是组的最后一次捕获。

<强>参考

Everything about Regex Capture Groups(请参阅自动生成新的捕获组

迭代论坛

如果你想匹配所有的子串,同时仍然确认它们是有效的字符串(由这些组组成并以C结尾),你可以使用:

 A[^AB]+B(?=(?:A[^AB]+B)*C)

当然,整个字符串都是

^(?:A[^AB]+B)+C$

迭代子串:类似

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"A[^AB]+B(?=(?:A[^AB]+B)*C)" options:0 error:&error];
NSArray *matches = [regex matchesInString:subject options:0 range:NSMakeRange(0, [subject length])];
NSUInteger matchCount = [matches count];
if (matchCount) {
    for (NSUInteger matchIdx = 0; matchIdx < matchCount; matchIdx++) {
        NSTextCheckingResult *match = [matches objectAtIndex:matchIdx];
        NSRange matchRange = [match range];
        NSString *result = [subject substringWithRange:matchRange];
    }
}
else {  // Nah... No matches.
     }