2013-07-16 86 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); 
    } 

不是嗎?