2016-10-20 7 views
0

このようなプロジェクトのすべての機能を変更したいと思います。C++の関数名を正規表現で表現する方法は?

void Enemy::Create(int asdf, int asdf, float asdf) 
{ 
} 

- >

void Enemy::Create(int asdf, int asdf, float asdf) 
{CCLOG("ERROR OCCURED"); 
} 

とコードを以下の別の例です。

void Enemy::Change() 
{ 

} 

- >

void Enemy::Change() 
{CCLOG("ERROR OCCURED"); 

} 

しかし、私のプロジェクトは、それのように変更するにはあまりにも多くの機能を持っています。だから私はそれのようなすべての関数を変更するために正規表現を使用することに決めました。

(Visual Studioのサポートは、通常のexpresionによってコードを置き換える)しかし、私は正規表現に慣れていないので、私はそれについては考えています。

プロジェクト内のすべての機能を上向きに変更するにはどうすればよいですか?

+1

'Enemy'クラスのすべての関数が変更を必要としていますか? –

+0

敵のクラスでエラーが発生したとは思わない。しかし私の目的は、モバイルの移植で発生するいくつかのエラーをデバッグすることです。ビジュアルスタジオでは、プロジェクトはうまく動作しますが、EclipseとAndroidの移植では、私のアプリケーションは突然死んでしまいました。 –

答えて

2

わかりやすい表現を与えるのではなく、私はそれについても詳しく説明します。

コンパイラのコードとよく似ていますが、ルールを作成する一連のトークンに基づいて正規表現を作成できます。メソッド定義の検出のみに特に関心があるので、引数のリストをパラメータ間の何かとして扱うことができます。

あなたはそれをこのようなものと考えることができます - Cで

<Identifier><Whitespace><Identifier>::<Identifier>(<Anthing>)<Whitespace>{ 

として一般

void Enemy::Create(int asdf, int asdf, float asdf) { 

++識別子が_またはゼロ以上_A-Zまたは0-9続いA-Zです。そのことを言った -

<Identifier> = [a-zA-Z_][a-zA-Z0-9_]* 
<Whitespace> = [\n\r\s]+ 
    <Anything> = .* 

だから式は複数行サポートのものがそう、この

([a-zA-Z_][a-zA-Z0-9_]*)([\n\r\s]+)([a-zA-Z_][a-zA-Z0-9_]*)::([a-zA-Z_][a-zA-Z0-9_]*)\((.*)\)([\n\r\s]+)\{ 

そして用を使用して見つからないこの

([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($1) 
([\n\r\s]+)    # <Whitespace> ($2) 
([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($3) 
::      # ::   
([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($4) 
\(      # (
(.*)      # <Anything> ($5) 
\)      #) 
([\n\r\s]+)    # <Whitespace> ($6) 
\{      # { 

しかし、Visual Studioのようになるはずです置換すると、上記のキャプチャグループで式を再構築する必要があります。ここにあなたのCCLOGを挿入する場所です。これはかなり粗であり、唯一の迅速およびVisual Studioでコードをリファクタリングなどの汚いものを使用する必要があることを

$1$2$3::$4($5)\n{CCLOG("ERROR OCCURED"); 

注意。コンストラクタの初期化リスト、throw、const、noexceptなどの他のケースは処理しませんが、同じ概念を使用してそれを処理する式を記述することができます。

+0

うわー、良い答えをありがとう。 正規表現についてもっと深く理解することができます:) –

+0

ステップバイステップのソリューションありがとう –

+1

@ jong-hyunYeoこの問題を解決した場合は、忘れないでください。 –