2013-09-10 22 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 
相關問題