Swift中如何使用通配符移除字符串(x)后缀并聚合字典键值?
Swift 移除字典键末尾(数字)后缀并聚合值的实现方案
你之前的写法不生效是因为replacingOccurrences默认执行精确字面量匹配,无法识别通配符规则。要实现该需求需要开启正则匹配模式,用正则表达式表示你需要匹配的(x)后缀格式。
核心匹配规则
你需要匹配末尾(数字)格式的正则表达式为:\\s*\\(\\d+\\)$,各部分含义:
\\s*:兼容匹配括号前可能存在的0个或多个空格,不需要可删除\\(:匹配左括号字面量\\d+:匹配1个或多个数字,也就是你要的通配符x的部分\\):匹配右括号字面量$:限定仅匹配字符串末尾的内容,避免误删名字中间带括号的内容
完整实现代码
// 输入示例 let inputDict: [String: Int] = ["James" : 3, "James(1)" : 3, "James(2)" : 4, "Sarah" : 10, "Sarah(1)" : 10, "Sarah(2)" : 10 ] var outputDict: [String: Int] = [:] for (originKey, value) in inputDict { // 开启正则匹配,移除末尾括号后缀 let cleanedKey = originKey.replacingOccurrences(of: "\\s*\\(\\d+\\)$", with: "", options: .regularExpression) // 同键值累加 outputDict[cleanedKey, default: 0] += value } print(outputDict) // 输出:["James": 10, "Sarah": 30]
扩展适配
如果括号内的内容不只是数字,可将正则中的\\d+替换为[^)]+,即可匹配右括号前的任意非右括号字符,适配更多后缀场景。
内容的提问来源于stack exchange,提问作者Sergio Bost
相关产品推荐
相关产品推荐

