1

私は、実際の Java コードを含む Java ファイル内のテキスト行をカウントする単純な Ruby プログラムに取り組んでいます。コメントが入っていてもカウントされるので、基本的にはコメントだけの行しかカウントされません。

この問題に取り組むために正規表現を使用することを考えていました。私のプログラムは、次のように行ごとに反復し、それを「正規表現」と比較します。

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

ただし、そのために使用する正規表現形式はわかりません。何か案は?

4

2 に答える 2

3

「コードの行数」のカウントを取得することは、少し主観的なものになる可能性があります。インポートやパッケージ名などの自動生成されたものは本当にカウントされるべきですか? 人は通常それを書きませんでした。右中括弧だけの行はカウントされますか? その行には実際には実行ロジックはありません。

私は通常、この正規表現を使用して Java コード行を数えます。

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

これは省略します:

  • 空行
  • 輸入品
  • パッケージ名のある行
  • }だけの行
  • 一行コメントの行 //
  • 複数行のコメントを開く ((空白)/* 何でも)
  • 複数行コメントの継続 ((空白)* 何でも)

\nまた、どちらかまたは改行に対しても一致し\r\nます (OS によっては、ソース コードにいずれかが含まれている可能性があるため)。

完璧ではありませんが、すべての「正当な」コード行との一致にかなり近づいているようです。

于 2013-09-10T22:42:36.033 に答える
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
于 2013-09-10T23:20:16.570 に答える