代码之家  ›  专栏  ›  技术社区  ›  Adnan

在Java中检查行是否有效

  •  2
  • Adnan  · 技术社区  · 16 年前

    我想检查以下内容:

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

    所以基本上,如果在注释之外有一行代码,那么它是有效的,否则不是。

    解决这种验证的最佳方法是什么?

    注:
    为了 */ 我想 /* 已经打开了一些行。

    4 回复  |  直到 16 年前
        1
  •  3
  •   aioobe    16 年前

    我相信这应该很快。

    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的内部结构,您会发现,一旦底层的automaton被编译并最小化,正则表达式就相当有效了(至少对于像上面这样的简单正则表达式)。无论您如何实现您的算法,它仍然需要做与reg exp引擎在这个场景中所做的工作大致相同的工作。

    (如果你看 String.split 方法,您将注意到内部正则表达式被编译为 Pattern 一劳永逸。)

        2
  •  3
  •   dty    16 年前

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

        3
  •  0
  •   npinti    16 年前

    您可以使用类似 Javacc 然后用它来解析文件。

        4
  •  0
  •   Stephen C    16 年前

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

    (您是想提取代码,还是简单地计算代码行?)

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

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

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

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

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

    \u002f* This is a comment *\u002f
    

    我不是说雷杰克斯 不能 被使用。我只是说,如果使用适当的Java解析器,代码会更简单,也可能不那么脆弱。