如何验证字符串的格式.格式化方法



字符串。格式具有以下方法签名

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中的值,以避免出现异常。

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

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

->因此,我们需要输入我们希望取代的数字或参数

请注意,有很多不同的专业格式模式,每种模式都对特定类型有特定的含义:http://msdn.microsoft.com/en-us/library/system.string.format.aspx

尽管如果传递的格式字符串与参数类型不匹配,String.Format似乎不会抛出,但在这种情况下,格式化程序将变得毫无意义。例如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;
   }
}

只要只传入一个参数,就可以在custFormat中查找{0}。如果你找不到它,它就是无效的。

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

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

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

正则表达式应为:(*{d+}*)+

最新更新