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

4

3 回答 3

4

这不是您使用Matcher. m.group()只是给你字符串的匹配部分。无论您在其中进行什么替换,都必须与原始字符串执行连接。这是因为Strings 是不可变对象。您不对它执行就地替换。

正确的方法是创建一个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());
于 2013-10-14T07:33:15.013 回答
2

字符串是最终的且不可变的,您必须将新字符串分配给它自己。

于 2013-10-14T07:29:58.167 回答
0

use StringBuilder to append the values every time.

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

instead of

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

Assign the outcoming value to the mainText

于 2013-10-14T07:34:27.127 回答