利用JavaParser去除java文件中的注释
个人博客:记录一下在项目实施过程中的一些点
情景回顾
之前项目有个需求,就是去掉.java文件中的所有注释,常用的方法是用正则匹配。然而在网络上查找到的正则或多或少都有一些问题,无法匹配到所有的情况。或者说,由于写.java文件的人的不规范(各种奇葩的问题),导致正则覆盖不全。所以正则方法不靠谱,或者说,存在一定的限制。
新的想法
后来想到利用AST来去除注释,这种方法应该是“完备”的,也就是说,不会受到程序员不同注释风格的影响,能稳定地去除注释。因为在AST中,代码的不同元素映射成不同节点,删除注释对应的节点就能去掉代码中的注释。
寻找工具
考虑到AST树,那么直接考虑到使用JavaParser(https://github.com/javaparser/javaparser)
并且直接找到了JavaParser作者写的一个实例 CommentRemover:
package org.javaparser.samples;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.comments.Comment;
import com.github.javaparser.ast.comments.LineComment;
import java.io.File;
import java.util.List;
import java.util.stream.Collectors;
public class CommentRemover {
private static final String FILE_PATH = "src/main/java/org/javaparser/samples/ReversePolishNotation.java";
public static void main(String[] args) throws Exception {
CompilationUnit cu = JavaParser.parse(new File(FILE_PATH));
Listcomments = cu.getAllContainedComments();
ListunwantedComments = comments
.stream()
.filter(p -> !p.getCommentedNode().isPresent() || p instanceof LineComment)
.collect(Collectors.toList());
unwantedComments.forEach(Node::remove);
System.out.println(cu.toString());
}
}
以上代码转自:https://github.com/javaparser/javaparser-visited/blob/master/src/main/java/org/javaparser/samples/CommentRemover.java
利用JavaParser就能很好的去除java文件中的注释。
一些资源
JavaParser官方Github:https://github.com/javaparser/javaparser
JavaParser说明文档:http://www.javadoc.io/doc/com.github.javaparser/javaparser-core/3.8.1