Mazn.net

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

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

      2013/07/15

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

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

 - IT技術, プログラミング ,

336px

Message

メールアドレスが公開されることはありません。

  関連記事

no image
ウィンドウが勝手に最大化@Windows 7

Windows 7で、ウィンドウをはしっこに移動したりすると、最大化してしまいす …

no image
akamaitechnologies.comってなに??

ふとWindowsでnetstatを叩くと、akamaitechnologies …

no image
iSCSIを使ってみる@CenOS5.2 (ターゲット) + Windows XP (イニシエータ)

CentOS 5をtarget、Windowsをinitiatorとして、iSC …

no image
スイッチの初期化 @ Cisco Catalyst 2960

スイッチのパスワードを忘れてしまいログインできなくなった場合は初期化することにな …

Kubernetesのコンパイル

昨今、OSSを製品からコンパイルして使うことは少なくなってきましたが、Kuber …

no image
Google Music の文字化け対策まとめ

まだ日本ではサービス開始されていませんが、Google Music が便利そうな …

no image
PS3のハードディスク交換にあたって

PS3 20GBモデルはハードディスク容量がそのうち不足するだろうから、そのうち …

no image
ゲストOSの時刻同期@VMware + adjtimeでの調整

Windows上のVMware ServerでゲストOSとしてLinux (De …

no image
Tracにガントチャートプラグイン導入@Debian Etch

Tracの導入の記事で導入したTracにガントチャートプラグインを導入してみまし …

AutoKeyでLinuxのキーボード操作をカスタマイズ@Fedora 17

Linux でキーボード操作を、AutoKey というアプリでカスタマイズしてみ …