用阿拉伯数字替换字符串的英文数字

时间:2013-10-14 07:28:30

标签: java regex

我将在String中找到数字字符,并用阿拉伯语版本替换它们。 守则是:

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。 我的代码出了什么问题?

3 个答案:

答案 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 :(得分:2)

String是final和immutable,你必须将新字符串赋给它自己。

答案 2 :(得分:0)

每次使用StringBuilder附加值。

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

而不是

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

将输出值分配给mainText