用于拆分驼峰大小写或标题大小写的正则表达式(高级)

2022-08-31 11:18:15

我找到了一个很棒的正则表达式来提取驼峰大小写或标题大小写表达式的部分。

 (?<!^)(?=[A-Z])

它按预期工作:

  • 值 -> 值
  • 骆驼价值 -> 骆驼 / 价值
  • 标题值 -> 标题/值

例如,使用 Java:

String s = "loremIpsum";
words = s.split("(?<!^)(?=[A-Z])");
//words equals words = new String[]{"lorem","Ipsum"}

我的问题是它在某些情况下不起作用:

  • 案例 1:值 -> V / A / L / U / E
  • 案例2:日食RCPExt->日食/R/C/P/Ext

在我看来,结果应该是:

  • 案例 1:值
  • 案例2:日食/RCP/分机

换句话说,给定 n 个大写字符:

  • 如果 n 个字符后跟小写字符,则组应为:(n-1 个字符)/(第 n 个字符 + 低字符)
  • 如果 n 个字符位于末尾,则组应为:(n 个字符)。

关于如何改进这个正则表达式的任何想法?


答案 1

以下正则表达式适用于上述所有示例:

public static void main(String[] args)
{
    for (String w : "camelValue".split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")) {
        System.out.println(w);
    }
}   

它的工作原理是强制负式后缀不仅忽略字符串开头的匹配项,而且还忽略大写字母前面有另一个大写字母的匹配项。这将处理类似“VALUE”的情况。

正则表达式的第一部分本身在“eclipseRCPExt”上失败,因为在“RPC”和“Ext”之间无法拆分。这是第二个子句的目的:。此子句允许在后跟小写字母的每个大写字母之前进行拆分,字符串的开头除外。(?<!^)(?=[A-Z][a-z]


答案 2

看来你正在使这比它需要的更复杂。对于 camelCase,拆分位置只是大写字母紧跟在小写字母后面的任意位置:

(?<=[a-z])(?=[A-Z])

以下是此正则表达式如何拆分您的示例数据:

  • value -> value
  • camelValue -> camel / Value
  • TitleValue -> Title / Value
  • VALUE -> VALUE
  • eclipseRCPExt -> eclipse / RCPExt

与所需输出的唯一区别是 ,我认为在这里可以正确拆分。eclipseRCPExt

附录 - 改进版本

注意:这个答案最近得到了赞成票,我意识到有更好的方法......

通过向上述正则表达式添加第二个替代项,OP 的所有测试用例都可以正确拆分。

(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])

以下是改进的正则表达式如何拆分示例数据:

  • value -> value
  • camelValue -> camel / Value
  • TitleValue -> Title / Value
  • VALUE -> VALUE
  • eclipseRCPExt -> eclipse / RCP / Ext

编辑:20130824添加了改进版本以处理案例。RCPExt -> RCP / Ext