首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Swift中的正则表达式以模板字符串代替纯文本替换匹配的表达式

如何使用Swift中的正则表达式以模板字符串代替纯文本替换匹配的表达式
EN

Stack Overflow用户
提问于 2016-07-16 18:34:30
回答 1查看 4.2K关注 0票数 0

我有一个带有主textView和两个textFields的项目。在主textView字段中有要处理的文本,在第一个textField中输入正则表达式,在第二个textField中输入替换模板字符串。

如果在第二个textField中输入文本,所有这些都可以正常工作,但如果输入某种正则表达式,这似乎是像纯文本一样处理的。例如,输入\n\n,而不是在最后文本中添加两个换行符,它只是输入nn。

这是我的代码,部分是基于

我做错了什么?

代码语言:javascript
复制
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
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-16 21:19:52

如您所知,textField不转换用户输入,因此输入\n\n将使4字符串\ n \ n

与regex模式相比,regex模板识别的转义序列不多。

模板匹配格式

正则表达式元字符

如您所见,只定义了两个元字符:$\\的定义为:

将以下字符视为文字,压制任何特殊的含义。反斜杠转义在替代文本是只需要'$‘和'\',但可以用于任何其他字符,没有不良影响。

这种描述意味着\后面的任何字符都被视为字符本身。将\n\n作为模板提供与nn完全相同。

正如Wiktorż重新评论的那样,如果你想给某些字符序列赋予特殊的意义,你需要自己去做。

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38414350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档