通过正则表达式替换StringBuilder中的文本

时间:2011-01-28 15:27:48

标签: java regex stringbuilder

我想替换StringBuilder中的一些文本。怎么做?

在此代码中,我java.lang.StringIndexOutOfBoundsExceptionmatcher.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"); 

6 个答案:

答案 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()的另一个问题是无法处理捕获组。