0

悪い言葉をフィルタリングしようとして、Java の「置換」機能が意図したほど便利ではないことがわかりました。以下のコードをご覧ください: 例: 「abcde」という単語を考えて、「a***e」にフィルターをかけたいとします。

    String test = "abcde";
    for (int i = 1; i < sdf.length() - 1; i++) {
        test= test.replace(test.charAt(i), '*');
    }
    System.out.print(test);

出力:a***e

しかし、文字列が の場合String test = "bbcde";、出力は****eです。単語に繰り返し文字がある場合(ここのように)、replace関数は繰り返し文字も置き換えます。なぜそうなのですか?最初と最後の文字を除く単語をフィルタリングしたい。

4

5 に答える 5

4

これは、最初の文字の出現箇所をすべてString.replace(char, char)置き換えるためです (そのJavadocによると)。

あなたが望むのは、おそらく次のようなものです:

char[] word = test.toCharArray();
for (int i = 1; i < word.lengh - 1; i++) { // make sure to start at second char, and end at one-but-last char
    word[i] = '*';
}
System.out.println(String.copyValueOf(word));
于 2013-04-19T09:33:41.247 に答える
0

指定された char のすべての出現箇所を置き換えるためString.replace(char, char)、これは要件に対してより適切なアプローチです。

String test = "abcde";
String replacement = "";
for (int i = 0; i < sdf.length(); i++) {
    replacement += "*";
}
test= test.replace(sdf, replacement );
System.out.print(test);
于 2013-04-19T09:33:51.827 に答える
0
public static void main(String[] args) {

    String test = "bbcde";
    String output = String.valueOf(test.charAt(0));
    for (int i = 1; i < test.length() - 1; i++) {
        output = output + "*";
    }
    output = output + String.valueOf(test.charAt(test.length() - 1));
    System.out.print(output);
}
于 2013-04-19T09:36:04.597 に答える
0

単語に繰り返し文字がある場合 (ここのように)、replace 関数は繰り返し文字も置き換えます。なぜそうなのですか?

なんで?のAPIドキュメントにあるように、それがまさにそのように機能するためですString.replace(char oldChar, char newChar)

oldCharこの文字列内のすべての出現箇所を で置き換えた結果の新しい文字列を返しますnewChar

文字列の内容を最初の文字、いくつかのアスタリスク、および最後の文字で置き換えたいだけの場合は、replaceまったく使用する必要はありません。

String test = "abcde";

if (test.length() >= 1) {
    StringBuilder result = new StringBuilder();
    result.append(test.charAt(0));
    for (int i = 0; i < test.length() - 2; ++i) {
        result.append('*');
    }
    result.append(test.charAt(test.length() - 1));
    test = result.toString();
}

System.out.println(test);
于 2013-04-19T09:35:27.580 に答える