检查Java中的行是否有效

时间:2010-06-10 20:35:01

标签: java validation

我想检查以下内容:

VALID LINES;
/**/ some code
*/ some code   /** dsfsdkf sd**/

NOT VALID LINES;
/**/ //some code
*/ /***/ //somecode

所以基本上如果评论之外有一行代码则有效,否则不是。

解决此类验证的最佳方法是什么?

注意:
对于*/,我认为/*之前已经打过一些行。

4 个答案:

答案 0 :(得分:3)

您可以使用Java解析器正确解析文件。

答案 1 :(得分:3)

我相信这应该很快。

import java.io.*;

class Test {

    public static void main(String[] args) throws IOException {
        StringBuffer buf = new StringBuffer();
        BufferedReader r = new BufferedReader(new FileReader("src/Test.java"));

        final String nl = System.getProperty("line.separator");
        String line;
        while (null != (line = r.readLine()))
            buf.append(line).append(nl);

        for (String code : buf.toString().split("(?ms)/\\*.*?\\*/|//[^\\n]*"))
            System.out.println(code);
    }
}

如果你在reg-exps的内部读到一点,你会发现一旦底层自动机被编译和最小化(正如上面的简单正则表达式),正则表达式非常有效。无论您如何实现算法,它仍然需要执行与此方案中reg-exp引擎大致相同的工作。

(如果你看一下String.split方法,你会注意到内部正则表达式一劳永逸地编译成Pattern。)

答案 2 :(得分:0)

您可以使用Javacc之类的内容构建自定义解析器,然后使用它来解析文件。

答案 3 :(得分:0)

  

我正在尝试从.java文件中读取所有代码行,不包括注释。

(您是在尝试提取代码,还是只计算代码行?)

简单的逐行方法您可能不会完全准确。例如,考虑一下:

/*  The next line is wrong:
    res = 1 / 0;
 */

逐行分析将得出结论,第二行是代码......当它实际上是评论时。

尝试使用正则表达式的另一个问题是存在各种边缘情况。例如:

System.err.println("/* hello mum ");
System.err.println("*/");

或者

\u002f* This is a comment *\u002f

我不是说正在使用正则表达式 。我只是说如果你使用适当的Java解析器,你的代码会更简单,也可能不那么脆弱。