我正在使用正则表达式在textView中搜索。都可以使用简单的字符串正常工作,但是当我尝试仅输入正则表达式运算符的一部分时,我得到了一笔错误的提示:
Error Domain=NSCocoaErrorDomain Code=2048 "The value “\” is invalid." UserInfo={NSInvalidValue=\}
例如,如果我输入“ \ n”,它可以工作,但是如果我仅输入“ \”(不带引号),则会崩溃。我无法做的是找到一种使用该表达式之前对其进行检查的方法。
我正在部分根据本教程和WiktorStribiżew的答案使用此代码:
extension NSRegularExpression {
convenience init?(options: SearchOptions) {
let searchString = options.searchString
let isCaseSensitive = options.matchCase // set to true
let isWholeWords = options.wholeWords // set to false
let escapeMetacharacters = options.escapeMetacharacters // set to false
// handle case sensitive option
var regexOption: NSRegularExpressionOptions = .CaseInsensitive
if isCaseSensitive { // if it is match case remove case sensitive option
regexOption = []
}
// put the search string in the pattern
var pattern = searchString
if isWholeWords {
pattern = "(?<!\\w)" + NSRegularExpression.escapedPatternForString(searchString) + "(?!\\w)"
}
do {
try self.init(pattern: pattern, options: regexOption)
} catch {
print(error)
}
}
}
下面的第一个代码显示了不稳定的行为,您不应使用它。(请参阅此答案的后半部分。)
向失败的初始化程序添加一行:
do {
try self.init(pattern: pattern, options: regexOption)
} catch {
print(error)
return nil //->you need to return nil to tell initialization failed
}
(我认为Swift编译器应该警告这种丢失return nil
。可能是Swift的错误吗?)
之后,您可以安全地检查结果是否为零:
let sOpts = SearchOptions(searchString: "\\", replacementString: "", matchCase: false, wholeWords: false)
if let regex = NSRegularExpression(options: sOpts) {
//Use regex
print(regex)
} else {
//Process errors
print("Something bad in SearchOptions")
}
(我省略了escapeMetacharacters
,因为尚未使用。)
据我测试,使用静态方法从未崩溃过。
extension NSRegularExpression {
static func expresssionWith(options: SearchOptions) -> NSRegularExpression? {
let searchString = options.searchString
let isCaseSensitive = options.matchCase // set to true
let isWholeWords = options.wholeWords // set to false
// handle case sensitive option
var regexOption: NSRegularExpressionOptions = .CaseInsensitive
if isCaseSensitive { // if it is match case remove case sensitive option
regexOption = []
}
// put the search string in the pattern
var pattern = searchString
if isWholeWords {
pattern = "(?<!\\w)" + NSRegularExpression.escapedPatternForString(searchString) + "(?!\\w)"
}
do {
return try NSRegularExpression(pattern: pattern, options: regexOption)
} catch {
print(error)
return nil
}
}
}
let sOpts = SearchOptions(searchString: "\\", replacementString: "", matchCase: false, wholeWords: false)
if let regex = NSRegularExpression.expresssionWith(sOpts) {
//Use regex
print(regex)
} else {
//Process errors
print("Something bad in SearchOptions")
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句