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