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