我有一个包含一些不可打印的ascii字符的字符串,如:
"ABCD\x09\x05\r\n"
我想用十六进制代码编号的ascii字符串表示替换这些字符,所以我得到这样的结果:
"ABCD[09][05][0D][0A]"
这是最好的方法吗?可以使用正则表达式吗?
答案 0 :(得分:24)
模式\p{Cc}
匹配任何控制字符,所以
Regex.Replace(input,
@"\p{Cc}",
a=>string.Format("[{0:X2}]", (byte)a.Value[0])
);
也会替换控制字符。
答案 1 :(得分:8)
string s = "ABCD\x09\x05\r\n";
var replace =
s.Select(c => Char.IsControl(c) ? ((int)c).ToString("X2") : c.ToString())
.Aggregate(new StringBuilder(), (sb, t) => sb.Append(t))
.ToString();
很抱歉,没有编译器方便,但我认为这可以编译并完成工作。
此外,这种类型的字符串遍历两次(一次将每个字符投影到十六进制替换或字符串,然后再次聚合),并且可以通过将投影集中到对{{1}的调用中来避免这种情况但是这个更清楚,除非这对性能至关重要,否则它可能并不重要。
答案 2 :(得分:4)
受到Jason的例子的启发,但有点简单。我不确定哪个表现更好,而且现在没有时间对它进行基准测试,但它应该只需一次通过即可:
string s = "ABCD\x09\x05\r\n";
string replace = String.Concat(s.Select(c => Char.IsControl(c) ?
String.Format("[{0:X2}]", (int)c) :
c.ToString()));
我已经测试了这个功能。