2011-09-29 78 views
3

我寫的影響分析工具,將解析一堆選定文件類型,找到的類和方法在文件中調用(在這種情況下,cs文件)。我設法寫了一個正則表達式,它會查找一行代碼是否是方法調用。正則表達式找到C#類和方法名

Regex re = new Regex(
       @"\b(public|private|internal|protected)\s*" + 
       "(static|virtual|abstract)?\s*[a-zA-Z]*\s[a-zA-Z]+\s*" + 
       "\((([a-zA-Z\[\]\<\>]*\s*[a-zA-Z]*\s*)[,]?\s*)+\)"); 

但是;我無法弄清楚如何從正則表達式中獲取方法名稱。它將一行識別爲Match,但我如何提取實際的方法名稱。任何關於這個的幫助都會很棒。

此外;我不確定這是如何實際完成的,但有沒有其他(最新)的c#文件解析器能夠爲我提供文件中的方法名稱和類名稱列表?

+0

http://stackoverflow.com/questions/906493/regex- named-capturing-groups-in-net – meziantou

+1

'[a-zA-Z]'不會爲C#方法名稱而削減它。例如。 「private voidμäか<בֵּ>(){}」是一個有效的C#方法聲明。 – Jens

+0

謝謝Jens,這個工具不僅適用於我公司內部的外部商業用途,而且我們只用英文編寫代碼,因此它適用於'我們',但謝謝您指出這一點,這是非常有效的一點。 – Joshy

回答

4

你可以把一個表示方法爲group這樣的部分:

(?<method>[a-zA-Z]+) 

然後你就可以像這樣訪問:

Match match = regex.Match(line); 
if (match.Success) 
{ 
    string method = match.Groups["method"].Value; 
} 

然而,你的正則表達式目前有多種匹配方法名稱方面的問題:

  • 它不處理泛型(泛型方法,參數或者返回值)
  • 它不處理與數字標識符或_在
  • 它不處理好與默認訪問修飾符的方法包含的東西看起來像一個方法聲明
  • 它將匹配字符串文字

要獲得方法名了C#文件的,你真正需要的東西它理解C#。需要注意的是羅斯林項目很可能讓這樣的事情很多更容易 - 當第一個預覽現在出來,我們很快就會看到...

+0

感謝您的幫助,我已經修改了正則表達式,按您的輸入,\t \t私人常量字符串IsMethodRegex = @「\ B(公共|民營|內部|保護)\ S *?(靜態|虛擬|抽象)\ S? *([A-ZA-Z \ <\> _1-9] *)\ S(? [A-ZA-Z \ <\> _1-9] +)\ S * \(((([A-ZA-Z \ * \ s * [a-zA-Z_1-9] * \ s *)[,]?\ s *)+)\)「; – Joshy