2011-01-19 38 views
0

私はこのようになります署名のような方法があります:正規表現を使用して文字列のようなメソッドのパラメータを抽出する方法は?

void methodName(str arg1, int arg2, int arg3 = 4) 
{ 
} 

または

私はここで

(str arg1, int arg2, int arg3 = 4) 
(int arg1) 

を与えるために、こののパラメータのみを抽出したい

str methodName2(int arg1) 
{ 
} 

は何をされるI試しました。これは私には決して合わない。

string namePortion = String.Format(@"^.*{0}", "methodName"); 

Regex rex = new Regex(namePortion + @"\s*(?<params>\(.*\)).*\{", RegexOptions.Compiled | RegexOptions.Multiline); 
string parms = ""; 

Match m = rex.Match(sourceCode); 

if (m.Success) 
{ 
    parms = m.Groups["params"].Value; 
} 

これもRegexBuddyでテストしましたが、うまくいくと思われますので、何が間違っているのか分かりません。

答えて

0

を単一行ためにマルチラインを変更しよう:

(?:^|[\r\n])[\w\s]*(?<params>\(.*?\)) 

だけでプロトタイプをつかむ(および区切り文字としてブレースを使用)するには:

(?:^|[\r\n])[\w\s]*(?<params>\(.*?\)).*?\{ 

もっと具体的なものをお探しの場合は、お知らせください。

EDIT(?:^|[\r\n])が追加され、ファイルまたは行の先頭に追加されます。

+0

中かっこ1では、ungreedy '?'をparamsグループの内側から削除します。これにより、括弧 - 即時中括弧に厳密に一致させ、何も残さないようにします。 (それは[私にとってはうまくいくようですが](http://regexr.com?2su3h)) –

0

あなたは非常に広いつもりなら、次はあなたのために働く必要があり

+0

メソッド宣言、多くのパラメータを持つものは、複数の行にまたがることがあります。 –

0

私はこの正規表現を個々に解析すると思いますが、現時点ではテストできないため、自己責任で使用してください。 Regexオブジェクトにグローバルフラグを追加する必要があります。このフラグは複数のパラメータとその1行の正規表現と一致するため、ソース内の各行と照合する必要があります。

この正規表現を読む

String regex = "^[\s]*methodName[\s]*\\((?<param>[^,\\)]*)*\\).*?$";

:ライン(^)の初めに再びその後、任意の数のスペース([\s]*)、文字列リテラル「methodNameの」(methodName)、任意の数のスペースにマッチ([\s]* )、次に開いたかっこ(\\()、「param」((?<param>)というキャプチャグループを開始して、コンマや閉じ括弧以外の任意の数のものをマッチさせてから([^,\\)]*)、「param」キャプチャを閉じますそのグループを任意の回数だけ()*)マッチさせ、最後に閉じ括弧、任意の文字(遅延)、および行末()をマッチさせます)

関連する問題