Я скопировал этот код из другого сообщения 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)'
Кто-нибудь видит, почему это не работает?
Вам не следует использовать метод 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)'
replaceAll()
использует первый параметр как регулярное выражение. В вашей первой группе у вас есть \xfa
который является \xfa
\
. Попробуйте добавить \
в начало вашей группы.
replaceAll
для каждого совпадения?