如何解决正则表达式替换字符串中大小写单词后全为小写的问题?
解决首字母大写与小写单词的正则替换冲突问题
问题根源
你的代码存在两个关键错误:
- 第一个正则表达式
\b\p{Lu}{4,}\b匹配的是全大写且长度≥4的单词,而非需求中"首字母大写的单词",导致像This、Work这类目标单词无法被正确匹配替换。 - 第二个正则表达式
\b\p{L}{4,}\b会匹配所有长度≥4的字母单词,包括刚替换完成的Whatever,最终将其二次替换为whatever,导致所有符合长度要求的单词都变成小写。
修正方案一:分两次精准替换
先修正首字母大写单词的匹配规则,再限定小写单词的匹配范围,避免二次替换已处理的内容:
let myString = "This is a regular string. How does this Work? Does any Name know How?" // 替换首字母大写且总长度≥4的单词为"Whatever" // \p{Lu}匹配首字母大写,\p{L}{3,}匹配后续至少3个任意字母,总长度≥4 let step1 = myString.replacingOccurrences(of: "\\b\\p{Lu}\\p{L}{3,}\\b", with: "Whatever", options: .regularExpression) // 替换全小写且长度≥4的单词为"whatever" // \p{Ll}{4,}仅匹配全小写且长度≥4的单词,不会影响已替换的"Whatever" let finalResult = step1.replacingOccurrences(of: "\\b\\p{Ll}{4,}\\b", with: "whatever", options: .regularExpression) print(finalResult)
修正方案二:单次正则批量替换(更高效)
使用正则捕获组区分两种单词类型,通过闭包一次性完成替换,无需两次遍历字符串:
let myString = "This is a regular string. How does this Work? Does any Name know How?" let regex = try! NSRegularExpression(pattern: "(\\b\\p{Lu}\\p{L}{3,}\\b)|(\\b\\p{Ll}{4,}\\b)", options: []) let range = NSRange(myString.startIndex..., in: myString) let finalResult = regex.stringByReplacingMatches(in: myString, range: range, withTemplate: "") { match, _ in // 判断捕获组是否匹配,返回对应替换内容 if match.range(at: 1).location != NSNotFound { return "Whatever" } else if match.range(at: 2).location != NSNotFound { return "whatever" } return "" } print(finalResult)
输出结果
两种方案都会得到符合期望的输出:
Whatever is a whatever whatever. How whatever this Whatever? Whatever any Whatever whatever whatever How?
内容的提问来源于stack exchange,提问作者Scott W
相关产品推荐
相关产品推荐

