【问题标题】:String replace and output in Java [duplicate]Java中的字符串替换和输出[重复]
【发布时间】:2013-10-19 18:07:32
【问题描述】:

我有一个查询,请看下面的代码:

        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”替换,我不知道哪部分错了,请指教,谢谢大家!

【问题讨论】:

  • 您正在调用 String.replace 并忽略输出。字符串在 Java 中是不可变的。
  • @JonSkeet 是对的。你应该看看文档:)

标签: java string printwriter


【解决方案1】:

这一行只是将消息 unchanged 输出到新文件。

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|$) 字符串是一个正则表达式,具有匹配所有内容的含义,它以字符串 ^ 的开头或非单词字符 (\\W) 开头,字符串 @ 987654326@,以非单词字符或行尾($)...

由于扫描仪将空格作为默认分隔符,使用(^|\\s)are(\\s|$) 可能会更好,但是这两个都会用一个空格替换“ARE”前后的空格()...

另外,请记住,String.replace 不会改变输入字符串...您必须分配结果,或以任何其他方式使用它,例如将其传递给函数...

【讨论】:

  • 感谢 ppeterka,帮了大忙,那么在哪种情况下我需要创建一个循环来逐字阅读?
  • 当你想做一些比换一个词更复杂的事情时。或者例如 zou 有一个总是像 <word> <word> <number> <word> 的输入,并且您希望 Scanner.nextInt() 读取每个第 3 个令牌以获取一个整数......(但正如我们所说,有可能得到一个正则表达式也是如此......)
  • 嗨 ppeterka,所以如果我想使用 charAt 或 indexOf 来处理单个单词或字母,我需要创建循环来逐字读取,对吧?
  • @peiwang 在这种情况下,是的,在这种情况下,您将不得不使用循环来处理每个单词。
【解决方案2】:

我不明白你为什么这样做。这是另一种方法:

  1. 获取BufferedReader 以读取文件。
  2. 当文件中有数据时,读取行。
  3. 如果line.contains("are") 那么line = line.replace("are","ARE")
  4. println(line)

为什么你的代码不起作用:
在这一行中,f.replace("are","ARE"); 你忘记获取输出了。
像这样:message = f.replace("are","ARE");


另一种选择是使用StringBufferStringBuilder

【讨论】:

    【解决方案3】:

    String 是 final 且不可变的,这也是一样的。

    所以f.replace("are","ARE"); 必须插入到新的或非变量中。

    f = f.replace("are","ARE");
    

    【讨论】:

      【解决方案4】:

      字符串是不可变的。因此,您不能对对象 f 运行 replace 方法并期望其值发生更改,因为 string 对象的 replace 方法将简单地返回一个新的 String 对象。

      要么使用 StringBuilder,要么使用:

      f = f.replace
      

      另一方面,StringBuilder 对象是可变的。因此,如果您选择该路由,则可以直接在对象上运行 StringBuilder 版本的 replace 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多