NSRegularExpression如何让NSRange超出范围?

问题描述 投票:0回答:1

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

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

ios objective-c cocoa cocoa-touch nsregularexpression
1个回答
1
投票

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

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

和它匹配的字符串:

a
bd
bcd

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

正是这种“不匹配”的范围会给你错误,因为你没有检查它。

HTH

© www.soinside.com 2019 - 2024. All rights reserved.