Swift正则替换时捕获组内容大写操作不生效如何解决?
问题原因
你现有代码的问题出在执行逻辑的顺序上:"$1".uppercased()是先对字面量字符串"$1"本身执行大写转换,得到的结果依旧是"$1",再作为静态替换模板传入方法,完全没有对正则匹配到的捕获组内容做处理,因此大写逻辑不会生效。
修复方案
你需要使用支持自定义处理匹配结果的正则API,对每一次匹配到的捕获组内容单独执行大写转换后再替换,以下是两种可落地的实现:
方案1:基于NSRegularExpression(兼容所有Swift版本)
import Foundation let originStr = "Hello, he is hero" // 实际使用时替换为你自己的正则规则即可,不需要调整后续替换逻辑 let regex = try! NSRegularExpression(pattern: #"(he)"#, options: .caseInsensitive) let result = regex.stringByReplacingMatches( in: originStr, range: NSRange(originStr.startIndex..., in: originStr) ) { match in // 取第一个捕获组的内容转大写 let capture = String(originStr[Range(match.range(at: 1), in: originStr)!]) return capture.uppercased() } print(result) // 输出 HEllo, HE is HEro
生产环境如果正则规则是动态生成的,建议把
try!替换为do-catch做错误捕获。
方案2:基于Swift 5.7+ 原生RegexAPI(写法更简洁)
import RegexBuilder let originStr = "Hello, he is hero" // 实际使用时替换为你自己的正则规则即可 let regex = Regex { Capture { "he" } }.ignoresCase() let result = originStr.replacing(regex) { match in match.1.uppercased() } print(result) // 输出 HEllo, HE is HEro
如果你的实际正则不需要忽略大小写,去掉对应
options/ignoresCase()配置即可。
内容的提问来源于stack exchange,提问作者Pytan
相关产品推荐
相关产品推荐

