我正在尝试制作一个用“#!”来审查“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
答案 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#split
将String
分解为表达式周围的数组,然后您就可以从这些部分重建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", "#!");