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
相关产品推荐
相关产品推荐

