什么是用于查找未注释 Java 代码行的正则表达式?
Posted
技术标签:
【中文标题】什么是用于查找未注释 Java 代码行的正则表达式?【英文标题】:What is a regular expression for finding lines with uncommented Java code? 【发布时间】:2013-09-14 19:05:46 【问题描述】:我正在开发一个简单的 Ruby 程序,该程序应该计算包含实际 Java 代码的 Java 文件中的文本行数。该行即使包含 cmets 也会被计算在内,因此基本上只有 只是 cmets 的行不会被计算在内。
我正在考虑使用正则表达式来解决这个问题。我的程序将逐行迭代并将其与“正则表达式”进行比较,例如:
while line = file.gets
if line =~ regex
count+=1
end
end
不过,我不确定要使用哪种正则表达式格式。有什么想法吗?
【问题讨论】:
没那么简单。/*
评论可以跨越多行。
这是有道理的。在这种情况下,如果我有两个单独的正则表达式,其中一个可以检查评论是否跨越多行并相应地读取其他行,它会起作用吗?
请参阅***.com/q/462843/897024 了解多行 cmets。
你会用 JRuby 吗?有大量可用的 Java 解析库,您可以通过这种方式更准确、更轻松地阅读 Java 源代码。
【参考方案1】:
获取“代码行数”的数量可能有点主观。像导入和包名这样的自动生成的东西真的应该算吗?一个人通常不会写它。仅带有右花括号的行算吗?该行实际上没有任何执行逻辑。
我通常使用这个正则表达式来计算 Java 代码行数:
^(?![ \s]*\r?\n|import|package|[ \s]*\r?\n|[ \s]*//|[ \s]*/\*|[ \s]*\*).*\r?\n
这将省略:
空白行 进口 带有包名的行 只有 的行 带有单行 cmets 的行 // 打开多行 cmets((空白)/* 随便) 多行 cmets 的延续((空白)* 随便)它还将匹配 \n
或 \r\n
换行符(因为您的源代码可能包含其中任何一个,具体取决于您的操作系统)。
虽然不完美,但它似乎非常接近匹配所有我认为“合法”的代码行。
【讨论】:
【参考方案2】:count = 0
file.each_line do |ln|
# Manage multiline and single line comments.
# Exclude single line if and only if there isn't code on that line
next if ln =~ %r^\s*(//|/\*[^*]*\*/$|$) or (ln =~ %r/\* .. ln =~ %r\*/)
count += 1
end
只有包含多行注释的行和代码存在问题,例如:
someCall(); /* Start comment
this a comment
even this
*/ thisShouldBeCounted();
但是:
imCounted(); // Comment
meToo(); /* comment */
/* comment */ yesImCounted();
// i'm not
/* Nor
we
are
*/
编辑 下面的版本有点麻烦,但正确计算了所有情况。
count = 0
comment_start = false
file.each_line do |ln|
# Manage multiline and single line comments.
# Exclude single line if and only if there isn't code on that line
next if ln =~ %r^\s*(//|/\*[^*]*\*/$|$) or (ln =~ %r^\s*/\* .. ln =~ %r\*/) or (comment_start and not ln.include? '*/')
count += 1 unless comment_start and ln =~ %r\*/\s*$
comment_start = ln.include? '/*'
end
【讨论】:
以上是关于什么是用于查找未注释 Java 代码行的正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章