使用Java中的.replaceAll和regex删除空行

时间:2017-07-25 21:11:50

标签: java regex

如果已经回答,请原谅。我已经找了两天寻找答案,最后还是走了这么远。这是要解决的问题:

编写一个名为stripComments的方法,该方法接受表示包含Java程序作为参数的输入文件的Scanner,读取该文件,然后打印文件的文本并删除所有注释。注释是从//到行尾的行上的任何文本,以及/ *和* /字符之间的任何文本。例如,请考虑以下文本:

import java.util.*;

/* My program
by Suzy Student */
public class Program {
    public static void main(String[] args) {
        System.out.println("Hello, world!"); // a println
    }

    public static /* Hello there */ void foo() {
        System.out.println("Goodbye!"); // comment here
    } /* */
}

这就是我提出的:

public static void stripComments(Scanner scan) {
    while(scan.hasNextLine()) {
        String str1 = scan.nextLine();
        String str2 = str1.replaceAll("(/(\\*).*?(\\*)/)|(//.*?$)|(/(\\*).*?$)|([a-zA-Z\\s0-9]*?\\*(/))", "");
        System.out.println(str2);
    }
}

结果如下:

import java.util.*;


    public class Program {
        public static void main(String[] args) {
            System.out.println("Hello, world!"); 
        }

        public static  void foo() {
            System.out.println("Goodbye!"); 
        } 
    }

虽然大多数都是正确的,但我不知道如何摆脱“公共课程{{”以上的额外路线。我如何摆脱这一行,是否有更好的方法来编写正则表达式?

提前谢谢!

2 个答案:

答案 0 :(得分:0)

我想出了第二个替换命令

str = str.replaceAll("\n\\s*\n", "\n");

这要求您传入整个文件,但它不会逐行工作。

如果你想继续逐行,你应该做

if(str2.matches("\\s*"))
    continue;

P.S。如果您没有量词,那么围绕正则表达式的最后一组括号是不必要的。您的多行注释不适用于3行以上,例如:

/*
 * This is
 * a multiline
 * Comment
 */

因为你是逐行传递的。

答案 1 :(得分:0)

如果您不想使用Regex,可以执行以下操作:

文件内容( code.txt ):

import java.util.*;
/**
 * 
 * some comments
 *
 */
/*
 some comments*/
  public class Program {
      public static void main(String[] args) {
         System.out.println("Hello, world!"); // some comments 
      } /*****/

      public static  void foo() {
         System.out.println("Goodbye!"); 
      }  /*some other comments*/
   // some comments
  }

<强>方法

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Main {

  public static void main(String[] argv){
     File file = new File("C:\\Users\\Yahya\\Desktop\\code.txt");
     try {
         stripComments(new Scanner(file));
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     }

  }


  static void stripComments(Scanner scan){
        while(scan.hasNextLine()) {
            String line = scan.nextLine();
            if(line.startsWith("/**") || line.startsWith("/*") ){
                while(!line.endsWith("*/")){
                    line = scan.nextLine();
                }
                line="";
            }
            else if (line.contains("/*")){
                line = line.substring(0, line.indexOf("/*"));
            }
            else if (line.contains("//")){
                line = line.substring(0, line.indexOf("//"));
            }

            System.out.println(line);
        }
    }
}

测试(输出):

import java.util.*;

  public class Program {
      public static void main(String[] args) {
         System.out.println("Hello, world!"); 
      }

      public static  void foo() {
         System.out.println("Goodbye!"); 
      }     

  }