我正在使用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,即使它们都不可能匹配某些东西(由于或者|
)。那么对于与任何东西都不匹配的范围返回什么?检查NSRegularExpression
的文档,你会发现它是{NSNotFound, 0}
的范围,即location
成员的值为NSNotFound
。
正是这种“不匹配”的范围会给你错误,因为你没有检查它。
HTH