我想检查以下内容:
VALID LINES;
/**/ some code
*/ some code /** dsfsdkf sd**/
NOT VALID LINES;
/**/ //some code
*/ /***/ //somecode
所以基本上如果评论之外有一行代码则有效,否则不是。
解决此类验证的最佳方法是什么?
注意:
对于*/
,我认为/*
之前已经打过一些行。
答案 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解析器,你的代码会更简单,也可能不那么脆弱。