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)'

有人知道为什么这不起作用吗?

4

2 回答 2

0

当您进行正则表达式匹配和替换时,您根本不应该使用String.replaceAll方法......您应该使用内置的匹配器Matcher.appendReplacementMatcher.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)'
于 2012-05-22T13:38:19.193 回答
0

replaceAll()使用第一个参数作为正则表达式。在您的第一组中,您拥有\xfa未转义的\. 尝试\在组的开头添加一个。

于 2012-05-22T13:44:11.393 回答