您可以使用匹配器#appendReplacement https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#appendReplacement-java.lang.StringBuffer-java.lang.String-并根据正则表达式发现的内容传递动态替换。
我还稍微更改了您的正则表达式,以便在匹配中不包含小写部分,但只接受前面有小写字符的大写字符。更多信息请访问:http://www.regular-expressions.info/lookaround.html 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
或者从 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(函数替换器) https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Matcher.html#replaceAll(java.util.function.Function)所以它可以用作
String result = m.replaceAll( (MatchResult match) -> /*replacement for each match*/ );