将驼峰式或标题式的文字分割成单词(高级)的正则表达式

94

我找到了一个很棒的正则表达式,可以提取出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:eclipse/RCP/Ext

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

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

如何改进这个正则表达式呢?


看起来你可能需要在“^”上使用一个条件修改器,以及在负回顾中的大写字母的另一个条件情况。虽然我没有确定地测试过,但我认为那是解决问题的最佳选择。 - Nightfirecat
如果有人正在检查 - Clam
11个回答

-1
一个JavaScript解决方案
/**
 * howToDoThis ===> ["", "how", "To", "Do", "This"]
 * @param word word to be split
 */
export const splitCamelCaseWords = (word: string) => {
    if (typeof word !== 'string') return [];
    return word.replace(/([A-Z]+|[A-Z]?[a-z]+)(?=[A-Z]|\b)/g, '!$&').split('!');
};

他们要求一个JavaScript解决方案。为什么你提供了两次相同的解决方案?如果你认为这些问题是相同的,请投票将其中一个关闭为重复。 - Toto
我很好奇想尝试一下对包含数字的字符串进行操作,但它似乎将其视为前面字符串的一部分。在这个例子上它似乎效果不佳:'DrivingB2BTradeIn2019Onwards' 会返回 ["", "DrivingB2", "B", "TradeIn2019", "Onwards"] - kimbaudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接