2009-10-21 37 views
0

我正在嘗試編寫一個正則表達式替換表達式,它將用C#等效替換完全限定的泛型類型名稱。例如,下面的文字:正則表達式可以替換表達式訪問命名組中的多個捕捉嗎?

System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 

將成爲繼C#類型名稱:

System.Collections.Generic.Dictionary<System.String, MyNamespace.MyClass> 

我的正則表達式需要,無論類型參數的數量在那裏工作都在泛型類型。我已經寫了成功抓住了泛型類型和類型參數的表達式爲兩個命名組:

^(?<GenericType>.+)`\d\[(?:\[?(?<GenericTypeParam>\S*),[^\]]+\]?,?)+\]$ 

現在我需要編寫一個生成C#類型名稱替換表達。但是因爲在「GenericTypeParam」組中可以有多個捕獲,我需要能夠在我的替換表達式中引用可變數量的捕獲。下面是替換表達我現在所擁有的:

${GenericType}<${GenericTypeParam}> 

但由於它的名字引用「GenericTypeParam」組,它得到了集團價值,這是該組中的最後一個捕捉值。所以,這個替換表達式的輸出是:

System.Collections.Generic.Dictionary<MyNamespace.MyClass> 

所以我的輸出字符串只包含組中的最後一個捕獲。 有沒有什麼方法可以訪問替換表達式中的其他捕獲?

回答

0

我不認爲你可以用正則表達式替換。我想你必須以編程方式循環比賽,而不是用替換表達式來提取它們。類似於(未經測試!):

List<string> types = new List<string>(); 
Match m; 
for (m = reg.Match(GenericTypeParam); m.Success; m = m.NextMatch()) { 
    types.Add(m.Groups["GenericTypeParam"].Value); 
} 

然後將列表連接到泛型類型參數中。