带花括号的String.Format
我们的低级日志记录库必须处理发送给它的各种日志消息。
这些消息中的一些包括大括号(作为文本的一部分),一些包含参数要使用String.Format格式化为字符串的一部分
例如,该字符串可以是Logger类的输入:
“参数:{主机名}值:{0}”使用格式化程序发送的正确变量。
为了正确地做到这一点,我必须摆脱不属于格式化的大括号(通过将它们加倍)。
我想用Regex做这件事,但是这并不像看起来那么简单,因为我不知道如何将这些字符串匹配在花括号(String.Format不用于格式化目的)中。
另一个问题是Logger类应该尽可能提高性能,开始处理正则表达式,因为其操作的一部分可能会影响性能。
有没有适当的和已知的最佳做法呢?
只用一个正则表达式来做:
string input = "Parameter: {Hostname} Value: {0}";
input = Regex.Replace(input, @"{([^[0-9]+)}", @"{{$1}}");
Console.WriteLine(input);
输出:
参数:{{Hostname}}值:{0}
这当然只有在没有包含数字的参数的情况下才有效,但仍然应该使用{{ }}
进行转义
我认为你应该看看你的记录器界面。 比较Console.WriteLine
工作原理:
Console.WriteLine(String)
输出给定的字符串,没有格式,没有什么特别的{和}。 Console.WriteLine(String, Object[])
使用格式化输出。 {和}是呼叫者必须转到{{和}}的特殊字符 我认为这是有缺陷的设计必须区分代码中不同的花括号出现以找出其意义。 将{应该在输出中出现的负担转化为{{。
我会将所有花括号加倍,然后我会寻找那些用{{d+}}
这样的正则表达式替换它们,以便它们恢复到原始格式 - {{0}} => {0} -在你的字符串中。
所以对于每条线我都会这样做
string s = input.Replace("{", "{{").Replace("}", "}}");
return Regex.Replace(s, @"{{(?<val>d+)}}",
m => { return "{" + m.Groups["val"] + "}"; }));
所以这是对原始问题的技术答案,但@Anders Abel是完全正确的。 这将是值得再次考虑设计...
链接地址: http://www.djcxy.com/p/51477.html