質問
コメントを自動的にスキップしながら特定の文字列を検索できるようにする正規表現を見つけようとしています。このようなREを持っている人、またはそれを知っている人はいますか?スキップするほど洗練されている必要さえありません #if 0
ブロック。スキップしてほしいだけです //
そして /*
ブロック。逆に、コメント ブロック内のみを検索することも非常に便利です。
環境:VS2003
解決
これは、文字列内のコメント トークン、コメント トークン自体がコメント化されているなどを考慮する必要があるため、一見したよりも難しい問題です。
C# 用の文字列とコメントのパーサーを作成しました。役立つものが見つかるかどうか見てみましょう...何か見つけたら更新します。
編集:...さて、古い「codemasker」プロジェクトを見つけました。これを単一の正規表現ではなく、段階的に行ったことがわかりました。基本的に、ソース ファイルを少しずつ調べて開始トークンを探し、開始トークンを見つけたら、終了トークンを探し、その間のすべてをマスクします。これには、開始トークンのコンテキストが考慮されます...「文字列の開始」のトークンが見つかった場合は、文字列の終わりが見つかるまでコメント トークンを無視しても問題ありません。逆も同様です。コードがマスクされると (マスクとして guid を使用し、追跡するためにハッシュテーブルを使用しました)、安全に検索と置換を実行し、最後にマスクされたコードを復元できます。
それが役立つことを願っています。
他のヒント
特に文字列には注意してください。多くの場合、文字列にはエスケープ シーケンスが含まれており、文字列の終わりを見つけるときにこれも尊重する必要があります。
たとえば、 "This is \"a test\""
. 。やみくもに二重引用符を探して終了することはできません。また、「"This is \"」にも注意してください。これは、「二重引用符の前にバックスラッシュがない限り」とだけは言えないことを示しています。
要約すると、いくつかの残酷な単体テストを作成してください。
正規表現はこの作業に最適なツールではありません。
Cさんのコメント:
#!/usr/bin/perl
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print;
C++ のコメント:
#!/usr/local/bin/perl
$/ = undef;
$_ = <>;
s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+# $1 ? "/*$1 */" : $& #ge;
print;
まずコピーを作成してコメントを削除し、それから通常の方法で文字列を検索します。