【发布时间】:2010-10-31 04:52:33
【问题描述】:
我有一个模板字符串和一个来自不同来源但需要匹配以创建新的“填充”字符串的参数数组:
string templateString = GetTemplate(); // e.g. "Mr {0} has a {1}"
string[] dataItems = GetDataItems(); // e.g. ["Jones", "ceiling cat"}
string resultingString = String.Format(templateString, dataItems);
// e.g. "Mr Jones has a ceiling cat"
使用此代码,我假设模板中字符串格式占位符的数量将等于数据项的数量。在我的情况下,这通常是一个公平的假设,但即使假设错误,我也希望能够生成resultingString 而不会失败。我不介意是否有缺失数据的空格。
如果dataItems 中的项目太多,String.Format 方法可以很好地处理它。如果不够,我会得到一个异常。
为了克服这个问题,我会计算占位符的数量,如果不够,我会在 dataItems 数组中添加新项目。
要计算占位符,我目前正在使用的代码是:
private static int CountOccurrences(string haystack)
{
// Loop through all instances of the string "}".
int count = 0;
int i = 0;
while ((i = text.IndexOf("}", i)) != -1)
{
i++;
count++;
}
return count;
}
显然,这是假设没有任何右花括号不用于格式占位符。它也只是感觉错了。 :)
有没有更好的方法来计算字符串中的字符串格式占位符?
许多人正确地指出,我标记为正确的答案在许多情况下都行不通。主要原因是:
- 计算占位符数量的正则表达式不考虑文字大括号 (
{{0}}) - 计算占位符不考虑重复或跳过的占位符(例如
"{0} has a {1} which also has a {1}")
【问题讨论】:
-
虽然没有回答您的问题,但这篇文章可能会提供您可能会觉得有趣的替代方案stackoverflow.com/questions/159017/named-string-formatting-in-c