如果正则expression式有效,如何检查Swift?
我正在使用正则expression式来searchtextView。 所有使用简单的string正常工作,但是当我尝试只input一个正则expression式运算符的一部分,我得到一个错误的现金:
Error Domain=NSCocoaErrorDomain Code=2048 "The value “\” is invalid." UserInfo={NSInvalidValue=\}
例如,如果我input“\ n”它的作品,但如果我只input“\”(不含引号),我得到崩溃。 我不能做的是find一种方法来检查expression式之前使用它。
我使用这个代码部分基于这个教程和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) } } }
下面的第一个代码显示不稳定的行为,你不应该使用它。 (请看这个答案的后半部分。)
将一行添加到您的failable初始化程序中:
do { try self.init(pattern: pattern, options: regexOption) } catch { print(error) return nil //->you need to return nil to tell initialization failed }
(我认为Swift编译器应该警告这个缺less的return nil
。可能是Swift的一个bug?)
之后,您可以安全地检查结果是否为零:
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
,因为它还没有使用。)
据我testing,使用静态方法从来没有坠毁。
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") }