You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决正则表达式替换字符串中大小写单词后全为小写的问题?

解决首字母大写与小写单词的正则替换冲突问题

问题根源

你的代码存在两个关键错误:

  1. 第一个正则表达式\b\p{Lu}{4,}\b匹配的是全大写且长度≥4的单词,而非需求中"首字母大写的单词",导致像This、Work这类目标单词无法被正确匹配替换。
  2. 第二个正则表达式\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:15:53