Xcode正则表达式查找替换:如何在首个右括号前添加圆括号
解决Xcode中枚举关联类型批量添加括号的正则问题
我将项目中的一个枚举设为关联类型,该枚举已在数千处被使用,需要给所有访问该枚举的地方添加圆括号()。尝试用Xcode查找替换功能配合正则表达式实现,但替换结果不符合预期。
代码示例
struct Model {} enum Investment { case stocks(Stocks) } enum Stocks { case highRisk(model: Model? = nil) case lowRisk(model: Model? = nil) case veryHighRisk(model: Model? = nil) } class Test { func configStockUI(model: Investment, userName: String? = nil) { } } func renderUI() { let test = Test() test.configStockUI(model: .stocks(.highRisk), userName: "Deepak") test.configStockUI(model: .stocks(.lowRisk)) test.configStockUI(model: .stocks(.veryHighRisk)) // 期望输出 test.configStockUI(model: .stocks(.highRisk()), userName: "Deepak") test.configStockUI(model: .stocks(.lowRisk())) test.configStockUI(model: .stocks(.veryHighRisk())) // 实际错误输出 test.configStockUI(model: .stocks(.highRisk), userName: "Deepak"()) test.configStockUI(model: .stocks(.lowRisk)()) test.configStockUI(model: .stocks(.veryHighRisk)()) }
原正则问题
之前使用的正则逻辑有误:
- 查找:
.stocks\(.(.*)\) - 替换:
.stocks\(.$1()\)
该正则的.*会贪婪匹配到行尾的所有内容,导致把枚举case后面的其他参数(比如字符串"Deepak")也错误地加上了括号。
正确的正则方案
精准匹配指定case
如果Stocks枚举的case是固定的几个,用这个精准匹配的正则:
- 查找正则:
.stocks\(\.(highRisk|lowRisk|veryHighRisk)\)(?!\()) - 替换内容:
.stocks(.$1())
通用匹配所有case
如果Stocks有很多case,用通用版本匹配任意字母数字组成的case名:
- 查找正则:
.stocks\(\.([a-zA-Z0-9]+)\)(?!\()) - 替换内容:
.stocks(.$1())
正则说明
(highRisk|lowRisk|veryHighRisk):精准匹配目标枚举的所有case,避免误匹配其他内容([a-zA-Z0-9]+):通用匹配合法的枚举case名称(?!\()):负向预查,确保当前位置后面没有已经存在的括号,防止重复替换
Xcode操作步骤
- 打开Xcode的全局查找替换(快捷键
Cmd+Shift+F) - 点击查找框右侧的
正则表达式按钮(图标是.*) - 输入上述查找正则和替换内容
- 先点击
Find验证匹配结果,确认无误后点击Replace All
内容的提问来源于stack exchange,提问作者Dipak
相关产品推荐
相关产品推荐

