什么是用于查找未注释 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 代码行的正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式在代码中查找空注释

正则表达式检测代码中的注释[重复]

javascript 正则表达式在代码中查找注释

用于查找 HTML 标签及其内容的正则表达式的否定 - java

正则表达式快速通

Python 3 正则表达式查找多行注释