无论正则表达式是什么,>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"])
}
}
}
Range {9223372036854775807, 0}
is {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)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)