我试图从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/RegexOnNSString/blob/master/RegexOnNSString/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方法)并匹配时,它会在NSString+PDRegex
的第62行崩溃。这是应用程序崩溃的PDRegex系列:
NSString *matchedString=[self substringWithRange:[result rangeAtIndex:i]];
这是崩溃报告:
由于未捕获的异常终止应用' NSRangeException',原因: ' - [__ NSCFString substringWithRange:]:范围或索引越界'
答案 0 :(得分:2)
我通过在有问题的行上方添加以下检查来解决问题:
if ([result rangeAtIndex:i].length!=0)
出现问题是因为并非括号中的所有字符串部分都匹配,那些不匹配的范围超出了原始“word”字符串的范围。
答案 1 :(得分:1)
您似乎在调用输出索引的范围,因此请确保指数中的索引 i NSString * matchedString = [self substringWithRange:[result rangeAtIndex:i]]; 已定义
答案 2 :(得分: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"