2012-10-22 37 views
0

我想使用正則表達式以下問題:正則表達式替換2個字符與一個

SOME_RANDOM_TEXT 

應轉換爲:

someRandomText 

如此,_(任何字符)應該用大寫字母替換。我發現類似的東西,使用tool

_\w and $& 

如何讓僅從更換的第二個字母?有什麼建議?謝謝。

+0

某些語言具有標誌(例如\ u將相鄰的反向引用轉換爲小寫),可以修改反向引用,我不知道在java中是否有這種情況 –

+0

遺憾的是不是 –

+1

如果正則表達式是一個選項,會在正則表達式和替換字符串中的$ 1中使用_([A-Za-z])或'_(\ p {L})'。圓括號捕獲組#1中的字母(假設它是第一組parens),'$ 1'作爲替換字符串中該組的佔位符。 ('\ w'是不正確的,因爲它除了字母外還匹配數字和下劃線,'\ p {L}'比'[A-Za-z]更正確,因爲它匹配Unicode字母,而不僅僅是ASCII。 ) –

回答

4

String.split("_")來說可能比較簡單,然後重新加入,將大小寫爲集合中每個字符串的首字母。

請注意,Apache Commons有很多有用的字符串相關的東西,包括join()方法。

+0

謝謝,我真的不明白lookbehind如何與替換部分($&)一起工作... – immerhart

+0

由於上述方法更簡單/不太容易出錯等,我已經刪除了向後向外部引用。 –

-1

你也可以寫一個簡單的方法來做到這一點。它更復雜,但更優化:

public static String toCamelCase(String value) { 
    value = value.toLowerCase(); 
    byte[] source = value.getBytes(); 
    int maxLen = source.length; 
    byte[] target = new byte[maxLen]; 
    int targetIndex = 0; 

    for (int sourceIndex = 0; sourceIndex < maxLen; sourceIndex++) { 
     byte c = source[sourceIndex]; 
     if (c == '_') { 
      if (sourceIndex < maxLen - 1) 
       source[sourceIndex + 1] = (byte) Character.toUpperCase(source[sourceIndex + 1]); 
      continue; 
     } 

     target[targetIndex++] = source[sourceIndex]; 
    } 

    return new String(target, 0, targetIndex); 
} 

我喜歡阿帕奇公共圖書館,但有時它的好,知道它是如何工作的,並能編寫一些特定的代碼,像這樣的工作。

+0

它是使用字節錯誤。你應該使用'toCharArray'。 –

+0

-1 - 不幸的是不是Unicode安全的 –

+0

這種方法有什麼錯? – immerhart

1

問題是不支持從小寫轉換爲大寫的情況Java.util.regex.Pattern 這意味着您需要按照Brian的建議以編程方式進行轉換。另請參閱this thread

+0

爲什麼這麼說:「(?<= _)(\ w)」而不是:「_ \ w」? – immerhart

+1

請再次注意,正則表達式可能不是你正在尋找的。但僅供參考,'_ \ w'匹配下面的下劃線和字母字符,而'(?<= _)(\ w)'只匹配字母字符。 – cooltea

+0

是的,'_ \ w'消耗下劃線,但那又如何?無論如何,你並沒有保留它,而你正在捕獲這封信。即使你可以使用這個正則表達式,lookbehinds也是無關緊要的。 (只是你知道,'\ w'匹配下劃線和數字以及字母。) –