NSRegularExpression如何让NSRange超出范围?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSRegularExpression如何让NSRange超出范围?相关的知识,希望对你有一定的参考价值。

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

以上是关于NSRegularExpression如何让NSRange超出范围?的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 上使用 NSRegularExpression 提取 URL

如何在Objective C(NSRegularExpression)中编写正则表达式?

怎么区分本田NSR P3 的SE 和SP版??

NSPredicate 和 NSRegularExpression

怎样在Swift中使用正则表达式

非贪婪的 NSRegularExpression