gpt4 book ai didi

objective-c - NSRegularExpression 从 numberOfRanges 方法给出了错误的结果

转载 作者:行者123 更新时间:2023-12-03 17:02:05 27 4
gpt4 key购买 nike

我的代码很小

创建一个新的 XCode 项目并运行此代码:

NSString *stringToCheck = @"## master...origin/master [ahead 1, behind 1]";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\[(ahead) (\\d), (behind) (\\d)\\]|\\[(behind) (\\d)\\]|\\[(ahead) (\\d)\\]" options:0 error:nil];

NSArray* matches = [regex matchesInString:stringToCheck options:0 range:NSMakeRange(0, [stringToCheck length])];
NSTextCheckingResult *match = [matches firstObject];
NSUInteger numberOfRanges = [match numberOfRanges];

numberOfRanges 我得到 = 9。但这不应该是 5 吗?

编辑:更多信息数据可以有 3 种形式

1. ## master...origin/master [ahead 1, behind 1]
2. ## master...origin/master [ahead 1]
3. ## master...origin/master [behind 1]

我如何编写代码来考虑所有 3 个场景?在不知道找到哪个匹配项的情况下,我不知道如何继续。根据下面的一个答案,似乎 [match numberOfRanges] 将返回完整的匹配计数,无论是否找到。

如果数据恰好是 #1,则 [match rangeOfIndex:0-4] 方法有效。其他索引失败。

如果数据恰好是 #2,则 [match rangeOfIndex:5-6] 方法有效。其他人失败

如果数据恰好是 #3,则 [match rangeOfIndex:7-8] 方法有效。其他人则失败了。

那么我如何判断哪个组被捕获,以便我知道要搜索哪个范围?

编辑:根据给出的响应进行回答

    if ([match rangeAtIndex:1].location != NSNotFound) { // The First capture group
aheadCount = [stringToCheck substringWithRange:[match rangeAtIndex:2]];
behindCount = [stringToCheck substringWithRange:[match rangeAtIndex:4]];
} else if ([match rangeAtIndex:5].location != NSNotFound) { //The second Capture group
aheadCount = [stringToCheck substringWithRange:[match rangeAtIndex:6]];
} else if ([match rangeAtIndex:7].location != NSNotFound) { //The third capture group
behindCount = [stringToCheck substringWithRange:[match rangeAtIndex:8]];
}

最佳答案

模式中的每个组 (...) 都会产生一个匹配范围,整个模式(索引为 0)也会产生匹配范围 - 总共为 9。使用 or ,|,不会改变这一点,因此编号保持一致 - 每个组都有一个唯一的编号。

在您的示例中,如果您检查所有范围,您会发现对于匹配 5 到 8,NSRange location 值是 NSNotFound 作为您的字符串与包含组 1 到 4 的第一个替代项匹配。

注意:由于每个组都有唯一的编号,通过测试 NSNotFound 您可以确定哪个替代项已匹配。

关于objective-c - NSRegularExpression 从 numberOfRanges 方法给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31891627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com