我要将用户上传的java代码进行自动编译和测试,需要提取出代码里的包名和公共类名。
比如提取package java.ts.code;里的java.ts.code
还要提取公共类名作为文件名,生成.java文件以保存代码和编译
哪位熟正则表达式的兄弟请指教下,谢谢!

解决方案 »

  1.   

    这个最好使用反射了,
    可以先javac一下吗,而且Java6提供了API做这些事情了。然后ClassLoader load classe,什么信息都得到了。
      

  2.   

    是这样的,用户在网页的textarea写代码,然后这些代码都提交到一个字符串变量里,然后我要读这个字符串来获取包名和公共类名来生成.java文件才能编译成class文件。。
      

  3.   

    import java.util.regex.*; public class Test{ 
        public static void main(String args[]) {
         String str="//package java.ts.code;\n"
                   +"package java.ts.code;\n"
                   +"import java.util.regex.*;\n "
                   +"import java.util.*;\n"
                   +"//public class Test\n"
                   +"public class Test extends MyClass{ \n"
                   +"public static void main(String args[]) {\n"
                   +"   String str=\"packege org.myfile\"\n"
                   +".....";
         System.out.println("Packege name:      "+getPackage(str));
         System.out.println("Public class name: "+getPublicClass(str));    }
        
        //下面的两个方法有一定的局限性,要求package语句和public class语句是一行的开始.
        //也就是说,语句之前可以有空白字符,但不能有注释.比如:/*abc */package abc,这样是提不出来的.
        //
        public static String getPackage(String fileStr){
         String regex="(?im)^\\s*package\\s+([^;]+);";
         Matcher m=Pattern.compile(regex).matcher(fileStr);
         if(m.find()){
         return m.group(1).trim();
         }
         return "";
        }
        
        public static String getPublicClass(String fileStr){
         String regex="(?m)^\\s*public\\s+class\\s+(\\w+)\\b";
         Matcher m=Pattern.compile(regex).matcher(fileStr);
         if(m.find()){
         return m.group(1).trim();
         }
         return "";
        }
    }F:\java>java Test
    Packege name:      java.ts.code
    Public class name: Test
      

  4.   

    getPublicClass这个方法有点问题,如果有内部类怎么办?
      

  5.   

    谢谢bigbug9002,暂时先这样吧,等学了正则表达式再完善咯