Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连续的替换调用失败_Java_Regex - Fatal编程技术网

Java 连续的替换调用失败

Java 连续的替换调用失败,java,regex,Java,Regex,正则表达式中的3个组: 模式=ab123c 我需要摆脱a,b,c 在Java中: while (matcher.find()) { matcher.appendReplacement(sb, ""); matcher.appendReplacement(sb, ""); // fails from here matcher.appendReplacement(sb, ""); } 例外情况: java.lang.StringIndexOutOfBoundsException: St

正则表达式中的3个组:

模式=ab123c

我需要摆脱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和非emtpy的新StringBuffertarget_text_str

java 1.6.0_21-b07

每个查找调用应该只有一个appendReplacement调用:

这将删除输入中的所有匹配项

如您所述,如果要删除匹配项的某些部分,则必须对要保留的部分进行分组,并将其添加到替换项中。使用ab123c模式,您可以执行以下操作:

while (matcher.find()) {
  matcher.appendReplacement(sb, "$1");
}
如果您出于某些其他原因需要其他组(例如,您需要对其进行评估),则您可以保留这些组,即使用ab123c,并使用$3而不是$1引用第三个组。

每个查找调用应该只有一个appendReplacement调用:

这将删除输入中的所有匹配项

如您所述,如果要删除匹配项的某些部分,则必须对要保留的部分进行分组,并将其添加到替换项中。使用ab123c模式,您可以执行以下操作:

while (matcher.find()) {
  matcher.appendReplacement(sb, "$1");
}
如果您出于某些其他原因需要其他组(例如,您需要对其进行评估),则可以保留它们,即使用ab123c,并使用$3而不是$1引用第三组


请参阅

@Oltarus:它可能是一个StringBuffer.@Oltarus:abterm1,term2,term3c@Oltarus:它可能是一个StringBuffer。@Oltarus:abterm1,term2,term3c为什么这会替换$1和$2?@D_K,它会用您想要保留的部分替换整个匹配项,从而删除您不想要的部分。这很好,错过了123部分。伟大的你和约阿希姆·绍尔都有资格得到答案。stackoverlow不允许我将这两个标记为问题的答案。为什么这将替换$1和$2?@D_K,它将整个匹配替换为您想要保留的部分,从而删除您不想要的部分。这很好,错过了123部分。伟大的你和约阿希姆·绍尔都有资格得到答案。stackoverlow不允许我将两者都标记为问题的答案。
pattern = "(a)(b)(123)(c)"

// ...

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