2013-07-16 87 views
2

我有一个String str = "a_bcde_fghij_k"如何在java中替换字符串?

,我想将其更改为"aBcdeFghijK"

如果有_字符,下一个字符将改变为大写并删除_字符。

我该怎么做?

+2

可能重复的[如何替换字符串中的特殊字符?](http://stackoverflow.com/questions/4283351/how-to-replace-special-characters-in-a-string) –

+6

@AdamArold:我不明白它是如何重复的。这部分涉及“大写下一个字母”? –

+1

当有两个下划线(如“__a”)时应该发生什么? – f1sh

回答

10

我怀疑你需要只是逐字地浏览这个角色,在你走的时候建立起这个字符串。例如:

public static String underscoreToCapital(String text) { 
    // This will be a bit bigger than necessary, but that shouldn't matter. 
    StringBuilder builder = new StringBuilder(text.length()); 
    boolean capitalizeNext = false; 
    for (int i = 0; i < text.length(); i++) { 
     char c = text.charAt(i); 
     if (c == '_') { 
      capitalizeNext = true; 
     } else { 
      builder.append(capitalizeNext ? Character.toUpperCase(c) : c); 
      capitalizeNext = false; 
     } 
    } 
    return builder.toString(); 
} 
+2

像往常一样清洁和正确。无法击败Jon Skeet® – f1sh

+0

我认为正则表达式给出了更简单的代码,但可能更慢一些。 – m0skit0

+0

哦,顺便说一句'text.length()';) – m0skit0

4

正则表达式本身不能做到这一点(没有“touppercase”操作符,可以这么说)。

Guava有一个名为CaseFormat一个可爱的小工具,可以帮助你:

String result = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, str) 

这工作,甚至“虽然你的输入不是严格UPPER_UNDERSCORE格式,但CaseFormat是宽松的这种方式(如果你想要第一个字符大写,并使用UPPER_CAMEL)。

另外,如果你绝对要使用正则表达式,你可以使用Matcher.appendReplacement(它在JavaDoc一个很好的例子):

public static final Pattern UNDERSCORE_FOLLOWED_BY_ANYTHING = Pattern 
     .compile("_(.)"); 

public static String toUpperAfterUnderscore(String input) { 
    Matcher m = UNDERSCORE_FOLLOWED_BY_ANYTHING.matcher(input); 
    StringBuffer sb = new StringBuffer(); 
    while (m.find()) { 
     m.appendReplacement(sb, m.group(1).toUpperCase()); 
    } 
    m.appendTail(sb); 
    return sb.toString(); 
} 
+0

不错的答案,有用的信息,但嗯外部库... +1无论如何 – m0skit0

+1

@ m0skit0:番石榴包含这么多有用的小工具,它确实应该是每一个非平凡项目的依赖(以及一些不重要的项目)。 –

2

您也可以尝试分裂。

String str = "a_bcde_fghij_k" 
String result[] = str.split("_"); 
String newstr = result[0]; 
for (int i=1;i<result.length;i++) { 
    char first = Character.toUpperCase(result[i].charAt(0)); 
    newstr = newstr + first + result[i].substring(1); 
} 
System.out.println(newstr); 

split()需要正则表达式,如果你觉得这很重要。

+1

这也使用'String'进行连接,它应该使用'StringBuilder'(或者至少''StringBuffer'),它们被*制作*来操纵。 –

0

有没有立竿见影的方法与正则表达式来做到这一点,但我想用正则表达式可以大大简化了任务:

public static String underscoreToCapital(final String input) { 
    String ret = input; 
    final Matcher m = Pattern.compile("_([a-z])").matcher(input); 
    while (m.find()) { 
     final String found = m.group(); 
     final String toUppercase = m.group(1); 
     ret = ret.replaceAll(found, toUppercase.toUpperCase()); 
    } 
    return ret; 
} 
+0

我个人认为这并不简单。 (我收回我的建议,它不起作用,但我仍然认为它不像迭代一样清楚。) –

+0

输入:'a_acde_fghij_k'输出:'a_Acde_Fghij_K'这是你的意思吗?还编辑它来匹配问题,我保持下划线... – m0skit0

+0

@JonSkeet回答编辑使你的评论正确:)再次编辑它,所以现在它确实工作。 – m0skit0

0

你有可能做这种方法的执行一些检查,但,这可能是另一个想法:从我

public String replaceAndUpper(String word) { 
    int charToRemove = word.indexOf("_"); 
    while (charToRemove != -1) { 
     String part1 = word.substring(0, charToRemove); 
     String part2 = word.substring(charToRemove + 1); 
     char upperChar = Character.toUpperCase(part2.charAt(0)); 
     word = part1 + String.valueOf(upperChar) + part2.substring(1); 
     charToRemove = word.indexOf("_"); 
    } 
    return word; 
} 
+1

你应该使用一个StringBuilder/Buffer(用于构建结果)用于这些类型的连接(提供更好的性能) – giorashc

+0

是的,这可能是一种改进。顺便说一句,'+'应该在内部转换为使用StringBuilder,如果我没有错。 – Enrichman

+0

对子串的调用也太多了。使用String#charAt()'更好。 – m0skit0

1

稍微不同的方法,但做工不错..

String str = "a_bcde_fghij_k"; 
    int count=0; 
    String[] splitString = (str.split("_")); 

    for (String string : splitString) 
    { 
    count++;   
    if(count>1) 
    { 
     char c= string.charAt(0); 
     System.out.print(string.replace(c, Character.toUpperCase(c))); 
    } 
    else 
     System.out.print(string); 
    } 

不是吗?