我从另一个StackOverflow帖子中复制了这段代码。但是,我遇到了一些问题。与指定模式匹配的项目应该被替换,但它们不是。
代码是:
protected String FixHexValuesInString(String str){
Log.v(TAG, "before fix: "+ str);
Matcher matcher = Pattern.compile("\\\\x([0-9a-f]{2})").matcher(str);
while (matcher.find()) {
int codepoint = Integer.valueOf(matcher.group(1), 16);
Log.v(TAG, "matcher group 0: " + matcher.group(0));
Log.v(TAG, "matcher group 1: " + matcher.group(1));
str = str.replaceAll(matcher.group(0), String.valueOf((char) codepoint));
}
Log.v(TAG, " after fix: "+ str);
return str;
}
这是我写给LogCat的一个例子:
before fix: 'id': 1268, 'name': 'Reserva de Usos M\xfaltiples de la Cuenca del Lago de Atitl\xe1n-RUMCLA (Atitl\xe1n Watershed Multiple Use Reserve)'
matcher group 0: \xfa
matcher group 1: fa
matcher group 0: \xe1
matcher group 1: e1
matcher group 0: \xe1
matcher group 1: e1
after fix: 'id': 1268, 'name': 'Reserva de Usos M\xfaltiples de la Cuenca del Lago de Atitl\xe1n-RUMCLA (Atitl\xe1n Watershed Multiple Use Reserve)'
有人知道为什么这不起作用吗?
答案 0 :(得分:1)
当您进行正则表达式匹配和替换时,您根本不应该使用String.replaceAll
方法...您应该使用内置Matcher.appendReplacement
和Matcher.appendTail
方法的匹配器这样:
public static void main(String[] args) {
String str = "'id': 1268, 'name': 'Reserva de Usos M\\xfaltiples de " +
"la Cuenca del Lago de Atitl\\xe1n-RUMCLA (Atitl\\xe1n " +
"Watershed Multiple Use Reserve)'";
Matcher matcher = Pattern.compile("\\\\x([0-9a-f]{2})").matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
int codepoint = Integer.valueOf(matcher.group(1), 16);
matcher.appendReplacement(sb, String.valueOf((char) codepoint));
}
matcher.appendTail(sb);
System.out.println(sb);
}
输出:
'id': 1268, 'name': 'Reserva de Usos Múltiples de la Cuenca del Lago de Atitlán-RUMCLA (Atitlán Watershed Multiple Use Reserve)'
答案 1 :(得分:0)
replaceAll()
使用第一个参数作为regex。在您的第一个群组中,您有\xfa
,这是一个未转义的\
。尝试将\
添加到群组的开头。