如何将 java 中的驼峰式字符串转换为下划线,同时保留部分大写字母和其余小写字母?

How do I convert a camelCase string to underscore in java keeping some upper cases and the rests as lower cases?

如何在 java 中将驼峰式字符串转换为下划线并保留一些大写字母?我正在使用此代码:

String inputString = "Hi How areYouToday";
String result = inputString.replaceAll("([a-z])([A-Z]+)", "_");   

我可以在 Hi How are_You_Today 中转换 inputString,但是,我需要得到 Hi How are_you_today

请注意,只有转换的部分更改为小写版本。

使用子字符串或 split() 将输入字符串拆分为 2,并在单个字符串上使用全部替换

您可以使用 Matcher#appendReplacement 并根据正则表达式找到的内容进行动态替换。

我还稍微更改了您的正则表达式,在匹配中不包含小写部分,但只接受前面有小写字符的大写字符。更多信息:http://www.regular-expressions.info/lookaround.html

String text = "Hi How areYouToday";
Matcher m = Pattern.compile("(?<=[a-z])[A-Z]").matcher(text);

StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "_"+m.group().toLowerCase());
}
m.appendTail(sb);

System.out.println(sb.toString()); //Hi How are_you_today

OR 自 Java 9

Matcher m = Pattern.compile("(?<=[a-z])[A-Z]").matcher(text);
String result = m.replaceAll(match -> "_" + match.group().toLowerCase());

因为构造

StringBuffer sb = new StringBuffer();
while(m.find()){
    m.appendReplacement(sb, /*replacement for each match*/);
}
m.appendTail(sb);
String result = sb.toString();

被包装到 Matcher#replaceAll​(Function replacer) 中,因此可以用作

String result = m.replaceAll( (MatchResult match) -> /*replacement for each match*/ );