Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

c

Cのコメント部分を正規表現で検索@vim

ソースコードを機械的に解析する際、コメントが邪魔だったりします。

viでコメント部分を削除しようとして、正規表現で以下のようにコメント部分を検索するとします。

\\/\\*.*\\*\\/

これは、/で始まり、任意の文字列"."が続いた後に、*/で終わる部分にマッチしますので、

/* hoge */

というコメント部分にもちろんマッチしますが、実は最も長い部分にマッチするため、

/* hoge */ int a = 0; /* hoge */

は、int a =0; も含めてマッチしてしまいます。よって、//の間にはコメントの閉じである*/がこないことを正規表現で表現する必要があります。

ここで、少し考え方が難しくなります。 じつは正規表現で否定を表現する場合、[^abc]と表現できますが、これはabcという文字列がこないという意味ではなくて、aかbかcがこないという意味なので目的にあいません。

よって、任意の文字"."を[^/]に置き換えた場合は、または/ではないという意味なので、

\\/\\*[^*\/]*\\*\\/

という正規表現は、

/ hoge/hoge /

という"/"を含んだコメントにマッチしなくなってしまいます。

では"*/"という文字列ではない という表現はどう表現すればよいのでしょうか。

正規表現では文字列否定専用の表現はありません。そこで"/" 以外の文字」と「直前が "*" 以外の "/"」と考えます。

これを正規表現と表すと

\\([^\\/]\\|[^*]\\/\\)*

となり、//の条件も付け加えると

 \\/\\*\\([^\\/]\\|[^*]\\/\\)*\\*\\/

となります。

さらに、/ /は途中に改行が入る可能性があります。"."は改行にはマッチしないので、改行の表現である"\n"をマッチの条件に追加して

\\/\\*\\([^\\/]\\|[^*]\\/\\|\\n\\)*\\*\\/

となり、なんとか動いてくれたようです。複雑ですね~

これを使用することで、コメントの中にある文字列を探すことも可能になります。

上記を整理すると、Cにおいて 以下が改行を考慮した*/以外の文字列を示しているので

\\([^\\/]\\|[^*]\\/\\|\\n\\)*

コメント内の文字列を探すには、探す文字列の前後にこの表現があればよいことになります。つまりhogeを探すならこのようになります。

\\/\\*\\([^\\/]\\|[^*]\\/\\|\\n\\)*hoge\\([^\\/]\\|[^*]\\/\\|\\n\\)*\\*\\/

なお、上記で説明した正規表現は、実はprintf などの文字列内にある/ /もマッチしてしまいます。他にも条件によっては動作がおかしくなる可能性があるので注意してくださ。

文字列を含まないというのを汎用的に表現すると、もっと難しく、さらにメモリ消費が激しいようです。参考サイトには文字列を含まない正規表現を自動生成してくれるJavascriptもありますが、maznの環境では動作が重く、実用に耐えられませんでした。

参考 http://blog.livedoor.jp/froo/archives/50581540.html http://funcchan.blog16.fc2.com/blog-entry-39.html http://www.kt.rim.or.jp/~kbk/regex/regex.html

プログラミング言語のベンチマーク

プログラミング言語のベンチマークサイトを発見

http://shootout.alioth.debian.org/gp4/benchmark.php?test=all〈=all

1位 gcc 2位 g++ … 4位 Java6 … 17位 Python … 48位 Ruby

といった感じ。Rubyちょっと勉強してみようと思ってたけど、なんかやる気失せた。

最近Groobyにも注目してるのだけど、どうなんだろ。

=追記=

JVM上で動くスクリプト言語を比較しているサイトを発見

http://yher2.blogspot.com/2006/10/groovy-rhino-jython-jruby.html

JRubyが本家Rubyよりも早くなったという記事をどこかでみたが、もともとRubyってめちゃくちゃ遅いようで、あまり自慢にならない気がします。Groovyはまだまだ発展途上なので、今後の開発に期待です。Rhino はJVM上で動くJavascriptです。速いですねぇ~!!

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ