在.NET Regex中匹配扩展的ASCII字符

时间:2015-03-05 14:44:39

标签: c# regex ascii extended-ascii

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

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

所以我想

  

[\ x20- \ XFF]

应该能够匹配我需要的所有字符。但是,实际上,某些角色可以匹配,而其他角色则不能。例如,如果您使用在线工具http://regexhero.net/tester/进行测试,或者编写一个简单的C#程序,您会发现某些字符如“ç”(xE7)可以匹配,但某些字符如“œ”( x9C)不能。

有谁知道为什么我的正则表达式不起作用?

谢谢,

2 个答案:

答案 0 :(得分:2)

我尝试重现您的错误,并在您的代码中找到没有错误

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!");

然后我检查了你的样品:

 ((int)'ç').ToString("X2"); // <- returns E7, OK
 ((int)'œ').ToString("X2"); // <- returns 153 NOT x9C 

注意,''(x153)实际上 [0x20..0xFF]之外,这就是匹配返回false的原因。所以我猜你有错字

答案 1 :(得分:0)

在我写https://stackoverflow.com/a/18131886/613130时,您可以使用

var enc = Encoding.GetEncoding("ISO-8859-1");

将字节编码为使用相同代码的字符串:

string str = enc.GetString(yourBytes);

然后你可以使用你写的正则表达式。请注意,我正在做的是作弊:“ASCII”信息太少。您需要告诉我您正在使用的代码页,因为块80-FF可以通过各种方式进行映射,具体取决于地点(“代码页”),因此不是œ 9C œ ,如果您查看该编码器生成的字符串,您将无法获得0x9C,但您将获得一个代码为var enc = Encoding.GetEncoding("Windows-1252"); 的字符。

如果您希望C#字符串“打印”与您拥有的文本相同,则需要使用

œ

(它是ISO-8859-1的MS扩展,包含0x9C处的[^\x00-\x19] 字符

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

啊......显然你可以回避这个问题:

{{1}}

(不是0x00-0x19): - )