2011-01-19 76 views
0

我有一個像簽名的方法,看起來像這樣:如何使用正則表達式提取字符串等方法的參數?

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

str methodName2(int arg1) 
{ 
} 

我想提取的這隻參數給

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

這裏是我的試過。這絕對不適合我。

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>\(.*?\)).*?\{ 

如果你正在尋找更具體的東西,讓我知道。

編輯添加(?:^|[\r\n])它確保它在文件或行的開始。

+0

在大括號中,從params組中刪除不明確的`?`。這將使它與括號直接大括號硬匹配,並且不會遺漏任何東西。 (儘管它[似乎對我有用](http://regexr.com?2su3h)) – 2011-01-19 23:10:28

0

嘗試改變多行至SINGLELINE

+0

方法聲明,ESP。那些具有許多參數的人可以並且經常跨越多行。 – 2011-01-19 23:15:23

0

我覺得這個單獨的正則表達式解析出每個PARAM,但我不能在此刻進行測試,以便在您自己的風險使用它。您將需要一個全球性的標誌添加到您的Regex對象以匹配多個參數和它也是一個單行正則表達式,所以你需要來匹配您的源每一個人行。

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

閱讀此正則表達式:在該行的開頭(^)匹配任意數量的空格([\s]*),然後字符串「方法名」(methodName),然後任意數量的空格再次([\s]* ),然後一個開括號(\\(),然後啓動名爲「參數」((?<param>)捕獲組,然後匹配任意數量的任何不是逗號或閉括號([^,\\)]*),然後關閉「參數」捕獲組和匹配該組的任何次數()*),然後最終匹配封閉括號,任何字符(懶惰),線的端部(\\).*?$

相關問題