【问题标题】:What is a regular expression for finding lines with uncommented Java code?什么是用于查找未注释 Java 代码行的正则表达式?
【发布时间】:2013-09-14 19:05:46
【问题描述】:

我正在开发一个简单的 Ruby 程序,该程序应该计算包含实际 Java 代码的 Java 文件中的文本行数。该行即使包含 cmets 也会被计算在内,因此基本上只有 只是 cmets 的行不会被计算在内。

我正在考虑使用正则表达式来解决这个问题。我的程序将逐行迭代并将其与“正则表达式”进行比较,例如:

while line = file.gets
    if line =~ regex
        count+=1
    end
end

不过,我不确定要使用哪种正则表达式格式。有什么想法吗?

【问题讨论】:

  • 没那么简单。 /* 评论可以跨越多行。
  • 这是有道理的。在这种情况下,如果我有两个单独的正则表达式,其中一个可以检查评论是否跨越多行并相应地读取其他行,它会起作用吗?
  • 请参阅stackoverflow.com/q/462843/897024 了解多行 cmets。
  • 你会用 JRuby 吗?有大量可用的 Java 解析库,您可以通过这种方式更准确、更轻松地阅读 Java 源代码。

标签: ruby regex


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 2013-08-14
      • 2016-07-15
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      相关资源
      最近更新 更多