【问题标题】:PaseclCase String to Uppercase separated by underscore [duplicate]用下划线分隔的 PaseclCase 字符串转大写 [重复]
【发布时间】:2020-11-08 10:22:00
【问题描述】:

"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);
    }

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

【问题讨论】:

标签: java


【解决方案1】:

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

"(?=\\p{Upper})"

在与流相关的情况下,这个单行代码读起来几乎就像纯文本一样

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

【讨论】:

  • 不错的解决方案 +1。您可能想解释如何在位置而不是特定字符串或字符上进行拆分(由于前瞻的零宽度行为)。
  • @Eritrean 我不太擅长正则表达式,但仍在尝试简化我的代码。
【解决方案2】:

如果你可以使用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()));

您也可以改用Arrays.stream()

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

输出

CAMEL_CASE

【讨论】:

    【解决方案3】:

    对这个任务使用正则表达式似乎有点过头了

    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();
    }
    

    只需遍历字符串,添加转换为大写的当前字符,每当您从小写切换到大写时,添加下划线。

    【讨论】:

      【解决方案4】:

      您可以使用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);
      

      【讨论】:

        【解决方案5】:

        利用@Eritrean's 正则表达式,您也可以这样做。

        str = String.join("_",str.split("(?=\\p{Upper})")).toUpperCase();
        

        【讨论】:

          【解决方案6】:

          你可以使用GuavaCaseFormat

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

          Demo!

          【讨论】:

          • 是的,我接受了上面相同的答案。谢谢。
          • @ChakladerAsfakArefe 没问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-20
          • 2018-09-28
          • 1970-01-01
          • 2018-03-24
          • 2020-05-11
          • 1970-01-01
          相关资源
          最近更新 更多