我遇到了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异常。我真的不知道它发生了什么。任何帮助,将不胜感激。
注意 - 替换数组的长度始终等于 {#} 出现次数。
答案 0 :(得分:1)
对于您的问题,请参阅javadoc。 String.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();