连续的appendReplacement调用失败

时间:2011-07-06 11:24:31

标签: java regex

正则表达式中的3个组:

模式=(a)(b)123(c)

我需要摆脱a,b,c

Java中的

while (matcher.find()) {
  matcher.appendReplacement(sb, "");
  matcher.appendReplacement(sb, ""); // fails from here
  matcher.appendReplacement(sb, "");
}

异常:

java.lang.StringIndexOutOfBoundsException: String index out of range: -30
    at java.lang.String.substring(Unknown Source)
    at java.lang.String.subSequence(Unknown Source)
    at java.util.regex.Matcher.getSubSequence(Unknown Source)
    at java.util.regex.Matcher.appendReplacement(Unknown Source)

有没有办法连续替换匹配的组?

编辑:sb是StringBuffer。已经尝试了空new StringBuffer()和非空情new StringBuffer(target_text_str)

java 1.6.0_21-b07

2 个答案:

答案 0 :(得分:2)

appendReplacement()次来电,您应该只有find()次来电:

while (matcher.find()) {
  matcher.appendReplacement(sb, "");
}

这将删除输入中的每个整个匹配。

如果您按照指示要删除某些部分匹配项,那么您必须将要保留的部分分组并将其添加到替换项中。使用模式ab(123)c,您可以这样做:

while (matcher.find()) {
  matcher.appendReplacement(sb, "$1");
}

如果由于某些其他原因需要其他组(例如,您需要评估它们),那么您可以保留它们(即使用(a)(b)(123)(c)并使用$3而不是{$1引用第三组{1}})。

答案 1 :(得分:2)

pattern = "(a)(b)(123)(c)"

// ...

while (matcher.find()) {
  matcher.appendReplacement(sb, "$3");
}

请参阅the docs