如果正则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") }