NSRegularExpression如何让NSRange超出范围?

时间:2017-12-16 13:28:05

标签: ios objective-c cocoa cocoa-touch 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
}

在块中,因为结果可以有多个范围,我有以下几行:

summary

问题在于,在枚举范围时,有些是超出范围的。如果这些范围是由代码本身找到的,那该怎么办?

1 个答案:

答案 0 :(得分:1)

问问自己当正则表达式中带括号的表达式什么都不匹配时会发生什么?例如,考虑RE:

(a)|(b)(c)?(d)

和它匹配的字符串:

a
bd
bcd

现在在RE中有总是四个带括号的表达式,所以numberOfRanges总是4,即使它们永远不可能匹配某些东西(由于或|)。那么对于一个与任何东西都不匹配的范围返回什么?查看NSRegularExpression的文档,您会发现它是范围{NSNotFound, 0},即location成员的值为NSNotFound

这是&#34;没有匹配&#34;因为你不检查错误而给你错误的范围。

HTH