4

コメントを自動的にスキップしながら特定の文字列を検索できるようにするために、正規表現を見つけようとしています。誰かがこのようなREを持っているか、それを知っていますか?#if 0ブロックをスキップするのに十分なほど洗練されている必要はありません。//スキップして/*ブロックしたいだけです。コメントブロック内を検索するだけの逆も非常に便利です。

環境:VS 2003

4

4 に答える 4

3

文字列内のコメントトークン、それ自体がコメントアウトされているコメントトークンなどを考慮する必要があるため、これは最初に表示されるよりも難しい問題です。

C#用の文字列とコメントパーサーを作成しました。役立つものを掘り下げることができるかどうかを確認させてください...何か見つかったら更新します。

編集:...わかりました、それで私は私の古い「コードマスカー」プロジェクトを見つけました。これは、単一の正規表現ではなく、段階的に行ったことがわかりました。基本的に、ソースファイルを調べて開始トークンを探します。開始トークンを見つけたら、終了トークンを探して、その間のすべてをマスクします。これは、開始トークンのコンテキストを考慮に入れます...「文字列開始」のトークンが見つかった場合は、文字列の終わりが見つかるまでコメントトークンを安全に無視でき、その逆も可能です。コードがマスクされると(私はGUIDをマスクとして使用し、ハッシュテーブルを使用して追跡します)、安全に検索と置換を実行し、最後にマスクされたコードを復元できます。

お役に立てば幸いです。

于 2008-09-10T13:40:23.250 に答える
2

文字列には特に注意してください。文字列には多くの場合、エスケープシーケンスがあります。エスケープシーケンスは、文字列の終わりを見つけるときにも尊重する必要があります。

だから例えば"This is \"a test\""。終了する二重引用符を盲目的に探すことはできません。また、「これは「」です。これは、「二重引用符の前に円記号が付いていない限り」とだけ言うことはできないことを示しています。

要約すると、いくつかの残忍な単体テストを行います!

于 2008-09-10T14:15:05.117 に答える
2

正規表現は、この仕事に最適なツールではありません。

Perl FAQ :

C コメント:

#!/usr/bin/perl
$/ = undef;
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print; 

C++ コメント:

#!/usr/local/bin/perl
$/ = undef;
$_ = <>;

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;
于 2008-09-11T01:07:43.880 に答える
1

最初にコピーを作成してコメントを取り除き、次に通常の方法で文字列を検索します。

于 2008-09-10T14:31:31.803 に答える