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
ブラウザ上でのWYSIWYG HTMLエディター

このサイトで使用しているWordPressでも記事作成するときに使用しているよう …

no image
グループへのユーザの追加@Linux

グループへユーザを追加する方法。 # gpasswd -a user group …

no image
Firefox 3.6.x のメモリ消費が激しすぎる

Firefox を長時間使っていると、メモリ消費が700MBを超えています。 タ …

no image
WordPress プラグイン - Stat Traq導入

アクセス統計をとってくれるプラグインStat TraqをWordPressに導入 …

no image
iptablesの設定を保存し起動時に自動的に反映する@Ubuntu 12.04 server

Ubuntu の iptables の設定を保存するには、iptables-pe …

no image
6to4でIPv6を使ってみる+ip6tables設定@Sakura VPS with CentOS 5

Sakura VPS でIPv6を使ってみた。 方法としては 6to4 と 6r …

no image
coreファイルの扱いについて

coreを吐かせるにはulimitで制限されていない必要がある # ulimit …

no image
pythonで日本語処理めとめ@python 2.6

python で文字列を扱う場合、unicode型と、str型というのがあります …

no image
アプリケーションの追加と削除@RHEL5

RHEL5からはパッケージ管理のフロントエンドがyumになってしまったため、リポ …

no image
rubyの文字コードについて考える

rubyでは、1.6以降漢字コードを特別に解釈しなくなったようです。 maznは …