Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何使这个用于审查单词的代码起作用?_Java_String - Fatal编程技术网

Java 我如何使这个用于审查单词的代码起作用?

Java 我如何使这个用于审查单词的代码起作用?,java,string,Java,String,我正在做我书上的一个练习,但它只起了部分作用。它适用于我要审查的三个词之一。我不知道为什么会这样。代码如下: public static void main(String[] args){ String text = "Microsoft announced its next generation Java compiler today. It uses advanced parser and special optimizer for the Microsoft JVM.";

我正在做我书上的一个练习,但它只起了部分作用。它适用于我要审查的三个词之一。我不知道为什么会这样。代码如下:

public static void main(String[] args){
    String text = "Microsoft announced its next generation Java compiler today. It uses advanced parser and special optimizer for the Microsoft JVM.";
    String forbiddenWords = "Java,JVM,Microsoft";
    String[] words = forbiddenWords.split(",");
    String newText = "";
    for(String word: words){
        System.out.println(word);
    }

    for(int i = 0; i < words.length; i++){
        newText = text.replaceAll(words[i], "***");
    }
    System.out.println(newText);
}

我还必须用正确数量的
*
对其进行审查,但我不知道如何进行。我知道我可以通过使用
单词[I].length来计算
*
s的数量,但我不知道如何利用它。

你不是在积累替换,而是只将最后一个替换分配给
newText
。不要使用
newText
,只需将新字符串指定给
text
变量即可

for (String word : words) {
    text = text.replaceAll(word, "***");
}
System.out.println(text);
此外,如注释中所述,请注意实际需要正则表达式,因此如果要替换的字符串包含任何正则表达式控制字符,则此操作可能会失败。相反,您应该只使用,它还将替换所有匹配的子字符串

如果希望
*
的数量与单词的长度匹配,可以使用:

输出:

********* announced its next generation **** compiler today. It uses advanced parser and special optimizer for the ********* ***.

说到正则表达式,您实际上也可以使用包含所有禁止字的正则表达式来使用
replaceAll
,方法是将
替换为
|
(前提是这些字不包含正则表达式控制字符)


哦,我的上帝,出于沮丧,我添加了一个我甚至不需要的新字符串。非常感谢。我想我太累了,看不见它了。您知道如何在某个单词上分配正确数量的*s吗?@TsvetanDimitrov有关重复字符,请参见
String asterisks=“”;对于(intk=0;k应该这样做。@Zéychin除了字符串声明之外,我无法从这段代码中得到任何东西。什么是tmp?它甚至没有在任何地方声明。@tobias_k是的,但它不会起作用。刚弄明白它应该是什么样子,但它所做的只是用一个替换第一个单词,用两个替换第二个,用三个替换第三个。这不是你的问题,但除非你使用正则表达式,否则不要使用
replaceAll
。使用
替换
。我想你不是斯肯索普人吧。
for (String word : words) {
    String xxx = new String(new char[word.length()]).replace("\0", "*");        
    text = text.replace(word, xxx);
}
System.out.println(text);
********* announced its next generation **** compiler today. It uses advanced parser and special optimizer for the ********* ***.
String forbiddenWords = "Java,JVM,Microsoft";
text = text.replaceAll(forbiddenWords.replace(',', '|'), "***");