我想替换StringBuilder中的一些文本。怎么做?
在此代码中,我java.lang.StringIndexOutOfBoundsException
与matcher.find()
:
StringBuilder sb = new StringBuilder(input);
Pattern pattern = Pattern.compile(str_pattern);
Matcher matcher = pattern.matcher(sb);
while (matcher.find())
sb.replace(matcher.start(), matcher.end(), "x");
答案 0 :(得分:4)
让我们拥有一个总长度为50的StringBuilder,并将前20个参数更改为“x”。所以StringBuilder缩小了19,对 - 但是初始输入pattern.matcher(sb)没有改变,所以最后是StringIndexOutOfBoundsException。
答案 1 :(得分:2)
我通过添加matcher.reset()
:
while (matcher.find())
{
sb.replace(matcher.start(), matcher.end(), "x");
matcher.reset();
}
答案 2 :(得分:1)
这已经是一个报告的错误,我猜他们正在寻找修复它。阅读更多here。
答案 3 :(得分:1)
你不应该这样做。 Matcher的输入可以是任何CharSequence,但序列不应该改变。像你一样匹配就像在同时删除元素时迭代Collection一样,这不起作用。
然而,也许有一个解决方案:
while (matcher.find()) {
sb.replace(matcher.start(), matcher.end(), "x");
matcher.region(matcher.start() + "x".length(), sb.length());
}
答案 4 :(得分:0)
也许:
int lookIndex = 0;
while (lookIndex < builder.length() && matcher.find(lookIndex)) {
lookIndex = matcher.start()+1;
builder.replace(matcher.start(), matcher.end(), repl);
}
...
带有整数参数的.find(n)声称在开始查看指定的索引之前重置匹配器。这将解决上面maartinus评论中提出的问题。
答案 5 :(得分:0)
使用StringBuidler.replace()的另一个问题是无法处理捕获组。