为什么我的正则表达式中有多个捕获组会导致我的应用崩溃?

时间:2016-02-15 17:40:31

标签: ios regex swift compiler-errors enumerate

无论正则表达式是什么,> 1个捕获组都会使此代码崩溃并出现以下错误。

由于未捕获的异常'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"]) 
    }
}

}

1 个答案:

答案 0 :(得分:2)

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

来自文档

  

一些正则表达式(虽然不是示例模式)可以   成功匹配零长度范围,所以比较了   结果范围{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)
    }
}