字符串格式化的反转?

14

可能有重复:
解析格式化的字符串。

我如何使用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".

我知道可以使用正则表达式来做这件事,但我希望使用相同的格式字符串,这样我只需要维护一行代码而不是两行。


1
strager:这是因为没有内置答案。 :) 无论你处于什么模式,都要么将一些东西拼凑在一起(就像我的答案),要么构建一个全新的自定义类来提供功能的两个方面。 - John Rudy
1
你的问题已经得到解答。在通用情况下,没有算法可以完成这项任务。可以将其视为2 + 2 = 4。如果他们给你4和+,你如何推断输入操作数是2和2还是1和3?你无法确定。 - Mehrdad Afshari
@Mehrdad,在我看来,那个例子很差。我可以很容易地使用正则表达式来完成这个任务。我想知道是否有可能不维护两个部分(格式和正则表达式)来完成它。 - strager
不知道为什么这些年都没有人回答。也许当时还不存在这个问题。无论如何,它是这样完成的:字符串格式化 =“我的名字是%s。我有%d头牛。”您可以使用%s表示字符串,使用%d表示整数。 - Neville Nazerane
你可以使用两个正则表达式捕获组轻松实现这一点:https://dev59.com/X3NA5IYBdhLWcg3wk-6A - Alexandru
显示剩余4条评论
3个回答

1

你必须自己实现它,因为没有内置的功能可以为你完成。

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

请注意,有时候无法回溯。有时候,格式化字符串可能会有与格式说明符匹配的字符,这使得程序难以甚至不可能知道原始字符串的样子。思考一下,你可能更容易通过遍历原始字符串将其转换为正则表达式,然后使用它进行匹配。

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

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


2
那个实现是“免费啤酒”免费的,还是“如果你试图在实际代码中使用这个,我会免费起诉你并让你滚出地球”的免费? - Vinko Vrsalovic
免费啤酒,但由于您需要对其进行相当大的修改以构建新的东西,所以您应该是安全的。 - Joel Coehoorn

1

-1

我不相信有任何内置的东西来支持这一点,但在C#中,您可以直接将对象数组传递给任何带params标记的数组参数的方法,例如String.Format()。除此之外,我认为C#和.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());
}

这不是最理想的,也可能不完全符合你的要求,但我认为这是唯一的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接