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

Are*_*efe 0 java

什么是一个转换的最佳方式"PascelCase"串,像下划线分隔全部大写"Pascel_CASE"。我写了这个有效的代码:

  private static String pascelCaseToUpperCaseSeparatedByUnderscore(String s) {
        
        String[] values = s.split("(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])");
        
        for (int i = 0, len = values.length; i < len; i++) {
            values[i] = values[i].toUpperCase();
        }
        return String.join("_", values);
    }
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ean 8

乍一看,您的正则表达式看起来很复杂,这可能会让其他阅读您的代码且不熟悉正则表达式的人望而却步。你可以用这个更紧凑和可读的替换它:

"(?=\\p{Upper})"
Run Code Online (Sandbox Code Playgroud)

与流有关,这个单行代码读起来几乎像纯文本

private static String camelCaseToUpperCaseSeparatedByUnderscore(String s) {
    return Pattern.compile("(?=\\p{Upper})")
                  .splitAsStream(s)
                  .map(String::toUpperCase)
                  .collect(Collectors.joining("_"));
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案+1。您可能想解释如何在一个位置而不是特定的字符串或字符上进行拆分(由于前瞻的零宽度行为)。 (2认同)

Obo*_*boe 5

如果你可以使用番石榴,你可以这样做:

String camelCase = "CamelCase";

String underscore = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, camelCase);

System.out.println(underscore);
Run Code Online (Sandbox Code Playgroud)

如果你只想使用正则表达式,你可以这样做:

String underscore = String.join("_", Arrays.asList(camelCase.split("(?=[A-Z])")).stream()
    .map(String::toUpperCase).collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

您也可以使用Arrays.stream()

String underscore = Arrays.stream(camelCase.split("(?=[A-Z])")).map(String::toUpperCase)
            .collect(Collectors.joining("_"));
Run Code Online (Sandbox Code Playgroud)

输出

CAMEL_CASE
Run Code Online (Sandbox Code Playgroud)