Regex ReplaceAll не работает

1

Я скопировал этот код из другого сообщения 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)'

Кто-нибудь видит, почему это не работает?

Теги:

2 ответа

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)'
  • 0
    Это сработало отлично. Спасибо за помощь.
0

replaceAll() использует первый параметр как регулярное выражение. В вашей первой группе у вас есть \xfa который является \xfa \. Попробуйте добавить \ в начало вашей группы.

  • 0
    Зачем заменять все вхождения на replaceAll для каждого совпадения?
  • 0
    Почему нет? Есть ли выигрыш в производительности? Похоже, он хочет заменить все вхождения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню