将fromAcctNewBalance
字符串转换为用下划线分隔的所有大写字母的最佳方法是什么,例如"PascelCase"
。我写了这段有效的代码:
"Pascel_CASE"
但是,有没有更好的办法说使用库来做到这一点?
答案 0 :(得分:8)
乍看之下,您的正则表达式看起来很复杂,这可能会阻止其他人阅读您的代码并且不熟悉正则表达式。您可以使用更紧凑,更易读的代码替换它:
"(?=\\p{Upper})"
与流相关联,这种单行读起来几乎像纯文本
private static String camelCaseToUpperCaseSeparatedByUnderscore(String s) {
return Pattern.compile("(?=\\p{Upper})")
.splitAsStream(s)
.map(String::toUpperCase)
.collect(Collectors.joining("_"));
}
答案 1 :(得分:3)
如果您可以使用Guava,则可以执行以下操作:
String camelCase = "CamelCase";
String underscore = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, camelCase);
System.out.println(underscore);
如果您只想使用 regex ,则可以执行以下操作:
String underscore = String.join("_", Arrays.asList(camelCase.split("(?=[A-Z])")).stream()
.map(String::toUpperCase).collect(Collectors.toList()));
输出
CAMEL_CASE
答案 2 :(得分:2)
使用正则表达式执行此任务似乎有些过分
private static String camelCaseToUpperCaseSeparatedByUnderscore(String s) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
sb.append(Character.toUpperCase(s.charAt(i)));
if(i < s.length() - 1 && Character.isLowerCase(s.charAt(i)) && Character.isUpperCase(s.charAt(i + 1)))
sb.append('_');
}
return sb.toString();
}
只需遍历字符串,将当前字符转换为大写即可,每当从小写转换为大写时,都需添加下划线。
答案 3 :(得分:2)
您可以使用java 8 streams和collectors。
StringBuilder result =
"CamelCase".chars().collect(
StringBuilder::new,
//if ch is not the first letter and is uppercase, prepend underscore, then add uppercased ch
(sb, ch) -> sb.append(sb.length()>0 && Character.isUpperCase(ch) ? "_" : "").append(Character.toUpperCase((char)ch)),
//combine results
(sb1, sb2) -> sb1.append(sb2)
);
System.out.println(result);
答案 4 :(得分:2)
使用@Eritrean's正则表达式,您也可以这样做。
str = String.join("_",str.split("(?=\\p{Upper})")).toUpperCase();
答案 5 :(得分:1)
您可以使用Guava的CaseFormat
。
private static String camelCaseToUpperCaseSeparatedByUnderscore(String s) {
return CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, s);
}