一尘不染

RegEx拆分camelCase或TitleCase(高级)

java

我找到了一个出色的RegEx来提取camelCase或TitleCase表达的一部分。

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

它按预期工作:

  • value -> value
  • camelValue -> camel / Value
  • TitleValue -> Title / Value

例如,使用Java:

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

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

  • 情况1:VALUE-> V / A / L / U / E
  • 情况2:eclipseRCPExt-> eclipse / R / C / P / Ext

在我看来,结果应该是:

  • 情况1:VALUE
  • 情况2:日食/ RCP /外部

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

  • 如果n个字符后跟小写字符,则组应为:(n-1个字符)/(第n个字符+小写字符)
  • 如果n个字符位于末尾,则该组应为:(n个字符)。
    关于如何改善此正则表达式的任何想法吗?

阅读 395

收藏
2020-03-17

共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”之类的情况。

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

2020-03-17