0

我正在尝试从 METAR 天气报告(从http://weather.noaa.gov/pub/data/observations/metar/cycles/下载)中捕获风描述,并从该块中获取风的成分,如果它火柴。正则表达式是@"^([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)"

我正在使用 PDRegex 库将捕获的匹配项枚举到一个数组中。(PDRegex 库可以在https://github.com/carlbrown/RegexOnN ​​SString/blob/master/RegexOnN​​SString/NSString%2BPDRegex.m 上找到)

这些是我的代码中的适用行:

word = @"16008KT"; //test block
NSArray *matches = [word stringsByExtractingGroupsUsingRegexPattern:@"^([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)"];

stringsByExtractingGroupsUsingRegexPattern(一个 PDRegex 方法)被调用并匹配时,它在第 62 行崩溃NSString+PDRegex。这是应用程序崩溃的 PDRegex 行:

NSString *matchedString=[self substringWithRange:[result rangeAtIndex:i]];

这是崩溃报告:

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“-[__NSCFString substringWithRange:]: Range or index out of bounds”

4

3 回答 3

2

我通过在有问题的行上方添加以下检查来解决问题:

if ([result rangeAtIndex:i].length!=0)

出现问题是因为括号中的字符串部分并非都匹配,那些不匹配的范围超出了原始“单词”字符串的范围。

于 2013-02-24T16:02:12.470 回答
1

您似乎调用了索引的范围,因此请确保NSString *matchedString=[self substringWithRange:[result rangeAtIndex:i]];中的索引i 被定义为

于 2013-02-24T07:06:14.720 回答
1

这可能是因为锚点(^)。只有当它位于行首时,您才告诉它匹配模式。(或者如果它不是多行模式,则在整个字符串的开头,但看起来多行模式是默认的。)

如果您想确保您匹配的是真实的风描述,而不是恰好看起来像一个的较长字符串的一部分(例如foo12307KTbar),您可以用单词边界将其包围:

\b([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)\b

在 Objective-C 字符串文字形式中,我相信这将是:

@"\\b([0-9]{3}|VRB)([0-9]{2,3})G?([0-9]{2,3})?(KT|MPS|KMH)\\b"
于 2013-02-24T07:13:40.520 回答