为什么在我的正则expression式中有多个捕获组会崩溃我的应用程序?

无论正则expression式是什么,> 1捕获组将会崩溃这个代码,并出现以下错误。

由于未捕获的exception'NSRangeException',原因:' – [__ NSCFString substringWithRange:]:范围{9223372036854775807,0}越界; 弦长279'

public extension String { //Multi use parsing function func regexParse(pattern:String, captureGroup:Int, caseSensitive:Bool) ->[String] { do { //Creates empty results array. var resultsArray = [""] //Sets Case sensitivity var caseSensitivity = NSRegularExpressionOptions.CaseInsensitive if(caseSensitive) { caseSensitivity = NSRegularExpressionOptions.init(rawValue: 0) } //Sets regex to correct pattern let regex = try NSRegularExpression(pattern: pattern, options: caseSensitivity) //Converts string to NSString as swift doesn't support regex let nsString = self as NSString //Sets parsing range to the entire string let all = NSMakeRange(0, nsString.length) //Enumerates through all matches and extracts the 1st capture bracket for each match and adds it to the resultsArray. regex.enumerateMatchesInString(self, options: NSMatchingOptions(rawValue: 0), range: all) { (result: NSTextCheckingResult?, _, _) in let theResult = nsString.substringWithRange(result!.rangeAtIndex(captureGroup)) resultsArray.append(theResult) } //!!>>>>>>>>Error occurs here after skipping MatchingOptions content.!! return resultsArray } catch { print("Invalid regex") return(["Error"]) } } 

}

Range {9223372036854775807, 0}{NSNotFound, 0} ,这意味着没有匹配。

从文档

一些正则expression式(尽pipe不是示例模式)可以成功匹配零长度范围,因此将结果范围与{NSNotFound,0}进行比较是确定是否匹配的最可靠的方法

例如,在enumerateMatchesInString实现一个检查

 regex.enumerateMatchesInString(self, options: [], range: all) { (result: NSTextCheckingResult?, _, _) in let capturedRange = result!.rangeAtIndex(captureGroup) if !NSEqualRanges(capturedRange, NSMakeRange(NSNotFound, 0)) { let theResult = nsString.substringWithRange(capturedRange) resultsArray.append(theResult) } } 
Interesting Posts