使用StringTokenizer查找注释

时间:2013-07-28 13:50:31

标签: java stringtokenizer

我使用以下代码来计算代码中的注释数量:

    StringTokenizer stringTokenizer = new StringTokenizer(str);


    while (stringTokenizer.hasMoreTokens()) {
        if (exists == false && stringTokenizer.nextToken().contains("/*")) {
            exists = true;

        } else if (exists == true && stringTokenizer.nextToken().contains("*/")) {

            x++;
            exists = false;

        }

    }

    System.out.println(x);

}

如果注释包含空格,则它有效:

例如:“/ * fgdfgfgf / / fgdfgfgf / / fgdfgfgf * /”

但是对于没有空格的评论它不起作用:

例如:“/ * fgdfgfgf // fgdfgfgf * // * fgdfgfgf * /

3 个答案:

答案 0 :(得分:4)

使用commons lang中的StringUtils类,您可以非常轻松地存档此

    String str = "Your String"
    if (&& StringUtils.countMatches(str,"/*") != 0) {
       //no need this if condition
    } else if (StringUtils.countMatches(str,"*/") != 0) {
         x = StringUtils.countMatches(str,"*/");
    }
    System.out.println(x);

答案 1 :(得分:0)

new StringTokenizer(str,"\n")str标记/拆分为行,而不是使用默认分隔符\t\n\r\f,空格,制表符,换页符,滑块和换行符的组合

StringTokenizer stringTokenizer = new StringTokenizer(str,"\n");

这将换行符指定为用于标记的唯一分隔符

使用您当前的方法:

String line;
while(stringTokenizer.hasMoreTokens()){

 line=stringTokenizer.nextToken();

   if(!exists && line.contains("/*")){
        exists = true;
   }
   if(exists && line.contains("*/")){
        x++;
        exists = false;
 }    
}

对于多条评论,我尝试使用/\\*& \\*/中的模式为split()中的模式,并且在字符串中出现了它们的长度,但不幸的是,由于不均匀的分割,长度并不准确。

多个/单个评论可以是:(IMO)

COMMENT=/* .* */
A = COMMENT;
B = CODE;
C = AB/BA/ABA/BAB/AAB/BAA/A;

答案 2 :(得分:0)

这让我想起了Ruby / Perl / Awk等人的人字拖鞋。无需使用StringTokenizer。你只需要保持状态来计算带注释的行数。

  1. 您在评论栏内。您开始打印或收集所有字符。只要您完全遇到*/,就可以切换注释块切换。并切换到状态2

  2. 在您遇到/*并返回状态1之前,您拒绝所有内容。

  3. 像这样的东西

    public static int countLines(Reader reader) throws IOException {
        int commentLines = 0;
    
        boolean inComments = false;
        StringBuilder line = new StringBuilder();
    
        for (int ch = -1, prev = -1; ((ch = reader.read())) != -1; prev = ch) {
            System.out.println((char)ch);
            if (inComments) {
                if (prev == '*' && ch == '/') { //flip state
                    inComments = false;
                }
    
                if (ch != '\n' && ch != '\r') {
                    line.append((char)ch);
                } 
    
                if (!inComments || ch == '\n' || ch == '\r') {
                    String actualLine = line.toString().trim();
                    //ignore lines which only have '*/' in them
                    commentLines += actualLine.length() > 0 && !"*/".equals(actualLine) ? 1 : 0;
                    line = new StringBuilder();
                }
            } else {
                if (prev == '/' && ch == '*') { //flip state
                    inComments = true;
                }
            }
        }
    
        return commentLines;
    }
    
    public static void main(String[] args) throws FileNotFoundException, IOException {
        System.out.println(countLines(new FileReader(new File("/tmp/b"))));
    }
    

    以上程序会忽略空行注释或仅包含/**/的行。我们还需要忽略字符串标记符可能失败的嵌套注释。

    示例文件/ tmp / b

    #include <stdio.h>
    int main()
    {
        /* /******* wrong!  The variable declaration must appear first */
        printf( "Declare x next" );
        int x;
    
        return 0;
    }
    

    返回1.