我找到了 brilliant RegEx提取 camelCase 或 TitleCase 表达式的一部分。
(?<!^)(?=[A-Z])
它按预期工作:
- 值(value) -> 值(value)
- camelValue -> Camel /值(value)
- TitleValue -> 标题/值
以 Java 为例:
String s = "loremIpsum";
words = s.split("(?<!^)(?=[A-Z])");
//words equals words = new String[]{"lorem","Ipsum"}
我的问题是它在某些情况下不起作用:
- 案例 1:值 -> V/A/L/U/E
- 案例2:eclipseRCPExt -> eclipse/R/C/P/Ext
在我看来,结果应该是:
- 案例 1:值(value)
- 案例 2:eclipse/RCP/Ext
换句话说,给定 n 个大写字符:
- 如果 n 个字符后跟小写字符,则组应为:(n-1 个字符)/(第 n 个字符 + 小写字符)
- 如果 n 个字符位于末尾,则该组应为:(n 个字符)。
关于如何改进这个正则表达式的任何想法?
最佳答案
以下正则表达式适用于上述所有示例:
public static void main(String[] args)
{
for (String w : "camelValue".split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")) {
System.out.println(w);
}
}
它的工作原理是强制否定的lookbehind不仅忽略字符串开头的匹配项,而且还忽略一个大写字母前面有另一个大写字母的匹配项。这可以处理“VALUE”之类的情况。
由于无法在“RPC”和“Ext”之间拆分,正则表达式的第一部分在“eclipseRCPExt”上失败。这是第二个子句的目的:(?<!^)(?=[A-Z][a-z]
.此子句允许在每个大写字母前拆分,后跟一个小写字母,字符串开头除外。
关于java - RegEx 拆分 camelCase 或 TitleCase(高级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7593969/