C# 在c中清除不需要的十六进制字符(带/不带正则表达式)#
我必须以更好的方式清除异常消息中的十六进制字符。目前,它可以手动替换字符,这看起来像是一场灾难:C# 在c中清除不需要的十六进制字符(带/不带正则表达式)#,c#,asp.net,.net,regex,hex,C#,Asp.net,.net,Regex,Hex,我必须以更好的方式清除异常消息中的十六进制字符。目前,它可以手动替换字符,这看起来像是一场灾难: var clearedStr = str.Replace(Convert.ToString((char)0x01), "") .Replace(Convert.ToString((char)0x02), "") .Replace(Convert.ToString((char)0x03),
var clearedStr = str.Replace(Convert.ToString((char)0x01), "")
.Replace(Convert.ToString((char)0x02), "")
.Replace(Convert.ToString((char)0x03), "")
.Replace(Convert.ToString((char)0x04), "")
.Replace(Convert.ToString((char)0x05), "")
.Replace(Convert.ToString((char)0x06), "")
.Replace(Convert.ToString((char)0x07), "")
.Replace(Convert.ToString((char)0x08), "")
.Replace(Convert.ToString((char)0x0B), "")
.Replace(Convert.ToString((char)0x0C), "")
.Replace(Convert.ToString((char)0x0E), "")
.Replace(Convert.ToString((char)0x0F), "")
.Replace(Convert.ToString((char)0x10), "")
.Replace(Convert.ToString((char)0x11), "")
.Replace(Convert.ToString((char)0x12), "")
.Replace(Convert.ToString((char)0x13), "")
.Replace(Convert.ToString((char)0x14), "")
.Replace(Convert.ToString((char)0x15), "")
.Replace(Convert.ToString((char)0x16), "")
.Replace(Convert.ToString((char)0x17), "")
.Replace(Convert.ToString((char)0x18), "")
.Replace(Convert.ToString((char)0x19), "")
.Replace(Convert.ToString((char)0x1a), "")
.Replace(Convert.ToString((char)0x1b), "")
.Replace(Convert.ToString((char)0x1c), "")
.Replace(Convert.ToString((char)0x1d), "")
.Replace(Convert.ToString((char)0x1e), "")
.Replace(Convert.ToString((char)0x84), "")
.Replace(Convert.ToString((char)0x86), "")
.Replace(Convert.ToString((char)0x87), "")
.Replace(Convert.ToString((char)0x88), "")
.Replace(Convert.ToString((char)0x89), "");
例如,带有十六进制字符的消息:
实际上,我编写了一个正则表达式,但它适用于十六进制字符,如0x1e,但不适用于其等效字符:
但我需要找到这些字符,而不是十六进制等效字符:
“,”,“ƒ”、“”、“”、“”、“”、“”、“”、“”、“”、“š”、“ˆ”、“Ķ”、“Š”、“è”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“Œ”、“
相同的字符及其符号:
“RS:,PU1:',NBH:ƒ,US:,ESC:,PU2:',GS:,
SCI:š,HTS:ˆ,HTJ:‰,VTS:Š,PLD:è,PLU:Œ,SUB:,IND:,SSA:†,ESA:‡”
正则表达式是我写的:
而且,我需要涵盖所有这类犯罪,而不是一堆
有时候,一个好的
foreach
是正确的选择。那么:
private static readonly char[] CharsToReplace =
{
'\x02',
'\x03',
'\x04',
'\x05',
'\x06',
'\x07',
'\x08',
'\x0B',
'\x0C',
'\x0E',
'\x0F',
'\x10',
'\x11',
'\x12',
'\x13',
'\x14',
'\x15',
'\x16',
'\x17',
'\x18',
'\x19',
'\x1a',
'\x1b',
'\x1c',
'\x1d',
'\x1e',
'\x84',
'\x86',
'\x87',
'\x88',
'\x89',
};
public static string ReplaceNonPrintables(string stringToProcess)
{
StringBuilder buf = new StringBuilder(stringToProcess.Length);
foreach (var c in stringToProcess)
{
if (!CharsToReplace.Contains(c))
{
buf.Append(c)
}
}
return buf.ToString();
}
在进一步阅读之前,请看一看Ryszard Czech关于如何做到这一点,而不需要任何多余的代码来添加换行符
这可以通过替换字符串中的每个控制字符来实现,幸运的是Regex给出了答案:
var s=“a\nb”+Convert.ToString((char)0x1b)+Convert.ToString((char)0x1e);
Regex.Replace(s,@“\p{C}+”,String.Empty);
@“\p{C}+”
匹配所有控制字符。请注意,这还将匹配新行(\n
),这意味着您的输出将不会有任何新行,如示例中所示。如果要保留换行符,必须首先将字符串拆分为一个数组,然后在每行上替换Regex.Replace
,然后将它们重新组合在一起。大概是这样的:
var lines=s.Split(new[]{Environment.NewLine},StringSplitOptions.None);
var sb=新的StringBuilder();
foreach(行中的var行)
{
sb.AppendLine(Regex.Replace(line,@“\p{C}+”,String.Empty));
}
s=sb.ToString();
这会留下一个尾随的换行符,可以像这样轻松删除:
if(sb[sb.Length-1]=='\n')
移除(sb长度-1,1);
在调用sb.ToString()
之前执行此操作。是一个dotnetfiddle来演示这一点,因为您可以使用\p{C}
来匹配任何控制字符
但您不需要添加大量代码来减去某些可能需要保留的字符,请使用字符类减法:
var output = Regex.Replace(YourTextVariable, @"[\p{C}-[\t\r\n]]+", "");
这将匹配一个或多个不同于制表符、回车符和换行符的控制字符。ASCII编码将删除所有不可打印的字符。我将尝试,thanks@jdweng那不是真的。ASCII包含一组不可打印的字符,我想到换行符(0x9)以及这个。。检查这个正则表达式。[0-9]x[0-9A-Fa-f]。+?这可能会有帮助:哇,当我尝试在线正则表达式测试仪时,它似乎起作用了。我将详细测试它,以便检查您的答案。谢谢。@cansu我添加了一个到dotnetfiddle的链接来演示它的工作原理是的,它看起来异常消息完全没有错误的控制字符。谢谢。谢谢,如果其他想法不能解决问题,这可能是解决方案。缺点是它是O(NxM)(其中N是字符串长度,M是要删除的字符数)。使用
散列集可能会更快,谢谢,这很有帮助。这比我的答案要好得多。我还学到了一些关于Regex的新知识,谢谢@cansu你真的应该接受这个答案而不是我的你是对的@MindSwipe这个答案实际上更准确。也感谢您的贡献。