我正在使用 NSRegularExpression
来查找文本上的字符串。这样的东西:
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:@"<a href="(.*)">(.*)</a>[:blank:]|[:blank:](.*)\n\n\n"
options:NSRegularExpressionCaseInsensitive
error:&error];
然后,我使用以下方式枚举结果:
[regex enumerateMatchesInString:textContent options:0 range:NSMakeRange(0, [textContent length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
}];
块内部,由于结果可以具有多个范围,所以我有这些行:
NSInteger numberOfRanges = [match numberOfRanges];
// then I enumerate the ranges
for (int i=0; i<[match numberOfRanges]; i++) {
NSRange range = [match rangeAtIndex:i];
// The problem here is that some ranges come out of bounds
}
问题是,在列举范围时,有些范围不超出范围。如果代码本身找到这些范围,那怎么可能?
问问自己,当正则表达式中的括号表达式无匹配时会发生什么?例如,考虑re:
(a)|(b)(c)?(d)
及其匹配的字符串:
a
bd
bcd
现在在RE中始终四个括号的表达式,因此numberOfRanges
始终是4个,即使所有人永远都不可能匹配某些东西(由于OR |
)。那么,对于不匹配任何东西的范围,返回了什么呢?检查NSRegularExpression
的文档,您会发现它是{NSNotFound, 0}
范围,即location
成员具有值NSNotFound
。
,正是这个"无匹配"范围给您带来了错误,因为您不检查它。
hth