正则表达式检测代码中的注释[重复]

Posted

技术标签:

【中文标题】正则表达式检测代码中的注释[重复]【英文标题】:Regular expression to detect comments in code [duplicate] 【发布时间】:2011-07-11 16:46:40 【问题描述】:

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

如何使用正则表达式在 java 代码中查找 cmets? 喜欢///* */

【问题讨论】:

如果你输入一个实际的标题,系统会搜索你,这样你就不会发布不必要的重复。 【参考方案1】:

虽然它可以通过正则表达式解决,但在解析任何类型的结构化标记时,更可取的解决方案是使用真正理解所讲语言的解析器。

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

【讨论】:

【参考方案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...

【讨论】:

不错的一个!但是\u002F* */ 呢? :P @Alan:破坏运动! :) 我将把它作为练习留给读者......【参考方案3】:

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

【讨论】:

以上是关于正则表达式检测代码中的注释[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过正则表达式检测内容中的任何 URL [重复]

删除python注释的正则表达式[重复]

JavaScript 如何检测正则表达式?

正则表达式匹配代码中的特定注释

正则表达式到源代码注释

用java正则表达式提取java程序中的注释