不能用Java替换方法替换

时间:2014-10-17 03:11:12

标签: java

我正在尝试制作一个用“#!”来审查“dang”这个词的程序。我的主要方法传入一个字符串句子。

public static String deleteDang(String sentence)
    /* pre: receives the sentence to be censored
       post: returns the censored sentence*/
    {
        while(((sentence.toLowerCase()).contains("dang")))
        {
            sentence = (sentence.toLowerCase()).replace("dang", "#!");
        }
        return sentence;
    }

我希望它能够正常工作,这样我就可以输入“DANG ApplE”等内容并输出“!#ApplE”。当我尝试运行它时,如果我输入“dang apple”,它会输出“!#apple”,但是当我输入“DANG Apple”时,我有“DANG Apple”的无限输出。我做错了什么?

如果可能的话,我希望不使用.replaceAll

2 个答案:

答案 0 :(得分:4)

您可以使用不区分大小写的正则表达式,例如......

String sentance = "Dang the dang and DANG and I don't mind a dANg";
sentance = sentance.replaceAll("(?i)dang", "#!");
System.out.println(sentance);

将输出类似......

的内容
#! the #! and #! and I don't mind a #!

根据评论更新

如果无法使用replaceAll,则必须将String拆分为多个部分,一种方法是绕过String,修剪“dang”并建立一个新的String,例如......

String sentance = "Dang the dang and DANG and I don't mind a dANg and some more";

StringBuilder sb = new StringBuilder(sentance.length());
while (sentance.toLowerCase().contains("dang")) {

    int index = sentance.toLowerCase().indexOf("dang");
    String start = sentance.substring(0, index);
    int endIndex = index + "dang".length();
    sb.append(start);
    sb.append("#!");

    sentance = sentance.substring(endIndex);

}

sb.append(sentance);

System.out.println(sb.toString());

<强>更新

您可以使用不区分大小写的正则表达式String#splitString分解为表达式周围的数组,然后您就可以从这些部分重建String。 ..

String sentance = "Bang Dang the dang and DANG and I don't mind a dANg and some more";
String[] split = sentance.split("(?i)dang");
StringBuilder sb = new StringBuilder(sentance.length());
for (int index = 0; index < split.length - 1; index++) {
    String part = split[index];
    System.out.println("[" + part + "] " + part.trim().isEmpty());
    if (!part.trim().isEmpty()) {
        sb.append(part).append("#!");
    } else {
        sb.append("#!");
    }
}
// Put the last value at the end, so we don't end up with #! at the end of the String
sb.append(split[split.length - 1]);

System.out.println(sb.toString());

我没有进行任何范围检查(检查是否有足够的部件返回),所以你需要自己进行测试,但那里的想法......

答案 1 :(得分:0)

您不必迭代。您只需使用replaceAll方法

即可
sentence = sentence.replaceAll("dang", "#!");

这只会考虑确切的单词“dang”

如果你想在不考虑案件的情况下更换所有的dang字 然后你可以尝试

 sentence = sentence.replaceAll("(?!)dang", "#!");