Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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# 在.NET正则表达式中匹配扩展ASCII字符_C#_Regex_Ascii_Extended Ascii - Fatal编程技术网

C# 在.NET正则表达式中匹配扩展ASCII字符

C# 在.NET正则表达式中匹配扩展ASCII字符,c#,regex,ascii,extended-ascii,C#,Regex,Ascii,Extended Ascii,我正在编写一个.NET正则表达式,它需要匹配除控制字符外的所有ASCII字符和扩展ASCII字符 为此,我查阅了ASCII表,似乎所有这些字符的ASCII编码都是x20到xFF 所以我想 [\x20-\xFF] 应该能够匹配我需要的所有字符。然而,在现实中,有些角色可以匹配,而另一些角色则无法匹配。例如,如果您使用在线工具进行测试,或者编写一个简单的C#程序,您会发现一些字符(如“ç”(xE7)可以匹配,但一些字符(如“œ”(x9C)无法匹配 有人知道为什么正则表达式不起作用吗?正如我所写的,您

我正在编写一个.NET正则表达式,它需要匹配除控制字符外的所有ASCII字符和扩展ASCII字符

为此,我查阅了ASCII表,似乎所有这些字符的ASCII编码都是x20到xFF

所以我想

[\x20-\xFF]

应该能够匹配我需要的所有字符。然而,在现实中,有些角色可以匹配,而另一些角色则无法匹配。例如,如果您使用在线工具进行测试,或者编写一个简单的C#程序,您会发现一些字符(如“ç”(xE7)可以匹配,但一些字符(如“œ”(x9C)无法匹配

有人知道为什么正则表达式不起作用吗?

正如我所写的,您可以使用

var enc = Encoding.GetEncoding("ISO-8859-1");
要将字节编码为使用相同代码的字符串,请执行以下操作:

string str = enc.GetString(yourBytes);
然后你可以使用你写的正则表达式。请注意,我所做的是一个欺骗:“ASCII”是太少的信息。您需要告诉我您使用的是什么代码页,因为块80-FF可以以各种方式映射,具体取决于位置(“代码页”),因此并非所有的
œ
都是
9C
,如果您查看该编码器生成的字符串,就不会得到
œ
,但是您将得到一个代码为
0x9C
的字符

如果您想要一个与文本“打印”相同的C#字符串,则需要使用

var enc = Encoding.GetEncoding("Windows-1252");
(它是ISO-8859-1的MS扩展,包括
0x9C
处的
œ
字符)

但请注意,在这种情况下,您将无法使用如此简单的正则表达式,因为您的80-FF代码将映射到0000-FFFF unicode字符周围

啊。。。很明显,你可以通过以下方式避开这个问题:

[^\x00-\x19]
(不是0x00-0x19):-)

我试图重现您的错误,但没有发现您的代码有任何错误:

String pattern = @"[\x20-\xFF]";

// All ANSII 
for (Char ch = ' '; ch <= 255; ++ch)
  if (!Regex.IsMatch(ch.ToString(), pattern)) 
    Console.Write("Failed!");

// All non-ANSII
for (Char ch = (Char)256; ch < Char.MaxValue; ++ch)
  if (Regex.IsMatch(ch.ToString(), pattern)) 
    Console.Write("Failed!");
String模式=@“[\x20-\xFF]”;
//全安西

对于(Char ch='';ch,我已从问句中复制了您的
œ
符号,并通过
(int)“œ
检查它,它显示了超出范围的
339(0x153)
。“扩展ASCII”是上个世纪的一个错误,对代码页灾难负责。.NET使用Unicode。您必须重新创建灾难。非常感谢。我意识到.NET正则表达式中的数值是Unicode编码值,而不是扩展ascii。在Unicode中,œ是x153,在扩展ascii中是x9C。
 ((int)'ç').ToString("X2"); // <- returns E7, OK
 ((int)'œ').ToString("X2"); // <- returns 153 NOT x9C