正则表达式拆分驼峰式或标题式(高级)

新手上路,请多包涵

我找到了一个 很棒的 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 许可协议

阅读 633
2 个回答

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

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

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

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

原文由 NPE 发布,翻译遵循 CC BY-SA 3.0 许可协议

看来您正在使它变得比需要的更复杂。对于 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 案例。

原文由 ridgerunner 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题