在注释行里找内容还是把所有的JAVA文件注释行找出来呀?

解决方案 »

  1.   

    我想只要你对JAVA的注释方式了解,会用java.util.regex包,应该说很简单,等下午我帮你写一个
      

  2.   

    "//[[\\w][\\p{Punct}]]*"                这个是对//
    "/\\*[[\\w][\\p{Punct}][\\s]]*\\*/"     这个是对/*  */\\w是任何字符,\\p{Punct}是任何标点,\\s是任何空白符,包括\t\n\x0B\f\r
    我试过一下,应该可以,你自己还可以改进一下
      

  3.   

    我现在只能分步来做了    //  
       /***  */ 
    已经可以了,还差多行的  /**  */   Pattent.compile(".*/\\*\\*.*?\\*/.*$",Pattent.DOTALL);也不行,不知道哪里有问题
      

  4.   

    to hui_hui_lin(慧慧): 你的Pattent也不行 第一次整个文件全出来了,测试样本如下:// 1
      // 2
    /* 第1行 测试单行 */ 
       /* 第2行 测试单行带前空白 */  
    /* 第3行 测试单行带尾部字符 */ 3   
       /* 第4行 测试单行前空白后带字符 */ 4
    /*
     5 测试多行
    */   
      
      /*
       A 
       6 测试多行带前空白
       B 
      */ 
      
    /*
     7 测试多行带尾部字符
    */ O   
      
      /*
       8 测试多行前空白后带字符
      */  F
      

  5.   

    String re = "(^\\/\\/)((\\w|\\W)*)";  以//开头
    String re1 = "^\\/\\*((\\w|\\W)*)";  以/*开头
    String re2 = "(^\\*)((\\w|\\W)*)";   以*开头
    我是可以  
    /*   和 */之间的 恐怕要一行一行来了
      

  6.   

    to 狼平方:我的pattern是只考虑了以//开头,和以/*开头,以*/结尾的情况,没考虑你的那些//或/*之前还有字符,*/之后还有字符的情况,我想你可以改进一下的哦
    //的我试过单行的,/**/我试过有几行的情况
    不过我没试整个文件读进去的情况
      

  7.   

    现在使用 Pattern p = Pattern.compile(".*[/\\*]+.*\\*/.*$", Pattern.MULTILINE);可以得到 1 - 4 类型的注释行,现在就差多行的了
      

  8.   

    嗯,不好意思哦,下午工作太忙,没有试,打算晚上开完会回家再试了
    不知道你有没看过StringTokenizer这个类,可以把非注释取出来
      

  9.   

    pattern = Pattern.compile( ".*/\\*(.*)\\*/.*", Pattern.DOTALL );
    这样可以吗?
      

  10.   

    import java.util.regex.*;
    import java.io.*;public class Test2{
       
    public static void main(String args[]) {
       Pattern pattern;
       Matcher matcher;
       boolean bool;
       String tempS;
       StringBuffer sb = new StringBuffer();
       pattern = Pattern.compile( ".*/\\*(.*)\\*/.*", Pattern.DOTALL );
       try{
         BufferedReader br = new BufferedReader( new FileReader( "test.txt" ) );
         while( null != (tempS = br.readLine() ) ){
           sb.append( tempS + "\n");
           matcher = pattern.matcher( sb );
           bool = matcher.matches();
           if( bool == true ){
             System.out.println( "found a new one ............................" );
             System.out.println( matcher.group(1) );
             System.out.println( "............................................" );
             sb.delete( 0, sb.length() );
           }
         }
       } catch( IOException ioe ){
         System.out.println( "BoolShit" );
       }
    }
    }
    text.txt:// 1
      // 2
    /* 第1行 测试单行 */ 
       /* 第2行 测试单行带前空白 */  
    /* 第3行 测试单行带尾部字符 */ 3   
       /* 第4行 测试单行前空白后带字符 */ 4
    /*
     5 测试多行
    */   
      
      /*
       A 
       6 测试多行带前空白
       B 
      */ 
      
    /*
     * 7 测试多行带尾部字符
    */ O   
      
      /*
       8 测试多行前空白后带字符
      */  F
      

  11.   

    to  stillfire(恒) ( ):
      在什么地方有阿,能不能帮忙说一下位置阿??
    to  wolfsquare(狼平方):
      下面这个是刚才改过的了,读入了所有的内容然后再进行判断,你看行不行?import java.util.regex.*;
    import java.io.*;public class Test2{
       
    public static void main(String args[]) {
      int start = 0;
    //  int matchCount = 0;
       Pattern pattern;
       Matcher matcher;
       boolean bool;
       String tempS;
       StringBuffer sb = new StringBuffer();
       pattern = Pattern.compile("[^\\*/]*/\\*(.|[^\\*]*|[^\\*]*\\*[^/][^\\*]*)\\*/[^\\*/]*",Pattern.DOTALL);
       //System.out.println( Pattern.compile( "[^\\*]*\\*[^/][^\\*]*").matcher( "*/" ).matches() );
       try{
         BufferedReader br = new BufferedReader( new FileReader( "test.txt" ) );
         while( null != (tempS = br.readLine() ) ){
           sb.append( tempS + "\n");      
         }
       } catch( IOException ioe ){
         System.out.println( "BoolShit" );
       }
       matcher = pattern.matcher( sb );
     //  System.out.println( matcher.groupCount() );
       while( start < sb.length() ){
         if( true == matcher.find( start ) ){
           System.out.println( matcher.group( 1 ) );
           //System.out.println( matcher.end() );
          // System.out.println( matcher.start() );
          // matchCount++;
           start = matcher.end();
         } else{
           start++;
         }
       } }
    }
      

  12.   

    to XKP(低等下人) :
        已经差不多了,但是不知为什么使用 matcher.group( 1 ) 获得的去除注释头尾的部分是正确的但是使用 matcher.group() 将头尾包含进来获得的结果却不一样. 由于我需要的是包含注释头尾的正确结果的完整行,所以楼上的还不算是完全对.
    不过为了表示我对楼上各位辛勤劳动的感谢,我新开了一个放分贴:
       http://expert.csdn.net/Expert/topic/1886/1886484.xml?temp=.0184595请各位前去领分.
      

  13.   

    to  wolfsquare(狼平方):但是不知为什么使用 matcher.group( 1 ) 获得的去除注释头尾的部分是正确的但是使用 matcher.group() 将头尾包含进来获得的结果却不一样. 由于我需要的是包含注释头尾的正确结果的完整行
    这里我不太明白你的意思,你能不能就用你上面的测试文本来举个例子阿
      

  14.   

    因为我需要的效果是这样的:
      查找所有测试样本中注释类型的注释语句,并将他们所在行的完整行取出来.
    如果你使用group(1),它的意思是取和第一个()里语法匹配的数据,但是你的
    第一个()里的东西并没有完整包含/* .. */,所以我就直接goup获取整个匹配语句
    但是输出的东西却多了一些东西,我想这可能是你的条件限制的还不够.
    例如测试样本中的第一条语句:
       使用你的代码得出来的是第1行 测试单行
       但是我需要的是/* 第1行 测试单行 */ 于是我修改为获取group的数据:
    2
    /* 第1行 测试单行 */ 可以看到多了一个 2除了第一行,其他的都是正确的,由于我对正则还不很熟,所以没法改进你的正则表达式.
      

  15.   

    刚刚改过了,这回应该符合你的要求了import java.util.regex.*;
    import java.io.*;public class Test2{
       
    public static void main(String args[]) {
      int start = 0;
    //  int matchCount = 0;
       Pattern pattern;
       Matcher matcher;
       boolean bool;
       String tempS;
       StringBuffer sb = new StringBuffer();
       //pattern = Pattern.compile("[^\\*/]*/\\*(.|[^\\*]*|[^\\*]*\\*[^/][^\\*]*)\\*/[^\\*/]*",Pattern.DOTALL);
       pattern = Pattern.compile("[^\\*/]*(/\\*(.|[^\\*]*|[^\\*]*\\*[^/][^\\*]*)\\*/)[^\\*/]*",Pattern.DOTALL);
       //System.out.println( Pattern.compile( "[^\\*]*\\*[^/][^\\*]*").matcher( "*/" ).matches() );
       try{
         BufferedReader br = new BufferedReader( new FileReader( "test.txt" ) );
         while( null != (tempS = br.readLine() ) ){
           sb.append( tempS + "\n");      
         }
       } catch( IOException ioe ){
         System.out.println( "BoolShit" );
       }
       matcher = pattern.matcher( sb );
       System.out.println( matcher.groupCount() );
       while( start < sb.length() ){
         if( true == matcher.find( start ) ){
           System.out.println( "found a new one ............................" );
           System.out.println( matcher.group( 0 ) );
           System.out.println( matcher.group( 1 ) );
           System.out.println( matcher.group( 2 ) );
           System.out.println( "............................................" );
           start = matcher.end();
         } else{
           start++;
         }
       } }
    }主要的改动是这里
    pattern = Pattern.compile("[^\\*/]*(/\\*(.|[^\\*]*|[^\\*]*\\*[^/][^\\*]*)\\*/)[^\\*/]*",Pattern.DOTALL);
    ("[^\\*/]*(..........................)[^\\*/]*     多了两个小括号然后在下面的那个地方用group 2 1 0分别来引用三个匹配的字符串
    你运行一下看看就清楚了
    你要的那个部分应该是现在的group(1)
      

  16.   

    说起来是我没有讲我的意思表达完全
    我需要的是分析Java源文件注释信息的一个正则表达式字符串。
    因为是通用的东西,所以要求不能用group(1)等形式而只能是group().
    XKP其实已经做的很好了,现在只需要将他的正则改一下就能达到要求,就是以下这种情形:
      不含换行的任意字符 /*开头 中间任意字符含换行 */结尾 尾部包含任意字符最后是换行或者文件结束
    的正则表达式。
      

  17.   

    to  wolfsquare(狼平方) :
       不含换行的任意字符 /*开头 中间任意字符含换行 */结尾
      我在测试的时候,发现好像匹配的时候总是按照匹配到得最长的字符串
    比如
    /* 第1行 测试单行 */ 
       /* 第2行 测试单行带前空白 */  

    /*开头 中间任意字符含换行 */
    这个  规则  来匹配的时候就会变成 两个 注释都在一起被分割出来
    如果这是用group的话,就输出了
    /* 第1行 测试单行 */ 
       /* 第2行 测试单行带前空白 */  
    而不是我们想要的分割成
    两个/*..........*/
    的形式,你会不会遇到这个问题啊?
      

  18.   

    刚才又改了一点东西
    pattern = Pattern.compile("[^\\*/]*(/\\*(.|[^\\*]*(\\*[^/][^\\*]*)*)\\*/)[^\\*/]*",Pattern.DOTALL);
    这一句进行了改动
    原来的那个正则表示式对于这样的形式
    /*......................
     *......................
    */
    可以检测出来,不过对于这样的形式
    /*......................
     *......................
     *......................
    */
    就不行了,主要是因为只对*......................这样的形式进行了一次
    匹配,所以如果在/* .......... */里面只有一个*......................
    的话,可以检测出来,不过对于两个以及两个以上的情况就不行了该过之后可以对于任意次数的*...................进行匹配
    而且也修正了一点点多余的匹配规则  |[^\\*]*|   这个部分删掉了
      

  19.   

    目前这是我得到的最好的表达式:
    Pattern p = Pattern.compile("[.[^\\n]]*(/\\*(.|[^\\*]*|[^\\*]*\\*[^/][^\\*]*)\\*/)[.[^\\n]]*",Pattern.DOTALL);
    是拿你的改的 :) 。
      

  20.   

    刚才测试了一下
    Pattern p = Pattern.compile("[.[^\\n]]*(/\\*(.|[^\\*]*|[^\\*]*\\*[^/][^\\*]*)\\*/)[.[^\\n]]*",Pattern.DOTALL);
    发现好像不能得到类似于这样的形式的
    /*
     * 7 测试多行带尾部字符
     * 22222333333333333333333333344444444444444444
    */ O
    就是包含有一个以上
    *........................
    注释的用这个
    pattern = Pattern.compile("[^\\*/]*(/\\*(.|[^\\*]*(\\*[^/][^\\*]*)*)\\*/)[^\\*/]*",Pattern.DOTALL);
    效果好一点~~~~~~~~~~
    你有空测试一下这个地方
    |[^\\*]*|
    可以和后面的正则表达式合并成这个样子
    [^\\*]*(\\*[^/][^\\*]*)*
    其中的
    (\\*[^/][^\\*]*)*
    匹配的就是零个或者多个
    *.............................
      

  21.   

    对于\n的那个地方有点保留~~~~~
    我只是怕在不同的系统下面可能换行回车的符号不太一样的话
    就不好了,你有没有在unix和mac的环境下测试过阿?
    我这里没有这种平台,所以也测试不了~~~~~我改过的最后一次就是因为看到中间的那个地方可能出现
    *..................
    *..................
    *..................
    这样的情况,所以改调的~~~~~~你说得用.*来对应中间的部分
    是不是说如果整个文件读进去之后匹配出来的还是没有按
    /*.........*/
    拆分而是变成可能
    /*.........*/
    /*.........*/
    /*.........*/
    /*.........*/
    他都当成了一整个的group呢?
    好像正则表达式都是从最大的那个表达式开始匹配,所以
    /*.........*/
    /*.........*/
    /*.........*/
    /*.........*/
    这样也可以算作是匹配/\\*  .*  \\*/
    的字符串吧,所以后来我就在匹配的时候规定了
    /*.........*/
    的中间不能再有*/了,这样好像就可以了
      

  22.   

    我想\n在任何系统下的JVM编码是一样的
    Unix和windows的文本换行不同是 unix底下换行只有 \n
    windows 底下是\r\n 因此统计 \n应该没有问题不过我现在还不是很明白怎样在正则中排除一个字符串,你给我解释一下行吗?
      

  23.   

    我刚才找了一下
    有一本《java网络编程》的书里面111页
    中间一个地方说道
    mac的行分隔符是\r
    或许你有空可以研究一下~~~~~~~至于你说到排除一个字符串的方法,说真的,我也不知道有什么好办法
    在上面你的这个例子里面,如果要排除*/的话,我那天是这么做的
    [^\\*][^/]   不过后来我又想到其实在注释里面是可以有*........
    这样的形式的,所以我就改了一下,可以有"*"开头的字符串,不过
    如果是"*"开头的字符串,后面就不能紧跟着"/"
    所以就变成了
    \\*[^/][^\\*]*我在测试能不能用小括号来排除字符串
      

  24.   

    to wolfsquare(狼平方):
    [.[^\\n]]* 对应的是 不带换行的任意字符
    刚才想道这个地方是不是用[^\\n]* 
    就行了呢?
      

  25.   

    似乎这个效果不错,在详细测试一下:
    Pattern p = Pattern.compile("[.[^\\n]]*/\\*(.[^\\*/]*?)\\*/[.[^\\n]]*",Pattern.DOTALL);