我将在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
。
我的代码出了什么问题?
答案 0 :(得分:4)
这不是您使用Matcher
进行替换的方式。 m.group()
只是给你匹配的字符串部分。无论你做什么替换,你必须用原始字符串执行连接。这是因为String
是不可变对象。您不会对其进行就地替换。
执行此操作的正确方法是创建StringBuffer
对象,并使用Matcher#appendReplacement
和Matcher#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