Android模式有$符号问题

时间:2011-08-31 02:06:27

标签: android regex

我遇到了android正则表达式模式的问题。

我的目标是在一个句子中找到 {#} ,并用String数组替换它们。

例如,我的原始字符串将是

  

{#}学生转到{#}。

我的替换阵列将是

  

[ “5”, “公园”]

更换后,最后的字符串应为“5名学生去公园”。我的当前代码段工作正常,直到替换数组出现$ sign(例如

  

[ “5 $”, “$公园”]

这是我目前的片段。

 Pattern pattern = Pattern.compile("(\\{#\\})");
 String raw_q = "Pete has {#}. He bought {#}.";
 String[] var = ["$70","6 pens at $5 each"];
 String act_q = "";
 for (int m = 0; m < var.length(); m++) {
    try{
       act_q = raw_q.replaceFirst(pattern.pattern(),var[m]);
    }catch(Exception e){
       e.printStackTrace();
    }

结果是一个空白字符串,我相信try块永远不会被执行。堆栈跟踪显示arrayindexoutofbound异常。我真的不知道它发生了什么。任何帮助,将不胜感激。

注意 - 替换数组的长度始终等于 {#} 出现次数。

1 个答案:

答案 0 :(得分:1)

对于您的问题,请参阅javadocString.replaceFirst()使用Matcher.replaceFirst(),引用Matcher.appendReplacement()

  

请注意替换中的反斜杠()和美元符号($)   字符串可能会导致结果与正确的结果不同   作为文字替换字符串处理。可以对待美元符号   作为对如上所述的捕获的子序列的引用,和   反斜杠用于替换替换中的文字字符   字符串。

也就是说,您必须转义所有$\


但是你有其他问题....你已经编译了一个模式而没有使用它! replaceFirst()总是再次编译模式。试试这个可以获得更好的性能。

Matcher m = pattern.matcher(raw_q);
StringBuffer sb = new StringBuffer();
int i = 0;
while (m.find()) {
     m.appendReplacement(sb, var[i].replaceAll("\\$", "\\\\$"));
     i++;
}
m.appendTail(sb);
act_q = sb.toString();