2013-09-10 23 views
1

我正在研究一个简单的Ruby程序,该程序应包含包含实际Java代码的Java文件中的文本行。即使它有评论,该行也会被计数,所以基本上只有只是评论的行不会被计算在内。用未注释的Java代码查找行的正则表达式是什么?

我想用正则表达式来处理这个问题。我的计划将通过线只是迭代行,并将其与一个“正则表达式”,如:

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

我不知道用什么样的正则表达式格式,虽然。有任何想法吗?

+2

并非如此简单。 '/ *'注释可以跨越多行。 – kiheru

+0

这很有道理。在这种情况下,如果我有两个单独的正则表达式,其中一个可以检查注释是否跨越多行并相应地读取其他行,它会起作用吗? – gtorien

+1

有关多行注释,请参阅http://stackoverflow.com/q/462843/897024。 – Kapep

回答

1

获得“代码行数”可能有点主观。像自动生成的东西,如进口和包名真的很重要?一个人通常不写。只有一个结束大括号计数的线?这条线上没有任何执行逻辑。

我通常使用这个表达式计数的代码的Java行:

^(?![ \s]*\r?\n|import|package|[ \s]*}\r?\n|[ \s]*//|[ \s]*/\*|[ \s]*\*).*\r?\n 

这将省略:

  • 空白行
  • 进口
  • 线,包名
  • 只有一行}
  • 线,单行注释//
  • 开放多行注释((空格)/ *等等)
  • 续的多行注释((空白)*无论)

它也将匹配针对\n\r\n新行(因为您的源代码可能包含取决于您的操作系统)。

虽然不完美,但它似乎与所有匹配,我认为是“合法”的代码行非常接近。

0
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 
相关问题