Java PaseclCase字符串到大写,用下划线分隔

Java PaseclCase字符串到大写,用下划线分隔,java,Java,将“PascelCase”字符串转换为所有用下划线分隔的大写字母(如“Pascel\u case”)的最佳方法是什么。我编写了以下代码: private static String pascelCaseToUpperCaseSeparatedByUnderscore(String s) { String[] values = s.split("(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])&qu

“PascelCase”
字符串转换为所有用下划线分隔的大写字母(如
“Pascel\u 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);
    }
private静态字符串PascelCaseToupperCaseedBy下划线分隔(字符串s){
String[]values=s.split((?您可以使用的)

如果您可以使用,您可以:

String camelCase = "CamelCase";

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

System.out.println(underscore);
String underscore = String.join("_", Arrays.asList(camelCase.split("(?=[A-Z])")).stream()
    .map(String::toUpperCase).collect(Collectors.toList()));
如果您只想使用正则表达式,可以执行以下操作:

String camelCase = "CamelCase";

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

System.out.println(underscore);
String underscore = String.join("_", Arrays.asList(camelCase.split("(?=[A-Z])")).stream()
    .map(String::toUpperCase).collect(Collectors.toList()));
输出

CAMEL_CASE

在这个任务中使用正则表达式似乎有些过分

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();
}
私有静态字符串CamelCaseToupperCase由下划线分隔(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
只需在字符串上迭代,添加转换为大写的当前字符,并在从小写转换为大写时添加下划线。

您可以使用和


乍一看,您的正则表达式看起来很复杂,这可能会阻碍其他阅读您的代码并且不熟悉正则表达式的人。您可以用更简洁易读的正则表达式替换它:

"(?=\\p{Upper})"
对于流,这一行读起来几乎像纯文本

private static String camelCaseToUpperCaseSeparatedByUnderscore(String s) {
    return Pattern.compile("(?=\\p{Upper})")
                  .splitAsStream(s)
                  .map(String::toUpperCase)
                  .collect(Collectors.joining("_"));
}
利用正则表达式,你也可以这样做

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

这回答了你的问题吗?@jnorman这类回答回答了我的问题。谢谢。这个问题中被接受的答案,就是这个问题中被接受的答案。@jnorman很多人已经在这里写了答案,所以让我们也保留它。很好的解决方案+1。你可能想解释你是如何在一个职位上而不是在一个特定的职位上分裂的c字符串或字符(由于lookaheads的零宽度行为)。@厄立特里亚人我对正则表达式不太在行,仍在努力简化我的代码。是的,我接受了上面相同的答案。谢谢。@ChakladerAsfakArefe没问题。