在 .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
的原因。所以我猜你有一个 打字错误
我正在编写需要匹配所有 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
的原因。所以我猜你有一个 打字错误