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

Matching extended ASCII characters in .NET Regex

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

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

所以我想

[\x20-\xFF]

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

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

正如我写的 ,您可以使用

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

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

string str = enc.GetString(yourBytes);

然后你就可以使用你写的正则表达式了。请注意,我正在做的是作弊: "ASCII" 信息太少。您需要告诉我您使用的是什么代码页,因为块 80-FF 可以以各种方式映射,具体取决于位置("codepages"),所以并非所有地方 œ 都是 9C,如果您查看该编码器生成的字符串,您将不会得到 œ,但会得到代码为 0x9C 的字符。

如果您想要一个 "prints" 与您拥有的文本相同的 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!");

然后我检查了你的样本:

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

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