Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中清除不需要的十六进制字符(带/不带正则表达式)#_C#_Asp.net_.net_Regex_Hex - Fatal编程技术网

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这个答案实际上更准确。也感谢您的贡献。