C# 如何验证string.format方法的格式

C# 如何验证string.format方法的格式,c#,string.format,C#,String.format,Format具有以下方法签名 string.Format(format, params, .., .. , ..); 我想通过自定义格式每次喜欢 string custFormat = "Hi {0} ... {n} "; // I only care about numbers here, and want avoid {abdb} string name = "Foo"; string message = ProcessMessage(custFormat, name); pub

Format具有以下方法签名

string.Format(format, params, .., .. , ..);
我想通过自定义格式每次喜欢

string custFormat = "Hi {0} ... {n} ";   // I only care about numbers here, and want avoid  {abdb}
string name = "Foo";

string message = ProcessMessage(custFormat, name);

public string ProcessMessage(custFormat, name)
{
   return string.Format(custFormat, name);
}

我想在传递到ProcessMessage之前验证custFormat中的值以避免异常。

您应该使用正则表达式进行语法检查,也可以使用一些语义检查


正则表达式应该是:
(*{\d+}*)++

只要只传入一个参数,就可以查找
{0}
的搜索
custFormat
。如果找不到,则无效。

您可以使用try-catch进行验证,如果格式抛出异常,则记录信息并停止处理

try 
{ 
   string.Format(custFormat, params, .., .. , ..);
}
catch(FormatException ex)  
{ 
  throw ex;
}

string message = ProcessMessage(custFormat, name);

让我们考虑一下这个API,如果它存在的话。目标是预先验证格式字符串,以确保
string.format
不会抛出

请注意,不包含有效格式槽的任何字符串都是有效格式字符串-如果您不尝试插入任何替换项

->因此,我们需要传递期望替换的数量或参数

请注意,有大量不同的专业格式模式,每种模式对特定类型都有特定的含义:

虽然如果传递的格式字符串与参数类型不匹配,
String.Format
似乎不会抛出,但在这种情况下,格式化程序将变得毫无意义。e、 g.
String.Format(“{0:0000}”,“foo”)

->因此,只有在传递参数类型的情况下,这样的API才会真正有用

如果我们已经需要传入格式字符串和一个类型数组(至少),那么我们基本上只需要
string.format
的签名,那么为什么不直接使用它并处理异常呢?如果像
String.TryFormat
这样的东西存在,那就太好了,但据我所知,它并不存在

另外,通过一些API进行预验证,然后在
String.Format
中重新验证本身的性能并不理想

我认为最干净的解决方案可能是定义一个包装器:

public static bool TryFormat(string format, out string result, params Object[] args)
{
   try
   {
      result = String.Format(format, args);
      return true;
   }
   catch(FormatException)
   {
      return false;
   }
}

你用什么语言工作?C#?你应该用你正在寻找答案的编程语言来标记这个问题。为什么要避免例外?你可以简单地抓住它。你能发布你的实际代码而不是类似的“示例”代码吗?这将使每个人的生活都更容易去帮助你,而且你可能会得到更好的答案,把重点放在你面临的实际问题上。我也不理解你对尝试/抓住的厌恶。你到底想避免什么呢?这里只有一个arg用于演示。
{}
不是唯一有效的格式模式。有效模式的范围很大。e、 g.
{0:0000}
{0:D}
,等等。很好的一点,我只是用他非常简单的样本来提供一个简单的答案。我想这是有意义的。我现在就试试。谢谢你的帮助,这还不算太近。首先,存在大量不同的有效格式模式(),这只捕获了最简单的模式。其次,它不考虑所有的参数或参数被替换,例如String .Frand(“{ 0 }{ 15 }”,“test”)将通过这个模式,但抛出。