You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何用正则表达式转义特殊字符,无需replacingOccurrences(of)

Swift 中用正则一次性转义特殊符号

问题描述

我需要给所有特殊符号(如(, ), +, [, ]等)添加反斜杠转义,示例如下:

extension String {
    var escaping: String {
        return self.replacing(/[()+]/, with: "\\($0)")
    }
}

let text = "Hello everyone!)) + another one day"
print(text.escaping)

期望输出结果:

"Hello everyone!\)\) \+ another one day"

目前我通过多次调用replacingOccurrences(of:)方法实现转义:

var escaping: String {
        return self.replacingOccurrences(of: ".", with: "\\.")
            .replacingOccurrences(of: "-", with: "\\-")
            .replacingOccurrences(of: "_", with: "\\_")
            .replacingOccurrences(of: ")", with: "\\)")
            .replacingOccurrences(of: "(", with: "\\(")
            .replacingOccurrences(of: "+", with: "\\+")
            .replacingOccurrences(of: "!", with: "\\!")
            .replacingOccurrences(of: "[", with: "\\[")
            .replacingOccurrences(of: "]", with: "\\]")
            .replacingOccurrences(of: "=", with: "\\=")
            .replacingOccurrences(of: "|", with: "\\|")
            .replacingOccurrences(of: "{", with: "\\{")
            .replacingOccurrences(of: "}", with: "\\}")
    }

请问能不能在Swift中仅通过正则表达式实现这个需求,不用多次调用replacingOccurrences(of:)?


解决方案

当然可以,通过正则字符集匹配所有需要转义的符号,就能一次性完成替换,不用重复调用替换方法。

方案1:Swift 5.7+ 原生正则语法

Swift 5.7及以上版本支持原生正则写法,代码更简洁直观:

extension String {
    var escaping: String {
        // 定义包含所有需要转义符号的正则字符集
        let specialCharsRegex = /[.\-+!()\[\]{}|=_]/
        // 给每个匹配到的符号前添加反斜杠
        return self.replacing(specialCharsRegex, with: "\\$0")
    }
}

// 测试示例
let testText = "Hello everyone!)) + another one day"
print(testText.escaping)
// 输出:Hello everyone!\)\) \+ another one day

方案2:兼容旧版本的 NSRegularExpression

如果需要适配Swift 5.7之前的版本,可使用NSRegularExpression实现:

extension String {
    var escaping: String {
        // 正则模式:包含所有需要转义的特殊符号
        let regexPattern = "[.\\-+!()\\[\\]{}|=_]"
        guard let regex = try? NSRegularExpression(pattern: regexPattern) else {
            return self
        }
        let fullRange = NSRange(self.startIndex..., in: self)
        return regex.stringByReplacingMatches(
            in: self,
            range: fullRange,
            withTemplate: "\\$0"
        )
    }
}

关键说明

  • 正则字符集里的-放在字符集开头或结尾时可以不用转义,这里为了可读性还是显式转义了;[和]属于正则特殊字符,必须在字符集里转义。
  • 替换模板\\$0中,第一个反斜杠是用来转义第二个反斜杠的,确保最终输出单个反斜杠;$0代表正则匹配到的整个字符,实现给每个特殊符号前加反斜杠的效果。

内容的提问来源于stack exchange,提问作者Nike Kov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:02:16