1

すべての句読点を "" に置き換えるマッチャーで replaceAll() メソッドを実装しました。ただし、常に例外がスローされます: " java.lang.StringIndexOutOfBoundsException: String index out of range: 6 "

private static StringBuilder filterPunctuation(StringBuilder sb){
    Pattern pattern =  Pattern.compile("(\\.)");
    Matcher matcher = pattern.matcher(sb);
    while(matcher.find()){
        sb.replace(matcher.start(), matcher.end(), "");  
// if sb.replace(matcher.start(),matcher.end()," "), it wil be right, but I want replace all punction with ""
    }
    return sb;
}

public static void main(String[] args){
    System.out.println(filterPunctuation(new StringBuilder("test.,.")));
}
4

2 に答える 2

6

ループ内でStringBuilder(特に文字を削除して長さ)を変更する場合は、新しいマッチャーを取得する必要があります(古いマッチャーは元のバッファーまたは両方の一貫性のない組み合わせを引き続き参照するため) )。

ジョンスキートがそれをどのように行うかを見てみましょう

于 2012-04-23T04:19:21.083 に答える
2

私はこれがトリックを行うと仮定します

private static void filterPunctuation(StringBuilder sb)
{
    int l=sb.length();
    for (int i=0; i<l; i++) if (sb.charAt(i)=='.') sb.deleteCharAt(l--);
}

同じリファレンスで作業しているため、返却する必要はありません。

于 2012-04-23T04:52:31.500 に答える