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



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

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

这不是

您使用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());

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

每次

都使用 StringBuilder 附加值。

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

而不是

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

将传出值分配给主文本

最新更新