在Swift中使用正则expression式进行简单search时,如何避免由于searchstring中的特殊字符造成的错误?

我正在使用正则expression式在textView中search一个单词。 我实现了一个textField和两个开关作为选项(整个单词和匹配大小写)。 当您在search字段中input一个纯字时,所有的工作都正常,但是当我input一个像\或*这样的特殊字符时,会出现错误。

我得到的错误是这样的:

Error Domain=NSCocoaErrorDomain Code=2048 "The value “*” is invalid." UserInfo={NSInvalidValue=*} 

有没有办法避免这个问题,并让代码处理像纯文本的所有文本?

因为我也想search特殊字符,所以我宁愿不要阻止input它们。 在开始的时候,我可以用编程的方式在所有特殊字符之前添加一个转义反斜杠来执行search,但也许还有一些更聪明的方法?

这里是我使用的代码(基于本教程: NSRegularExpression教程:入门 )

 struct SearchOptions { let searchString: String var replacementString: String let matchCase: Bool let wholeWords: Bool } extension NSRegularExpression { convenience init?(options: SearchOptions) { let searchString = options.searchString let isCaseSensitive = options.matchCase let isWholeWords = options.wholeWords // 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 it's whole word put the string between word boundary \b if isWholeWords { pattern = "\\b\(searchString)\\b" // the second \ is used as escape } do { try self.init(pattern: pattern, options: regexOption) } catch { print(error) } } } 

你可以使用NSRegularExpression.escapedPatternForString

通过根据需要添加反斜杠转义符来返回string,以保护任何匹配为模式元字符的字符。

因此,你需要

 var pattern = NSRegularExpression.escapedPatternForString(searchString) 

另外请注意,这一块:

 if isWholeWords { pattern = "\\b\(searchString)\\b" 

可能会失败,如果用户input(text)并希望search整个单词。 匹配整个单词的最佳方式是通过查找词的两端禁止词的字符:

 if isWholeWords { pattern = "(?<!\\w)" + NSRegularExpression.escapedPatternForString(searchString) + "(?!\\w)"