正则表达式拆分驼峰式(CamelCase)时如何忽略连续大写字符串?
如何修改正则以忽略连续大写字符串,正确拆分驼峰命名
首先,我得明确你的核心需求:拆分符合驼峰规则的字符组合,但保留连续的大写字符串(比如FT不拆分)。当前你的代码已经能实现大部分场景,但你提到的测试报错问题,看起来是测试用例的预期和实际需求不一致(测试预期拆分FT,但你想要保留它)。
问题分析
你当前的两次正则替换逻辑:
- 第一个正则
@"(\P{Ll})(\P{Ll}\p{Ll})":匹配「非小写字母 + 非小写字母+小写字母」,插入空格,比如把ABc拆成A Bc。 - 第二个正则
@"(\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
相关产品推荐
相关产品推荐

