Analyser chaîne à l'aide de modèle de format?
Si je peux formater une chaîne à l'aide de
string.Format("my {0} template {1} here", 1, 2)
puis-je inverser le processus - je fournir le modèle et remplis à la chaîne .rendements nets arg0, arg1, etc.?
- Qui sonne comme un cas d'utilisation d'une expression régulière, je pense ...
- Je suis curieux de savoir si je peux éviter de regex. Il semble que les deux objets partagent un modèle et tout simplement utiliser qui peuplent et de remplir une chaîne de caractères. Serait tout à fait élégant.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de manière élégante pour inverser la chaîne formatée. Mais vous pouvez essayer si vous voulez une simple fonction.
template = Regex.Replace(template, @"[\\\^\$\.\|\?\*\+\(\)]", m => "\\" + m.Value)
.template = Regex.Replace(template, @"[\\\^\$\.\|\?\*\+\(\)\[\]]", m => "\\" + m.Value);
Chaîne.Le Format n'est pas réversible dans le cas général.
Si vous avez exactement une {0}, il est actaully possible d'écrire du code générique qu'au moins l'extrait de représentation de chaîne de la valeur. Vous avez certainement ne peut pas s'inverser pour produire des objets d'origine.
Échantillons:
Plusieurs arguments:
string.Format("my{0}{1}", "aa", "aaa");
produit "myaaaaa", tring pour inverserstring.ReverseFormat("my{0}{1}", "myaaaaa")
ont à décider de la façon de diviser "aaaaa" partie 2, sans aucune information.Incapacité à inverser pour le type de données
string.Format("{0:yyyy}", DateTime.Now);
résultats en 2011, plus d'informations sur la valeur elle-même perdu.Utiliser des expressions régulières pour analyser les matches de groupe.
Je n'ai pas de VS ouvert, donc je ne peux pas vérifier si j'ai le nom de la méthode à droite, mais vous savez ce que je veux dire. En utilisant paranthesis, le renvoi du résultat du match sera groupes[0] et des groupes[1] contenant vos extraits de matchs.
Une façon de le faire serait d'expressions régulières. Pour votre exemple, vous pourriez faire:
Il ne serait pas difficile d'écrire une méthode d'extension pour faire exactement ce que vous voulez de cette technique.
Juste pour le plaisir, voici ma première naïve tentative. Je n'ai pas testé, mais ça doit être proche.
Cela vous permettra de faire
La méthode est TRÈS naïf et a beaucoup de problèmes, mais il va trouver tout les espaces réservés à l'expression de format, et de trouver le texte correspondant dans la chaîne source. Il vous donnera les valeurs correspondant aux espaces réservés de gauche à droite, sans référence à ordinale, ou n'importe quel format spécifié dans l'espace réservé. Cette fonctionnalité peut être ajoutée.
Un autre problème est que toute spéciale de la regex de caractères dans la chaîne de format sera la cause de la méthode de tomber. Certains de traitement plus de
formatRegex
devrait être fait pour s'échapper tous les caractères spéciaux qui font partie deformatString
.