正则表达式以检测代码中的注释

时间:2011-03-09 07:52:04

标签: java regex

  

可能重复:
  Java - regular expression finding comments in code

如何使用正则表达式在java代码中查找注释? 与///* */一样。

3 个答案:

答案 0 :(得分:3)

虽然可以使用正则表达式解决,但解析任何类型的结构化标记时,最好的解决方案是使用实际理解所说语言的解析器。

在这种情况下:使用javaparserANTLR或基于Java grammar的自定义解决方案的Java Source Parser。

答案 1 :(得分:2)

试试这个:

public class Test {

    // comment 1

    /*
    comment 2
    // no line comment
    */

    char c = '"'; // comment 3, " is not the start of a string literal!

    String s = "/* no comment */ ... /*";

    String t = "*/ also // not a comment";

    private static String getContentsOf(String fileName) throws FileNotFoundException {
        Scanner scan = new Scanner(new File(fileName));
        StringBuilder b = new StringBuilder();
        while(scan.hasNextLine()) {
            b.append(scan.nextLine()).append("\n");
        }
        return b.toString();
    }

    public static void main(String[] args) throws FileNotFoundException {
        String anyChar = "[\\s\\S]";
        String singleLineComment = "//[^\r\n]*";
        String multiLineComment = "/\\*" + anyChar + "*?\\*/";
        String stringLiteral = "\"(?:\\\\.|[^\"\r\n\\\\])*\"";
        String charLiteral = "'(?:\\\\.|[^'\r\n\\\\])+'";

        String regex = String.format("(%s)|(%s)|(%s)|(%s)|(%s)",
                singleLineComment, // group 1
                multiLineComment,  // group 2
                stringLiteral,     // group 3
                charLiteral,       // group 4
                anyChar);          // group 5

        Matcher m = Pattern.compile(regex).matcher(getContentsOf("Test.java"));

        while(m.find()) {
            String matched = m.group();
            if(m.group(1) != null || m.group(2) != null) {
                System.out.println("matched = " + matched);
            }
        }
    }
}

打印:

matched = // comment 1
matched = /*
    comment 2
    // no line comment
    */
matched = // group 1
matched = // group 2
matched = // group 3
matched = // group 4
matched = // group 5

或者,一个可能更强大的解决方案是使用一个小的解析器或解析器生成器。 ANTLR有一个很好的选择,只能定义语言语法的一部分而忽略其余部分。我在this previous Q&A中证明了这一点。缺点是你需要学习一点ANTLR ......

答案 2 :(得分:0)

查看上一个问题:Java - regular expression finding comments in code,或相关查询来自谷歌的某些随机链接:http://ostermiller.org/findcomment.html