在使用String.Format格式化C#中的字符串之前,我想知道该字符串接受了多少个参数?
例如。如果字符串是“{0}与{1}不同”,我想知道该字符串接受两个参数 例如。如果字符串是“{0}与{1}和{2}不同”,则该字符串接受3个参数
如何有效地找到这个?
答案 0 :(得分:6)
String.Format
接收带有format
值的字符串参数和params object[]
数组,它可以处理任意大值项。
对于每个object
值,将调用.ToString()
方法来解析该格式模式
编辑:似乎我误解了您的问题。如果您想知道格式需要多少个参数,可以使用正则表达式来发现:
string pattern = "{0} {1:00} {{2}}, Failure: {0}{int count = Regex.Matches(Regex.Replace(pattern,
@"(\{{2}|\}{2})", ""), // removes escaped curly brackets
@"\{(\d+)(?:\:?[^}]*)\}").OfType<Match>()
.SelectMany(match => match.Groups.OfType<Group>().Skip(1))
.Select(index => Int32.Parse(index.Value))
.Max() + 1; // returns 2
}, Failure: {0} ({0})";
int count = Regex.Matches(Regex.Replace(pattern,
@"(\{{2}|\}{2})", ""), // removes escaped curly brackets
@"\{\d+(?:\:?[^}]*)\}").Count; // returns 6
正如评论中提到的Benjamin,您可能需要了解不同引用的数量。如果您不使用Linq,请转到:
int count2 =
Regex.Matches(
pattern.Replace("{{", string.Empty),
@"\{(\d+)")
.OfType<Match>()
.Select(match => int.Parse(match.Groups[1].Value))
.Union(Enumerable.Repeat(-1, 1))
.Max() + 1;
这也解决了发现的最后一个问题@ 280Z28。
编辑280Z28:这不会验证输入,但是对于任何有效的输入都会给出正确的答案:
{{1}}
答案 1 :(得分:1)
您必须解析字符串并找到{}
之间的最高整数值...然后添加一个。
...或计算{}
的数量。
无论哪种方式,它都很难看。我有兴趣知道为什么你需要能够以编程方式找出这个数字。
修改强>
正如280Z28所述,您必须考虑{}
之间(多个{}
),格式化字符串等之间可能包含的各种特性。
答案 2 :(得分:1)
我依靠ReSharper为我分析这一点,很遗憾Visual Studio没有提供如此简洁的功能。