在包含特殊字符的特定字符串上使用replaceAll时,android - java.lang.ArrayIndexOutOfBoundsException

时间:2015-05-12 13:49:29

标签: java android replace replaceall

问题

我正在使用Abatis作为ORM。当我尝试插入包含特定字符串的json时,它会崩溃。

我从Abatis中提取了生成错误的代码:

CODE

            Map<String, Object> bindParams = new HashMap<String, Object>();

            bindParams.put("id", "194fa0f2-9706-493f-97ab-4eb300a8e4ed");
            bindParams.put("field", "{\"Messages\":\"ERRORE durante l'invocazione del servizio. 01 - Executor [java.util.concurrent.ThreadPoolExecutor@18a96588] did not accept task: org.springframework.aop.interceptor.AsyncExecutionInterceptor$1@14a7c67b\",\"Errors\":1}");

            String sql = "UPDATE <TABLE> SET NoteAgente = #field# WHERE Id = #id#";

            if (bindParams != null) {
                Iterator<String> mapIterator = bindParams.keySet().iterator();
                while (mapIterator.hasNext()) {
                    String key = mapIterator.next();
                    Object value = bindParams.get(key);

                    if(value instanceof String && value != null)
                        value = value.toString().replace("'", "''");

                    sql = sql.replaceAll("#" + key + "#", value == null ? "null"
                            : "'" + value.toString() + "'");
                }
            }

问题出在 replaceAll 方法中,字符串为 $ 1 @ 14a7c67b 。你也可以调试它写

String s = "onetwothree";               
s = s.replaceAll("one", "$1@14a7c67b");

它也会崩溃。

1 个答案:

答案 0 :(得分:3)

replaceAll采用正则表达式参数,$1是告诉java正则表达式引擎使用group-one作为替换的特殊方法。

您需要使用匹配/替换字符串的replace

String s = "onetwothree";
s = s.replace("one", "$1@14a7c67b");

如果您仍然需要使用$,也可以转义replaceAll字符:

s = s.replaceAll("one", "\\$1@14a7c67b");