如何使用.NET匹配Unicode字符?

4
我想使用正则表达式匹配Unicode字符。我发现可以使用Unicode类别或块,更准确地说是使用这些Unicode类别支持的命名块
问题是我无法在LINQPAD 4Regex.IsMatch函数中使其工作。例如,尝试匹配一个简单的拉丁字符如下:
Console.WriteLine(Regex.IsMatch("d", @"[\0000-\007F]+"));

会引发以下错误:

参数异常4,解析“[\0000-\007F]+”时- [x-y] 范围倒序。

并使用以下内容:

Console.WriteLine(Regex.IsMatch("d", @"\L{IsBasicLatin}{1}"));

给我的提示是:

解析"\L{IsBasicLatin}{1}" - 未识别的转义序列\L。

在我的真实情况下,我将用IsCyrillic替换IsLatin,但我需要先让它与拉丁文一起工作,以确保它正常运行。

有人能告诉我我错在哪里吗?


1
我认为你使用了错误的转义字符。请查看手册:https://msdn.microsoft.com/zh-cn/library/20bw873z(v=vs.110).aspx。你要找的字符是\p。 - Santhos
所有字符都是Unicode。那么,“问题是什么?” - Tom Blodget
1个回答

6
您正在使用八进制表示法而非十六进制来表示字符,这会创建一个无效的范围(因为首先将\000解析为八进制字符,然后遇到0-\007并导致错误,因为0具有32的十进制代码)。
请使用\x\u表示法,例如:
[\x00-\x7F]+

这将捕获整个ASCII范围,包括控制字符(包括NULL符号)。
第二个问题是,您需要使用\p和脚本名称,例如:
\p{IsBasicLatin}

查看有关 Unicode类别 的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接