我发现正则表达式存在问题以匹配所有组重复。
这是一个简单的例子:
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"
未按预期捕获。
我已经尝试了从贪婪到懒惰的匹配。
答案 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.
}