7

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

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

所以我想

[\x20-\xFF]

应该能够匹配我需要的所有字符。然而,实际上,有些字符可以匹配,而有些则不能。比如你用在线工具http://regexhero.net/tester/测试,或者写一个简单的C#程序,你会发现有些字符比如“ç”(xE7)是可以匹配的,但是有些字符比如因为“–”(x9C)不能。

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

4

2 回答 2

3

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

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。所以我猜你有一个错字

于 2015-03-05T15:07:30.630 回答
0

正如我写的https://stackoverflow.com/a/18131886/613130,您可以使用

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 扩展,包括œ字符 at 0x9C

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

啊......显然你可以通过以下方式避开这个问题:

[^\x00-\x19]

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

于 2015-03-05T15:04:22.987 回答