2011-01-28 69 views
4

我想替换StringBuilder中的一些文本。这个怎么做?通过正则表达式替换StringBuilder中的文本

在这段代码我在符合matcher.find()得到java.lang.StringIndexOutOfBoundsException

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"); 

回答

1

这已经是一个报告的bug,我猜他们正在调查它修复。阅读更多here

+0

非常难过的答案,我以为我做错了 – bltc 2011-01-28 15:40:23

+0

对不起,我不能提供任何更好的解决方案。 – evandrix 2011-01-28 15:58:11

+0

这是一个错误?你改变了StringBuilder的内容和长度/位置,但是你不要触摸前一个字符串,你应该补偿这个增量。 – bestsss 2011-01-28 16:06:04

1

我已通过添加matcher.reset()解决了这个:

while (matcher.find()) 
    { 
     sb.replace(matcher.start(), matcher.end(), "x"); 
     matcher.reset(); 
    } 
4

让有一个StringBuilder W/50总长度并更改第一20chars以 'X'。所以StringBuilder被缩小了19倍,但是最初的输入pattern.matcher(sb)没有改变,所以最后StringIndexOutOfBoundsException。

1

你不应该这样做。匹配器的输入可能是任何CharSequence,但序列不应该改变。像你一样匹配就像迭代一个集合,同时删除元素,这是行不通的。

然而,也许有一个解决方案:

while (matcher.find()) { 
    sb.replace(matcher.start(), matcher.end(), "x"); 
    matcher.region(matcher.start() + "x".length(), sb.length()); 
} 
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评论中提出的问题。

0

使用StringBuidler.replace()的另一个问题是,无法处理捕获组。