我使用以下代码来计算代码中的注释数量:
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 * /
答案 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
。你只需要保持状态来计算带注释的行数。
您在评论栏内。您开始打印或收集所有字符。只要您完全遇到*/
,就可以切换注释块切换。并切换到状态2
在您遇到/*
并返回状态1之前,您拒绝所有内容。
像这样的东西
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.