我找到了一个 很棒的 RegEx 来提取 camelCase 或 TitleCase 表达式的一部分。
(?<!^)(?=[A-Z])
它按预期工作:
- 价值 -> 价值
- 骆驼值 -> 骆驼/值
- 标题值 -> 标题/值
以 Java 为例:
String s = "loremIpsum";
words = s.split("(?<!^)(?=[A-Z])");
//words equals words = new String[]{"lorem","Ipsum"}
我的问题是它在某些情况下不起作用:
- 情况 1:值 -> V / A / L / U / E
- 案例二:eclipseRCPExt -> eclipse/R/C/P/Ext
在我看来,结果应该是:
- 案例 1:价值
- 案例二:eclipse/RCP/Ext
换句话说,给定 n 个大写字符:
- 如果 n 个字符后跟小写字符,则组应为:(n-1 个字符)/(第 n 个字符 + 小写字符)
- 如果 n 个字符在末尾,则该组应为:(n 个字符)。
关于如何改进此正则表达式的任何想法?
原文由 Jmini 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下正则表达式适用于所有上述示例:
它的工作原理是强制负向后视不仅忽略字符串开头的匹配,而且还忽略大写字母前面有另一个大写字母的匹配。这处理像“VALUE”这样的情况。
由于未能在“RPC”和“Ext”之间拆分,正则表达式的第一部分本身在“eclipseRCPExt”上失败。这是第二个条款的目的:
(?<!^)(?=[A-Z][a-z]
。此子句允许在每个大写字母之前进行拆分,然后是小写字母,但在字符串的开头除外。