String.Format的反转?

时间:2009-10-02 20:59:15

标签: c# .net string

  

可能重复:
  Parsing formatted string.

如何使用String.Format格式并将其输出转换为输入?

例如:

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".

我知道我可以使用正则表达式来执行此操作,但我想使用相同的格式字符串,因此我只需要维护一行代码而不是两行。

3 个答案:

答案 0 :(得分:1)

以下是在C#中尝试使用Scanf等效项的人的一些代码:

http://www.codeproject.com/KB/recipes/csscanf.aspx

答案 1 :(得分:0)

我不相信有任何内置支持这一点,但在C#中,您可以将一组对象直接传递给任何采用params标记数组参数的方法,例如String.Format() 。除此之外,我不相信C#&amp; amp; .NET Framework知道字符串X是从魔术格式字符串Y构建的,并撤消合并。

因此,我唯一能想到的就是你可以这样格式化你的代码:

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());
}

不理想,可能不是你想要的,但我认为这是唯一的方法。

答案 2 :(得分:0)

你必须自己实现它,因为没有任何内置的功能可以帮助你。

为此,我建议您获取.Net string.format implmentation的实际源代码(实际上,相关代码位于StringBuilder.AppendFormat())。它是免费提供的,它使用状态机以非常高效的方式遍历字符串。您可以模仿该代码,以便遍历格式化的字符串并提取该数据。

请注意,并不总是可以倒退。有时,格式化的字符串可以包含与格式说明符匹配的字符,这使得程序很难知道原始文件的样子。当我想到它时,你可能会更好地运行原始字符串以将其转换为正则表达式,然后使用它来进行匹配。

我还建议您将方法重命名为InvertFormat(),因为ReverseFormat听起来像您期望的输出:

  

。)s(woc 2 evah .regarts si eman yM