我收到了疑问,请参阅以下代码:
public void readFile(String path,String pathName,int num){
try{
PrintWriter out2=new PrintWriter(new PrintWriter(path));
File a=new File(pathName);
Scanner b=new Scanner(a);
while(b.hasNextLine()){
String message=b.nextLine();
Scanner h=new Scanner(message);
while(h.hasNext()){
String f=h.next();
if (f.equals("are")){
f.replace("are","ARE");
}
}
out2.printf("%s",message);
out2.println();
.......
扫描仪读取的文件内容为
who are you?
how are you?
what is up!
但是,当我运行上面的代码并且输出到新文件与输入文件相同时,表示“are”不会被“ARE”替换,我不知道哪个部分有错,请指教,谢谢你们!
答案 0 :(得分:3)
此行只会将未更改消息输出到新文件。
out2.printf("%s",message);
此外,循环也很奇怪:为什么你一字一句地读它,然后使用String.replace()?您可以使用String.replaceAll():
逐行执行此操作 while(h.hasNextLine()){
String message=b.nextLine();
out2.printf("%s",message.replaceAll("(^|\\W)are(\\W|$)"," ARE "));
}
(^|\\W)are(\\W|$)
字符串是一个正则表达式,具有匹配所有内容的含义,以字符串^
的开头或非字符({{1}开头)开头}),字符串\\W
,以非单词字符或行尾(are
)结尾...
由于扫描程序将空格作为默认分隔符,因此使用$
可能会更好,但这两种方法都将使用单个空格((^|\\s)are(\\s|$)
)替换“ARE”之前和之后的空格。 ..
另外,请记住,String.replace不会改变输入字符串...您必须分配结果,或者以任何其他方式使用它,例如将其传递给函数...
答案 1 :(得分:1)
String是final和immutable,它是相同的。
所以f.replace("are","ARE");
必须插入新的或非变量。
f = f.replace("are","ARE");
答案 2 :(得分:0)
我不明白你为什么这样做。这是另一种方法:
BufferedReader
来阅读该文件。 line.contains("are")
则line = line.replace("are","ARE")
println(line)
至于为什么你的代码不起作用:
在这一行中,f.replace("are","ARE");
您忘记了输出
这样做:message = f.replace("are","ARE");
StringBuffer
或StringBuilder
答案 3 :(得分:0)
字符串是不可变的。因此,您无法在对象f上运行replace方法并期望更改其值,因为字符串对象的replace方法将只返回一个新的String对象。
使用StringBuilder,或使用:
f = f.replace
另一方面,StringBuilder对象是可变的。因此,如果选择该路径,则可以直接在对象上运行替换方法的StringBuilder版本。