将Java字符串从所有大写字母(由下划线分隔的单词)转换为CamelCase(无单词分隔符)的最简单方法是什么?

Mat*_*all 136 java regex string

标题基本概括了所有内容.我能用Java格式"THIS_IS_AN_EXAMPLE_STRING"转换格式为" ThisIsAnExampleString" 的字符串的最简单/最优雅的方法是什么?我认为必须至少有一种方法可以使用String.replaceAll()和正则表达式.

我最初的想法是:在字符串前加下划线(_),将整个字符串转换为小写,然后使用replaceAll将每个前面带下划线的字符转换为大写字母.

Arn*_*len 176

另一种选择是使用谷歌番石榴 com.google.common.base.CaseFormat

George Hawkins在这个用法示例中留下了评论:

CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "THIS_IS_AN_EXAMPLE_STRING");
Run Code Online (Sandbox Code Playgroud)

  • 我正在为Android开发,我想念纯Java的答案. (4认同)
  • 有关示例,请参阅George Hawkins [用户:245602]的评论.http://stackoverflow.com/questions/1143951/what-is-the-simplest-way-to-convert-a-java-string-from-all-caps-words-separated#comment6639663_1143979 (3认同)

Dan*_*ell 119

看一下Apache Commons lang中的WordUtils:

具体来说,capitalizeFully(String str,char [] delimiters)方法应该完成这项工作:

String blah = "LORD_OF_THE_RINGS";
assertEquals("LordOfTheRings", WordUtils.capitalizeFully(blah, new char[]{'_'}).replaceAll("_", ""));
Run Code Online (Sandbox Code Playgroud)

绿吧!

  • 不,先生!我们应该自己重写这些现有的,已经在工作的实用程序,因为我们是合适的程序员! (50认同)
  • 星期五下午是16:42.我会让其他人改写它,我要去喝啤酒\ o /;) (21认同)
  • 我尊重你的决定马特,你的位置可能是正确的.但是,请考虑以下事项:*团队中的其他人决定他们需要例程来交换字母大小写.他们实施它.你现在有20行维护.如果你使用图书馆,你会有~2.不要忘记单元测试!*接受的答案有一个缺点,即方法名称没有描述代码的作用.像公共资源这样重复使用的API很少有这些缺点.关键是维护是软件的最大成本.通常,重复使用是个好主意. (6认同)
  • 要"访问此特定包",请将http://repo1.maven.org/maven2/commons-lang/commons-lang/2.5/commons-lang-2.5.jar放入您的类路径中.Maven神器是**commons-lang:commons-lang:2.5**,它可以从Maven Central获得. (2认同)

C. *_*oss 89

static String toCamelCase(String s){
   String[] parts = s.split("_");
   String camelCaseString = "";
   for (String part : parts){
      camelCaseString = camelCaseString + toProperCase(part);
   }
   return camelCaseString;
}

static String toProperCase(String s) {
    return s.substring(0, 1).toUpperCase() +
               s.substring(1).toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

注意:您需要添加参数验证.

  • Google guava库具有更通用的实用程序枚举,用于在常见约定之间进行转换.对于这种情况,你会做`String result = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL,"THIS_IS_AN_EXAMPLE_STRING");`.请参阅[com.google.common.base.CaseFormat javadoc](http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/CaseFormat.html). (57认同)
  • @DanGravell:删除下划线后,再也无法区分单词. (2认同)

lib*_*cha 17

使用Apache Commons Lang3 lib非常容易.

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.text.WordUtils;

public String getName(String text) {
  return StringUtils.remove(WordUtils.capitalizeFully(text, '_'), "_");
}
Run Code Online (Sandbox Code Playgroud)

例:

getName("SOME_CONSTANT");
Run Code Online (Sandbox Code Playgroud)

得到:

"SomeConstant"
Run Code Online (Sandbox Code Playgroud)

  • 对于变量名,这是无效的,因为名称必须以小写字母开头。 (2认同)

Yis*_*hai 9

public static void main(String[] args) {
    String start = "THIS_IS_A_TEST";
    StringBuffer sb = new StringBuffer();
    for (String s : start.split("_")) {
        sb.append(Character.toUpperCase(s.charAt(0)));
        if (s.length() > 1) {
            sb.append(s.substring(1, s.length()).toLowerCase());
        }
    }
    System.out.println(sb);
}
Run Code Online (Sandbox Code Playgroud)

  • s.length测试没有必要 (2认同)

Ale*_*x B 8

以下是可能有用的代码段:

String input = "ABC_DEF";
StringBuilder sb = new StringBuilder();
for( String oneString : input.toLowerCase().split("_") )
{
    sb.append( oneString.substring(0,1).toUpperCase() );
    sb.append( oneString.substring(1) );
}

// sb now holds your desired String
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 8

使用 Streams 的 Java 1.8 示例

String text = "THIS_IS_SOME_TEXT";

String bactrianCamel = Stream.of(text.split("[^a-zA-Z0-9]"))
        .map(v -> v.substring(0, 1).toUpperCase() + v.substring(1).toLowerCase())
        .collect(Collectors.joining());
String dromedaryCamel = bactrianCamel.toLowerCase().substring(0, 1) + bactrianCamel.substring(1); 

System.out.printf("%s is now %s%n", text, dromedaryCamel); 
Run Code Online (Sandbox Code Playgroud)

THIS_IS_SOME_TEXT现在是thisIsSomeText


Jac*_*gen 7

Apache Commons 项目现在有CaseUtils类,它有一个toCamelCase方法,完全按照 OP 的要求执行:

 CaseUtils.toCamelCase("THIS_IS_AN_EXAMPLE_STRING", true, '_');
Run Code Online (Sandbox Code Playgroud)