2009-10-21 6 views
0

J'essaie d'écrire une expression de remplacement d'expression régulière qui remplacera un nom de type générique complet par son équivalent C#. Par exemple, le texte suivant:Une expression régulière Remplacer une expression peut-elle accéder à plusieurs captures dans un groupe nommé?

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]] 

deviendrait le suivant: C# Nom de type:

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

Mon expression régulière doit travailler quel que soit le nombre de paramètres de type il y a dans le type générique. J'ai écrit une expression qui capture avec succès le type générique et ses paramètres de type en deux groupes nommés:

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

Maintenant je dois écrire le remplacer l'expression qui génère le nom du type C#. Mais comme il peut y avoir plus d'une capture dans le groupe "GenericTypeParam", je dois pouvoir faire référence à un nombre variable de captures dans mon expression de remplacement. Voici le remplacer l'expression que j'ai en ce moment:

${GenericType}<${GenericTypeParam}> 

Mais parce qu'il fait référence au groupe « GenericTypeParam » par son nom, il obtient la valeur du groupe, qui est la valeur de la dernière capture dans le groupe. Ainsi, la sortie de cette expression remplacer est:

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

Donc, ma chaîne de sortie ne contient que la dernière capture dans le groupe. Y a-t-il un moyen d'accéder aux autres captures dans l'expression de remplacement?

Répondre

0

Je ne pense pas que vous pouvez le faire avec regex remplacer. Je pense que vous devrez faire une boucle sur les matchs par programme, au lieu de les extraire avec une expression de remplacement. Quelque chose comme (non testé!):

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

puis concaténer la liste dans le type générique param.

Questions connexes