怎么准确匹配java代码文件中的“块注释(/* */)”,有人有经验吗?所谓以下的这种:/\*.*?\*/,实际上是不行的。因为当字符串中包含/* ... */这样的句式时,也被认为了是注释。还有注释的格式可以是多变的,比如:/*  /*  */,这也是注释。不能否认个人的注释习惯不同。还有其他的问题,所以,我想了半天也没想出很好的匹配方法。大家给些建议。 谢谢!

解决方案 »

  1.   

    To: falson(弗声) ( ) 信誉:100  2006-05-18 12:00:00  得分: 0  
     
     
       1、首先区分注释和字符串的问题,看/* */格式之前是否出现"。
    2、至于说多种注释的话,逐一匹配就是了,如果出现在字符串中的情况,同上。
      
     
    谢谢关注!
    关于1:我认为至少有一下情况不适合,比如:
    --------------------------------------------
    String str = "abcd";
    /*
     *
     */
    --------------------------------------------
    要是按照法1来匹配的话,就匹配不上。关于2:可能会过于繁琐,要是能有种比较统一的方法来就比较好了,欢迎大家各显其能!!
      

  2.   

    class CommentAutoMata{
        final int start=0;
        final int one=1;
        final int two=2;
        final int three=3;
        final int finalState=4;
        final int five=5;
        final int six=6;
        public List getCommentList(String s){
            ArrayList ret=new ArrayList();
            int begin=-1;      
            int curState=start;
            for(int i=0;i<s.length();i++){
                char c=s.charAt(i);
                switch(curState){
                case(start):
                    if(c=='/'){
                        begin=i;
                        curState=one;
                    }
                    else if(c=='"'){
                        //识别字符出
                        curState=5;
                    }
                    break;
                case(one):
                    if(c=='*') curState=two;
                    else curState=start;            
                    break;
                case(two):
                    if(c=='*') curState=three;
                    break;
                case(three):
                    if(c=='/'){
                        curState=finalState;
                         //eat
                        ret.add(s.substring(begin,i+1));
                        //reset;
                        curState=start;
                        begin=-1;
                    }
                    else curState=two;
                    break;
                case(five):
                    if(c=='"') curState=start;
                    else if(c=='\\')curState=six; 
                    break;
                case(six):
                    curState=five;
                    break;
                   
                }
            }
            
            return ret;
        }
    }
      

  3.   

    treeroot(旗鲁特) ( ) 信誉:106  2006-05-18 14:32:00  得分: 0  
    这位老大提供了一种思路,呵呵,非常感谢,真不知道编译器是怎么识别的,那么准确,呵呵
      

  4.   

    呵呵 不过根据treeroot(旗鲁特) 老大的思路,用堆栈实现起来更爽啊
      

  5.   

    的确,"字符串内注释" 不能作为注释,"注释内字符串" 也不能作为字符串。如果想通过一个简单的表达式就能将 "注释" 和 "字符串中的注释" 区分开来,是很难办到的。需要通过另写程序,同时使用能够匹配 /* */ 和 // 和 " " 和 ' ' 的表达式,只要其中一个被另一个包含,都应该不算。同样的道理,字符串内的关键字,也不能算关键字等等等等小弟写过一个可以按照 HTML, JavaScript, VBScript 语法进行着色的插件,就是按照这个思路来的:
    http://www.regexlab.com/highlight/