C# Format-从格式字符串查询元数据

C# Format-从格式字符串查询元数据,c#,C#,是否有任何函数可以从格式字符串中查询预期的输入和格式-即作为string.format函数的第一个参数 e、 g.鉴于: "On {0:yyyyy-MM-dd} do {1} and earn {2:C2}" 我想找回一些东西,比如: {"yyyyy-MM-dd", null, "C2"} 我想正则表达式是一种可能性,但是是否有任何预先准备好的东西与String.Format连接到同一逻辑中?这种可能性不是标准的方法。使用正则表达式,很容易: var args = new List<s

是否有任何函数可以从格式字符串中查询预期的输入和格式-即作为
string.format
函数的第一个参数

e、 g.鉴于:

"On {0:yyyyy-MM-dd} do {1} and earn {2:C2}"
我想找回一些东西,比如:

{"yyyyy-MM-dd", null, "C2"}

我想正则表达式是一种可能性,但是是否有任何预先准备好的东西与
String.Format
连接到同一逻辑中?

这种可能性不是标准的方法。使用正则表达式,很容易:

var args = new List<string>();
var str = "On {0:yyyyy-MM-dd} do {1} and earn {2:C2}";
MatchCollection matches = Regex.Matches(str, @"\{\d+[^\{\}]*\}");
foreach (Match match in matches)
{
  string obj = null;
  var split = match.ToString().Split(':');
  if (split.Length == 2) obj = split.Last().Trim(' ', '}', '{');
  args.Add(obj);
}

// Result: args = {"yyyyy-MM-dd", null, "C2"}
var args=new List();
var str=“On{0:yyyy-MM-dd}do{1}和earn{2:C2}”;
MatchCollection matches=Regex.matches(str,@“\{\d+[^\{\}]*\}”);
foreach(匹配中的匹配)
{
字符串obj=null;
var split=match.ToString().split(“:”);
如果(split.Length==2)obj=split.Last().Trim('','}','{');
参数添加(obj);
}
//结果:args={“yyyyy-MM-dd”,null,“C2”}

String.Format本身不解析格式字符串。它最终调用内部方法,该方法仅将格式字符串视为分隔字符串。它不会试图解析它们。格式直接传递给每个参数类型的格式化程序方法。字符串格式化性能对于运行时和应用程序都至关重要

您可以使用正则表达式来解析格式字符串。您需要处理转义大括号({,{})和对齐字符串

正则表达式
{(?\d+)(,(?-?\d+)?(:(?*)?)}
提取索引、对齐和格式段作为命名组。它不显式地处理转义大括号*。它将避免
{{{{}
,但不会
{2,20:N{}

var regex=new System.Text.RegularExpressions.Regex(@"{(?<index>\d+)(,(?<algn>-?\d+?))?(:(?<fmt>.*?))?}");
var matches=regex.Matches("asdf{0:d2} {1:yyyy-MM-dd} {2,-20:N2}");
foreach(Match match in matches)
{
    Console.WriteLine("{0,-5} {1,-15} {2,-15}",
                       match.Groups["index"].Value, 
                       match.Groups["algn"].Value,
                       match.Groups["fmt"].Value);
}
(?…)
语法捕获模式并将其作为命名组公开。
(?\d+)
捕获数字序列并将其作为组
索引公开


*?
中的
指定了非贪婪匹配。通常,正则表达式是贪婪的-它将捕获尽可能多的与模式匹配的字符。通过使用
*?
正则表达式将在下一个模式开始之前捕获尽可能少的字符。这就是为什么可选的
algn
组停止在

您是否已经检查过,特别是它的方法。我不知道这是否能满足您的需要,但这可能是一个开始…?@RB。这仅适用于插值字符串,没有参数就无法显示。不需要检索此方法中的占位符case@Geoff_h你想做什么?String.Format本身不会解析格式字符串。它最终调用内部方法,该方法仅将格式字符串视为分隔字符串。它不会尝试解析它们。格式将直接传递给每个参数类型的
ToString()
method在实践中,我真正需要做的是找出一个给定格式字符串需要多少参数。但这让我想到了一个更普遍的问题,即是否可以提取其他数据格式字符串,我猜是否也可以对齐。但从实现来看,这似乎不太可能。@geoff\h您可以使用正则表达式。im之所以这样编写实现,是因为格式化对性能至关重要。返回完全格式化的结果所用的时间几乎与仅解析格式化字符串所用的时间相同。不过,您应该注意转义大括号({{,{})但该正则表达式不起作用。一个好的正则表达式不需要额外的拆分。该正则表达式也不考虑完整格式的字符串规范,包括对齐和长度规范。之后必须拆分和修剪。它也不会处理对齐
0                d2             
1                yyyy-MM-dd     
2     -20        N2