正则表达式忽略Java中的注释

时间:2011-05-11 14:56:06

标签: regex eclipse

我似乎无法找到一个简明的答案,因为我对正则表达式知之甚少,我觉得最简单的选择就是问。

我正在尝试计算eclipse中的代码行,我可以这样做,但它包含了注释。

基本上,我的正则表达式是“\ n”

非常基本,是的,但尽可能地尝试,我似乎无法找到一种方法来忽略以“//”开头的行

我已经尝试了[^(//)],但这似乎计算了每个“/”。没有分隔符,我尝试了同样的事情:“\”

任何想法,即使你只是指出我正确的方向,我的谷歌搜索没有发现任何有用的。

5 个答案:

答案 0 :(得分:4)

最好在这里使用negative lookahead。对于您的案例代码,这将起作用:

String str = "Line1\n" +
"/Line2\n" +
"//Line3\n" +
"Line4\n" +
" // Line5\n" +
"Line6\n";
Pattern pt = Pattern.compile("^(?!\\s*//)", Pattern.MULTILINE);
matcher matcher = pt.matcher(str);
int c=0;
while (matcher.find()) c++;
System.out.println("# of lines: " + c);

输出

# of lines: 4

(?!\\s*//)是负面预测,只有当 <{1}}行时才会说匹配 正如您所看到的,从评论0 or more spaces followed by //开始,上面有2行,因此不计算在内 此外,在此处使用//标记使每一行都能识别行字符Pattern.MULTILINE的开头也很重要。

答案 1 :(得分:1)

简化正则表达式,如果您需要更多,将会改进:

^//

[]中的任何内容都是一个字符类,这意味着匹配其中的一个符号。此外,添加^与此相反,并且与计算字符串开头的^外部不同。

您还可以执行以下操作:

^[^/][^/].*

匹配不以//

开头的行

答案 2 :(得分:1)

有更好的方法和其他工具来计算代码行,例如测试覆盖率工具或(我不知道这是否仍适用于最新版本):http://metrics.sourceforge.net/

如果您忽略//,那么您仍然会计算packageimport声明以及多行注释,例如:

/**
 * Javadoc
 */

或单独坐在以下行上的括号:

while(...)
{
    ...
}

答案 3 :(得分:0)

我不熟悉eclipse,但是如果它有预测,那就应该这样做:

\n(?!//)

答案 4 :(得分:0)

^ \ S *(?!//)\ S * $

突出显示以任意数量的空格(\ s *“)开头的任何行(”^“),然后不开始注释(”(?!//)“),然后有一个非空格字符( “\ S”),然后有任意数量的任何字符,直到行尾(“。* $”)。