From: nobu.nakada@... Date: 2001-10-24T18:15:42+09:00 Subject: [ruby-list:32030] Re: コメント削除スクリプト なかだです。 At Wed, 24 Oct 2001 17:25:32 +0900, Tatsuaki Nagai wrote: > 永井さん@知能.九工大 wrote > >になって,ワンライナーにすると, > >=============================================== > >ruby -e "print STDIN.read.gsub(/\/\/.*$/,'').gsub(/\/\*.*?\*\//m,'')" < Cのソ > ースファイル > >=============================================== > >ってことになりますね. > > こうなってくると芸術の世界ですね。 > バッチコマンドとして用意しておくと便利かも。 > > 回答をたくさんもらいすぎて、消化できない状態になってきたので > 家に帰って勉強してきます。  真面目に処理するなら、/*...*/は空文字列ではなくスペースに置換 しなくてはいけません。完全に削除してしまうのはCの仕様としては非 常に古いです。また、文字列中の/*や*/も考慮が必要です。二種類作っ てみましたが、最初の方がかなり速いです。 #!/usr/bin/ruby def delete_comment(src) src.gsub(/\G([\'\"])(?>\\.|.)*?\1|(\/\*.*?\*\/)|(\/\/)[^\n]*?$/m) { if $2 s = $2.delete("^\n") s = ' ' if s.empty? s elsif $3 '' else $& end } end ARGV.each {|file| print delete_comment(open(file) {|f| f.read}) } #!/usr/bin/ruby STATES = { '\'' => [/\G('(?>\\.|.)*?')/, :quote], '"' => [/\G("(?>\\.|.)*?")/, :quote], '/*' => [%r'\G(?:/\*)?.*?\*/(\s+)?', :comment], '//' => [%r'\G.*$'], } STATES.default = @state = [%r"\G(.*?)(?=(\"|'|/\*|//))"] def delete_comment(src) idx = 0 size = src.size str = '' while idx < size unless src.index(@state[0], idx) str << src[idx..-1] unless @state[1] == :comment break end idx = $~.end(0) @state = STATES[$2] if $1 str << $1 elsif @state[1] == :comment str.sub!(/\S\Z/, '\& ') end end str end ARGF.each {|l| puts delete_comment(l)} -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦