2014-02-11 52 views
4

所以我有一個字符串像Java的正則表達式爲大寫

翻新爲2000cc的汽車

引擎,我想這變成

爲2000CC的車

翻新機

大寫cc在2000CC上。我顯然不能這樣做text.replaceAll("cc","CC");,因爲它會替換大寫版本的cc的所有事件,所以加速器這個詞會變成加速器。在我的情況下,前四位數字總是四位數字,後跟字母cc,所以我認爲這可以用正則表達式來完成。

我的問題是如何在Java中將cc轉換爲CC,當它跟隨4位數並獲得我期待的結果?

String text = text.replaceAll("[0-9]{4}[c]{2}", "?"); 
+0

你可以說文字。toUpperCase(); – Zeus

+1

順便說一句,你不需要圍繞「c」的括號。 ;) – tenub

+0

@Zeus然後這將會把所有其他的文字轉換成大寫。我需要使用apaches WordUtils.CapitalizeFully方法來實現這一目標。感謝您的建議,但。 – Ashley

回答

3

如果你只需要轉換cc爲大寫,如果是固定的,那麼你可以只更換與CC的比賽。

Java中沒有針對此的通用解決方案。你必須這樣做Matcher#appendReplacement()Matcher#appendTail()

String str = "Refurbished Engine for 2000cc Vehicles"; 
Pattern pattern = Pattern.compile("\\d{4}cc"); 
Matcher matcher = pattern.matcher(str); 

StringBuffer result = new StringBuffer(); 
while (matcher.find()) { 
    matcher.appendReplacement(result, matcher.group().toUpperCase()); 
} 

matcher.appendTail(result); 

System.out.println(result.toString()); 
+0

+1總是有更好的解決方案。 – anubhava

+0

謝謝。這工作的一種享受,也適用於'加熱器控制莢近(左)1700cc-2000cc'。 – Ashley

+0

@AshleySwatton不客氣:) –

7

你可以嘗試用

text = text.replaceAll("(\\d{4})cc", "$1CC"); 
//       ↓   ↑ 
//       +→→→→→→→→→→+ 

絕招是把數組(通過括號),並從該組中更換零件以後使用的匹配(通過$x其中x爲組號)。

如果您想確保匹配的文本不是其他單詞的一部分,您可以用word boundaries"\\b"圍繞該正則表達式。您還可以使用look-adound機制來確保匹配文本之前和/或之後沒有字母數字字符。

+0

@Gene'\\ 1'在正則表達式部分'$ 1'中的替換部分 – Pshemo

+0

是的。謝謝。 Java字符串和正則表達式的混合(與Perl,Ruby等內置的地方相比)讓我一遍又一遍...... – Gene

+0

@ Genene沒問題。發生在每個人:) – Pshemo

2

一種方法是陷阱的數字部分與()一組,然後在替換使用反向引用到該組:

這是測試:

public static void main(String [] args) { 
    String s = "1000cc abc 9999cc"; 
    String t = s.replaceAll("(\\d{4})cc", "$1CC"); 
    System.err.println(t); 
} 
2

也許你可以這樣做:

String text = text.replaceAll("(?<=\\b[0-9]{4})cc\\b", "CC"); 

(?<=\\b[0-9]{4})是一個積極的回顧後,將確保只有cc由4個數字(不超過4個前面的匹配這條規則被強制執行單詞邊界\\b(僅在單詞的末尾匹配,其中單詞被定義爲匹配\\w+的一組字符)。另外,由於後向視圖是零寬度斷言,因此它們不計入匹配。

如果CC的數量可以改變,那麼它可能是最簡單的檢查只有一個號碼:

String text = text.replaceAll("(?<=[0-9])cc\\b", "CC");