2011-01-28 10 views
4

StringBuilderの一部のテキストを置き換えたいと思います。これを行う方法?私はmatcher.find()とラインでjava.lang.StringIndexOutOfBoundsExceptionを得た。このコードでは正規表現を使用してStringBuilderのテキストを置き換えます。

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

これは既に報告バグだと私は、彼らは現在、それに対する修正に探している推測しています。続きを読むhere

+0

非常に悲しい答え、私は何かが間違っていたと思った – bltc

+0

よ、申し訳ありません私はよりよい解決策を提供できませんでした。 – evandrix

+0

これはどのようにバグですか?あなたはStringBuilderの内容と長さ/位置を変更しますが、元の文字列には触れないので、デルタを補う必要があります。 – bestsss

1

私はmatcher.reset()を追加することでこれを解決してきました:

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

'str_pattern =" x "'と 'input =" x "'を使うと、無限ループになります。 'str_pattern =" xx "'と 'input =" xxxx "'で間違った結果( '' xx "ではなく' 'x" ')が得られます。 – maaartinus

+0

matcher.reset()を追加していません。私はまだ同じ例外を取得しています。 – Sriram

4

は50総丈/ワットのStringBuilderを持っていて、 'X' に最初20charsを変更できます。したがって、StringBuilderは19で縮小されますが、最初の入力pattern.matcher(sb)は変更されないため、最後のStringIndexOutOfBoundsExceptionに変更されます。

1

このようにしないでください。 Matcherへの入力は任意のCharSequenceでも構いませんが、シーケンスは変更しないでください。同じようにマッチングすることは、同時に要素を削除しながらCollectionを反復するようなものですが、これはうまくいかないでしょう。

しかし、多分解決策があります:たぶん

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

いいえ、残念ですが、パターンにマッチする2つの連続した文字列を処理できません:( –

0

StringBuidler.replace()を使用する際のもう1つの問題は、グループのキャプチャを処理できないことです。