2013-10-14 182 views
0

我要在字符串中查找數字字符並將其替換爲阿拉伯語版本。 的代碼是:用阿拉伯數字替換字符串的英文數字

public static void main(String[] args) { 

    String pattern = "[0-9]+"; 
    Pattern p = Pattern.compile(pattern); 
    String mainText = "34titi685dytti5685fjjfj8585443"; 
    Matcher m = p.matcher(mainText); 

    int i = 0; 

    while (m.find()) { 

     System.out.println("Match number " + i); 
     String tmp = m.group(); 
     char[] cTmp = tmp.toCharArray(); 
     for (int j = 0; j < cTmp.length; j++) { 
      cTmp[j] = (char) ((int) cTmp[j] + 1584); 
     } 

     m.group().replaceFirst(tmp,new String(cTmp)); 
     i++; 
    } 
    System.out.println(mainText); 
} 

但最後它打印相同的字符串mainText。 我的代碼有什麼問題?

+0

出於好奇的緣故:什麼是英文數字與阿拉伯數字? –

回答

4

這不是你如何使用Matcher做替換。 m.group()只是給你的字符串的匹配部分。無論您在其中做什麼替換,都必須使用原始字符串進行連接。這是由於String是不可變的對象。您不要執行就地更換。

正確的方法是創建一個StringBuffer對象,並使用Matcher#appendReplacementMatcher#appendTail方法。

你不喜歡這樣:

StringBuffer buffer = new StringBuffer(); 

while (m.find()) { 

    String tmp = m.group(); 
    char[] cTmp = tmp.toCharArray(); 

    for (int j = 0; j < cTmp.length; j++) { 
     cTmp[j] = (char) (cTmp[j] + 1584); // You don't need to typecast `cTmp[j]` to `int`. 
    } 

    m.appendReplacement(buffer, new String(cTmp)); 

} 

m.appendTail(buffer); 

System.out.println(buffer.toString()); 
+1

也許你應該添加,該字符串是不可變的對象,所以他不能將其替換在原始對象 – JohnnyAW

+0

@JohnnyAW增加:) –

2

字符串是最終的且不可變的,您必須將新字符串分配給自己。

+0

在這個答案中包含一個示例行將會很好,它顯示了OP需要進行的分配類型。 –

0

使用StringBuilder每次追加值。

StringBuilder stringBuilder = new StringBuilder(); 
// 
// 
m.group().replaceFirst(stringBuilder,new String(cTmp)); 

代替

m.group().replaceFirst(tmp,new String(cTmp)); 

分配outcoming值到的mainText

+1

這將無法正常工作。 –

+0

@RohitJain是的,你糾正它只顯示最後取代的值 – newuser

+0

我只需要更換數字不是整個字符串 –

相關問題