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

正则表达式拆分驼峰式(CamelCase)时如何忽略连续大写字符串?

如何修改正则以忽略连续大写字符串,正确拆分驼峰命名

首先,我得明确你的核心需求:拆分符合驼峰规则的字符组合,但保留连续的大写字符串(比如FT不拆分)。当前你的代码已经能实现大部分场景,但你提到的测试报错问题,看起来是测试用例的预期和实际需求不一致(测试预期拆分FT,但你想要保留它)。

问题分析

你当前的两次正则替换逻辑:

  1. 第一个正则 @"(\P{Ll})(\P{Ll}\p{Ll})":匹配「非小写字母 + 非小写字母+小写字母」,插入空格,比如把ABc拆成A Bc。
  2. 第二个正则 @"(\p{Ll})(\P{Ll})":匹配「小写字母 + 非小写字母」,插入空格,比如把SaegaowytaI拆成Saegaowyta I。

对于连续大写的FT,它既不匹配第一个正则(缺少后续的小写字母),也不匹配第二个正则(没有小写字母开头),所以会被保留,这正好符合你的需求——那测试报错的原因应该是测试用例的预期设置错误,而非代码逻辑问题。

优化方案(更简洁的实现)

如果想简化代码,用一个正则一次性处理所有符合需求的拆分场景,同时严格保留连续大写字符串,可以使用零宽断言来实现,不需要捕获组:

public static string BreakCamelCase(string str) {
    return Regex.Replace(str, 
        @"
        (?<=\p{Ll})(?=\p{Lu})          # 匹配小写字母后接大写字母,插入空格
        |
        (?<=\p{Lu})(?=\p{Lu}\p{Ll})    # 匹配大写字母后接「大写+小写」组合,插入空格
        ", 
        " ", RegexOptions.IgnorePatternWhitespace);
}

这个正则的作用:

  • 拆分小写字母后跟大写字母的场景:比如SaegaowytaI → Saegaowyta I
  • 拆分大写字母后跟「大写+小写」的场景:比如XMLHttpRequest → XML Http Request,FTt → FT t
  • 完全保留连续大写的字符串:比如FT → FT,HTTP → HTTP

验证你的测试字符串

输入字符串:
"... Jc Yikr Cuduxlor B Az I Ngt FT Jtcmvs Hnrzsv Saegaowyta I..."

处理后输出:
"... Jc Yikr Cuduxlor B Az I Ngt FT Jtcmvs Hnrzsv Saegaowyta I..."

完全符合你“保留FT不拆分,正确处理其他驼峰”的需求。

内容的提问来源于stack exchange,提问作者NinjaDeveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:08:25