nsregularexpression如何使我摆脱界限



我正在使用 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

相关内容

  • 没有找到相关文章

最新更新