2016-02-15 48 views
2

无论正则表达式是什么,> 1捕获组都会使此代码崩溃并出现以下错误。为什么在我的正则表达式中有多个捕获组会崩溃我的应用程序?

由于未捕获的异常'NSRangeException',原因:' - [__ NSCFString substringWithRange:]:Range {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"]) 
    } 
} 

}

+0

'让nsString = self作为NSString'是'self'是一个字符串? – tktsubota

+0

@TroyT是的,这是一个字符串扩展。我将展开代码以显示此内容。 – Deco

+0

@DavidS发生了变化,无法真正找到正在发生的事情,所以前面的句子只比放上'Halp' – Deco

回答

2

Range {9223372036854775807, 0}{NSNotFound, 0},这意味着不存在匹配。

从文档

一些正则表达式(虽然不是示例图案) 成功匹配零长度范围,所以用 所得范围的比较{NSNotFound,0}是最到 可靠的方式确定是否有匹配或不

enumerateMatchesInString例如

实施检查
+0

好一点,我不认为这是可能的。我正在使用以下正则表达式,两个捕获组的\\ d {7,10}应该阻止这种情况的发生。 https://regex101.com/r/cN6dC7/33 – Deco

+0

仅当存在> 1个捕获组时才会出现此错误。 – Deco

+0

只需在枚举循环中检查“NSNotFound”范围以避免崩溃。 – vadian

相关问题