我有一个带有主textView和两个textFields的项目。在主textView字段中有要处理的文本,在第一个textField中输入正则表达式,在第二个textField中输入替换模板字符串。
如果在第二个textField中输入文本,所有这些都可以正常工作,但如果输入某种正则表达式,这似乎是像纯文本一样处理的。例如,输入\n\n,而不是在最后文本中添加两个换行符,它只是输入nn。
这是我的代码,部分是基于
我做错了什么?
if let regex = NSRegularExpression.expresssionWith(theSearchOptions){ // theSearchOptions uses the struct below
// replace matches
let regStr = regex.stringByReplacingMatchesInString(str, options: .WithTransparentBounds, range: NSMakeRange(0, str.characters.count), withTemplate: substitution) // EDIT: substitution is the var that contains the template string
newStr = regStr
}
struct SearchOptions {
let searchString: String
var replacementString: String
let matchCase: Bool
let wholeWords: Bool
let escapeMetacharacters: Bool
}
extension NSRegularExpression {
static func expresssionWith(options: SearchOptions) -> NSRegularExpression? {
let searchString = options.searchString
let isCaseSensitive = options.matchCase // true
let isWholeWords = options.wholeWords // false
let escapeMetacharacters = options.escapeMetacharacters // 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 escapeMetacharacters {
pattern = NSRegularExpression.escapedPatternForString(searchString)
// adding backslash escapes as necessary to protect any characters that would match as pattern metacharacters
} else {
// no changes in the pattern
}
if isWholeWords {
pattern = "(?<!\\w)" + NSRegularExpression.escapedPatternForString(searchString) + "(?!\\w)"
}
do {
return try NSRegularExpression(pattern: pattern, options: regexOption)
} catch {
print("Error: \(error)")
return nil
}
}
}发布于 2016-07-16 21:19:52
如您所知,textField不转换用户输入,因此输入\n\n将使4字符串\ n \ n。
与regex模式相比,regex模板识别的转义序列不多。
如您所见,只定义了两个元字符:$和\。\的定义为:
将以下字符视为文字,压制任何特殊的含义。反斜杠转义在替代文本是只需要'$‘和'\',但可以用于任何其他字符,没有不良影响。
这种描述意味着\后面的任何字符都被视为字符本身。将\n\n作为模板提供与nn完全相同。
正如Wiktorż重新评论的那样,如果你想给某些字符序列赋予特殊的意义,你需要自己去做。
if let regex = NSRegularExpression.expresssionWith(theSearchOptions){ // theSearchOptions uses the struct below
//Replace metacharacters in `substitution` (Assuming `substitution` is a var.)
substitution = substitution.stringByReplacingOccurrencesOfString("\\n", withString: "\n")
substitution = substitution.stringByReplacingOccurrencesOfString("\\r", withString: "\r")
substitution = substitution.stringByReplacingOccurrencesOfString("\\t", withString: "\t")
//You may need more...
// replace matches
let regStr = regex.stringByReplacingMatchesInString(str, options: .WithTransparentBounds, range: NSMakeRange(0, str.characters.count), withTemplate: substitution)
newStr = regStr
}https://stackoverflow.com/questions/38414350
复制相似问题