2009-10-02 8 views
8

Possible en double:
Parsing formatted string.Inverser de String.Format?

Comment puis-je utiliser un format String.Format et transformer sa production à ses entrées?

Par exemple:

string formatString = "My name is {0}. I have {1} cow(s)."; 

string s = String.Format(formatString, "strager", 2); 

// Call the magic method... 
ICollection<string> parts = String.ReverseFormat(formatString, s); 
// parts now contains "strager" and "2". 

Je sais que je peux utiliser des expressions régulières pour le faire, mais je voudrais utiliser la même chaîne de format donc je ne dois maintenir une ligne de code au lieu de deux.

+0

Dupe: http://stackoverflow.com/qu estions/1410012/parsing-formatted-string –

+0

Mon mauvais; Je ne savais pas que c'était une dupe. Merci Mehrdad, je vote pour fermer maintenant. –

+0

C'est une dupe, mais ma question n'a pas été répondue là. – strager

Répondre

0

Je ne crois pas qu'il y ait quoi que ce soit dans la boîte pour supporter cela, mais en C#, vous pouvez passer un tableau d'objets directement à toute méthode prenant params paramètres de tableau marqués, tels que String.Format(). A part ça, je ne crois pas qu'il y ait un moyen pour que le C# & .NET Framework sache que la chaîne X a été construite à partir de la chaîne de format magique Y et annuler la fusion.

Par conséquent, la seule chose que je peux penser est que vous pouvez formater votre code ainsi:

object[] parts = {"strager", 2}; 
string s = String.Format(formatString, parts); 

// Later on use parts, converting each member .ToString() 
foreach (object p in parts) 
{ 
    Console.WriteLine(p.ToString()); 
} 

Pas idéal, et probablement pas tout à fait ce que vous cherchez, mais je pense que c'est la seule façon .

0

Vous devrez l'implémenter vous-même, car il n'y a rien de prévu pour le faire pour vous. À cette fin, je suggère que vous obteniez le code source réel pour l'implmentation .Net string.format (en fait, le code pertinent est StringBuilder.AppendFormat()). Il est disponible gratuitement, et il utilise une machine d'état pour marcher la corde d'une manière très performante. Vous pouvez imiter ce code pour également parcourir votre chaîne formatée et extraire ces données.

Notez qu'il ne sera pas toujours possible de revenir en arrière. Parfois, la chaîne formatée peut avoir des caractères correspondant aux spécificateurs de format, rendant impossible pour le programme de savoir à quoi ressemblait l'original. En y réfléchissant, vous pourriez avoir plus de chance de faire marcher la chaîne originale pour la transformer en une expression régulière, et ensuite l'utiliser pour faire le match.

Je vous recommande également de renommer votre méthode pour InvertFormat(), parce que ReverseFormat semble que vous attendez cette sortie.

) s (2 woc evah .regarts si iman yM

+0

Cette mise en œuvre est gratuite "bière gratuite" ou "si jamais vous essayez de l'utiliser dans le code réel, je vais poursuivre votre cul hors de cette planète gratuitement" gratuitement? –

+0

bière gratuite, mais puisque vous le modifiez considérablement pour construire quelque chose de nouveau, vous devriez être en sécurité. –