android,matcher.appendReplacement(sb,'$ 8')通过ArrayIndexOutOfBoundsException

时间:2013-12-12 00:52:55

标签: android regex

这是在Adroid 4.2.2上运行的。使用正则表达式模式和匹配器与appendReplacement()。 它的作用是将从远程源接收的html字符串中的一些占位符替换为一些自定义数据。

奇怪的是,除了'$ 8'之外,所有其他字符串都很好。任何数字跟随'$'它将抛出异常。只有数字或'$'才会抛出。 这是简化的代码段。

            String patternStr = "(PlaceHolder)";
    final Pattern cPattern = Pattern.compile(patternStr, Pattern.DOTALL);
    StringBuffer sb = new StringBuffer();

    Matcher matcher = cPattern.matcher(srcData);

    try{
    while(matcher.find()) {

        String newData = "<span>Price: $8 </span> ";
        try {
        matcher.appendReplacement(sb, newData);  //<== throws

        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception(ex);
        }
    }
    matcher.appendTail(sb);

例外显示:

java.lang.ArrayIndexOutOfBoundsException: length=4; index=16
java.util.regex.Matcher.group(Matcher.java:353)
java.util.regex.Matcher.appendEvaluated(Matcher.java:137)
java.util.regex.Matcher.appendReplacement(Matcher.java:110)

“$”后跟数字有什么特别之处?

谢谢!

编辑:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#appendReplacement%28java.lang.StringBuffer,%20java.lang.String%29解释了!

1 个答案:

答案 0 :(得分:3)

来自Matcher的oracle页面:source

  

请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符。

尝试转义$