sree127
sree127

Reputation: 431

Filter bad words | java 'replace'

In an attempt to filter the bad words, I found the 'replace' function in java is not as handy as intended. Please find below the code : Eg : consider the word 'abcde' and i want to filter it to 'a***e'.

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

Output : a***e

But if the String is String test = "bbcde";, the output is ****e. It seems, if the word has repetitive letters(as in here), the replace function replaces the repetitive letters too. Why is it so? I want to filter the words excluding the first and last letter.

Upvotes: 0

Views: 2871

Answers (5)

kke
kke

Reputation: 363

You should use the replaceAll-Function: Link

With this you can replace all times you find a given substring in a string (f.e. "abcde") and replace all these with another string (f.e. "a***e").

String test = "abcde";
String replacement = "";
for (int i = 0; i < test.length(); i++) {
    if (i==0 || i==test.length()-1){
        replacement += test.charAt(i);
    } else {
        replacement += "*";
    }
}
sdf = sdf.replaceAll(test, replacement);
System.out.print(test);

Upvotes: 0

Achintya Jha
Achintya Jha

Reputation: 12843

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

Upvotes: 0

Jesper
Jesper

Reputation: 206816

It seems, if the word has repetitive letters(as in here), the replace function replaces the repetitive letters too. Why is it so?

Why? Because that's just how it works, exactly as the API documentation of String.replace(char oldChar, char newChar) says:

Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.

If you just want to replace the content of the string by the first letter, some asterisks and the last letter, then you don't need to use replace at all.

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

Upvotes: 0

Ankit
Ankit

Reputation: 6622

since String.replace(char, char) replaces all occurrences of specified char, this would be a better approach for your requirement:

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

Upvotes: 0

mthmulders
mthmulders

Reputation: 9705

That is because String.replace(char, char) replaces all occurrences of the first character (according to its Javadoc).

What you want is probably more like this:

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

Upvotes: 4

Related Questions