PaseclCase字符串为大写,由下划线分隔

时间:2020-07-18 21:08:59

标签: java

fromAcctNewBalance字符串转换为用下划线分隔的所有大写字母的最佳方法是什么,例如"PascelCase"。我写了这段有效的代码:

"Pascel_CASE"

但是,有没有更好的办法说使用库来做到这一点?

6 个答案:

答案 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 streamscollectors

    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)

您可以使用GuavaCaseFormat

private static String camelCaseToUpperCaseSeparatedByUnderscore(String s) {
    return CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, s);
}

Demo!