2008-09-10 9 views
4

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

環境:あなたは、文字列内のコメントトークンを検討する必要があるので、VS 2003

答えて

3

これは、それが最初に表示される場合がありますよりも難しい問題であり、自身がコメントアウトされているコメントトークンなど

私が書きましたC#の文字列とコメントパーサ、私が助ける何かを掘り出すことができるかどうか見てみましょう...私は何かを見つけたら更新します。

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

希望に役立ちます。

2

文字列には特に注意してください。文字列はしばしばエスケープシーケンスを持っています。エスケープシーケンスは、それらの終わりを見つけている間に尊重する必要があります。

"This is \"a test\""。あなたは盲目的に二重引用符を探して終了することはできません。また、これは\ "です。二重引用符の前にバックスラッシュを付けない限り、"とは言えません。

要約すると、残忍なユニットテストを行いましょう!

1

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

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; 
+0

よくある質問リンクが死んでいます。私はそれが[ここ]移動したと思う(http://perldoc.perl.org/perlfaq6.html#How-do-I-use-a- regular-expression-to-strip-C-style-comments-from-a -file%3f) –

+0

@Matt Mendell:ありがとう。私はリンクを更新しました – jfs

関連する問題