Java正则表达式以编程方式删除所有注释

时间:2016-04-07 06:30:48

标签: java regex

我有一些带代码的文本文件。

 /*Comment here*/

 public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("First");
/*Comment here
*and
*here*/
    primaryStage.setScene(new Scene(root, 640, 480));
    primaryStage.show();//Comment this
//and comment that
}

让它看起来像那样:

 public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("First");
    primaryStage.setScene(new Scene(root, 640, 480));
    primaryStage.show();
}

我试过这个:

 public String delComments(String content){
    Pattern regex = Pattern.compile("/\\*.*?\\*/|/{2,}[^\\n]*", Pattern.MULTILINE);
    Matcher matcher = regex.matcher(content);
    String clean = content.replaceAll("(?s:/\\*.*?\\*/)|//.*", "");
    return clean;
}

读取文件并全部替换的方法

public void delCommentAction(ActionEvent actionEvent) throws IOException {
    String line = null;
    FileReader fileReader =
            new FileReader(filePath);
    BufferedReader bufferedReader =
            new BufferedReader(fileReader);
    FileWriter fw = new FileWriter(filePathNoComm);
    BufferedWriter bw = new BufferedWriter(fw);
    while((line = bufferedReader.readLine()) != null) {
        bw.write(delComments(line));
    }
    bw.close();
}

但它不起作用(评论没有被删除)

1 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样,您应该使用完整的解析器,因为Java语言过于复杂而不能使正则表达式准确地执行此操作。

但是,如果您对一些警告感到满意,可以使用以下正则表达式完成:

(?s:/\*.*?\*/)|//.*

请参阅regex101 for demo

在Java代码中,那将是:

String clean = original.replaceAll("(?s:/\\*.*?\\*/)|//.*", "");

警告:它不识别字符串文字,字符串文字中的/*//不会启动Java注释。然而,这个正则表达式会认为它是一个并从字符串文字中删除内容(及其后)。

展开的版本是:

String clean = original.replaceAll("/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/|//.*", "");

给定文字没有明显差异。如果3行评论的长度为3000个字符,那么展开的版本会稍微快一点,但除非您要进行10000多次替换,否则不足以发现,所以我认为这种过早优化。