我正在使用正则表达式在文本视图中搜索单词。我实现了一个文本字段和两个开关作为选项(全字和匹配大小写)。当您在搜索字段中输入普通单词时,一切正常,但当我输入 \ 或 * 等特殊字符时,我会收到错误。
我得到的错误是这样的:
Error Domain=NSCocoaErrorDomain Code=2048 "The value “*” is invalid." UserInfo={NSInvalidValue=*}
有没有办法避免这个问题并让代码像纯文本一样处理所有文本?
因为我还想搜索特殊字符,所以我不想阻止输入它们。一开始,我想在执行搜索之前以编程方式向所有特殊字符添加转义反斜杠,但也许还有一些更聪明的方法?
这是我正在使用的代码(基于本教程: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:
通过根据需要添加反斜杠转义符来返回字符串,以保护与模式元字符匹配的任何字符。
因此,你需要
var pattern = NSRegularExpression.escapedPatternForString(searchString)
另外,请注意这篇文章:
if isWholeWords {
pattern = "\\b\(searchString)\\b"
如果用户输入可能会失败(text)
并希望将其作为一个完整的单词进行搜索。匹配整个单词的最佳方法是通过环视不允许搜索词两端出现单词字符:
if isWholeWords {
pattern = "(?<!\\w)" + NSRegularExpression.escapedPatternForString(searchString) + "(?!\\w)"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)