しかし、コメントの「ある」行を探すのは、
(/\*|\*/)ってできるのですが、コメントの「ない」行を探すために上記を否定する方法が分からない。
1文字単位の否定は、
[^a]って感じでやればいいのですが、複数の文字がまとまった文字列の単位を否定するにはどうすればいいんだ?
ってことで探して見つけたのが以下のページ。
テキスト編集を極める!! 正規表現について - 秀丸Q&A
http://homepage2.nifty.com/jr-kun/hidemaru_qa/4_regulr.html
>[2-2] 「文字列の否定」について
> 今度はC言語のコメントを削除する例を考えてみましょう。
> C言語のコメントは "/*" と "*/" で囲まれた部分です。
> この場合も前節の HTML タグの削除でやったように "/*" と "*/"
> の間に "*/" を「否定」する 表現を入れてやればよい事は明白です。
> …と言いたい所ですが、正規表現には否定のキャラクタクラス指定と
> いう「文字」の否定をする表現はありますが、 直接「文字列」を否定
> する表現はありません。
> …もうおわかりでしょうが、"[^*/]" は「"*" でも "/" でもない1文
> 字」という意味であり、「"*/" でない文字列」という意味にはなりません。
ってことで、
[^(/\*|\*/)]って感じで簡単に指定する方法はないらしい。
まあ、テキストエディタで手動でやる作業なので、例外ケースは手作業で直すってことで問題ないかってことで、行頭・行末一気に挿入」の正規表現をちょっとだけ改良。否定する文字に「/」を追加しました。
^([^/\r\n]+)$「/」が単独で含まれている場合も引っかからなくなってしまうので、割り算をしている行が飛ばされてしまうというトホホな感じですが。
追記:
上記「秀丸Q&A」のページの続きに、
>C言語のコメントを消す
>"/*" と "*/" の間にある文字列のパターンは、以下のように表わすこと
>ができそうです。
> 「"/" 以外の文字」と「直前が "*" 以外の "/"」を組み合わせた文字列
>ここで、"/" の直前に "*" がないことを指定して実質的に「文字列の否
>定」をしていることに注意して下さい。
>以上のことを考慮して、ちゃんとコメントにマッチする(と思われる)パタ
>ーンを書いたものが以下です。
>検索文字列: /\*([^/]|[^*]/)*\*/
>("*" は メタキャラクタなので、キャラクタクラス指定の中にある "*"
>以外は "\" でエスケープしてあります。)
と書いてあったのでこれを参考にしたところ、以下のような正規表現で目的が達成できました。
^(([^/*\r\n]|/[^*]|\*[^/])+)$