【问题标题】:Find unicode numbers using regex (.NET)使用正则表达式 (.NET) 查找 unicode 数字
【发布时间】:2018-03-26 18:05:23
【问题描述】:

我正在尝试从字符串中的任何数字系统中查找数字。我发现 .NET 正则表达式语言支持查找 unicode character categories,所以我想我可以使用它来捕获我的数字(此时我可以合理地预期我正在读取的字符串来自 UTF-8 编码文件)。

问题是我似乎无法正确识别所有数字。这是a fiddle,我试图在其中识别一些数字,但有些没有被识别为 unicode 数字(相同的结果来自在 .NET 版本 4.6.2 上本地运行具有相同代码的控制台应用程序)。我从一个 unicode 数字类别列表here 中提取了小提琴中的每个测试数字。

鉴于这个小提琴,.NET 正则表达式语言似乎无法将标准中的所有 unicode 数字识别为数字。它是否正确?似乎大多数情况都是正确的,所以我可能仍然可以将它用于我正在做的事情,但我想知道我是否做错了什么,或者如果微软有一个我找不到与这个问题。

编辑:根据评论者的要求,这是小提琴中的代码:

string[] numbers = new string[] { "1", "¼", "㆓", "⑱", "២", "꘩", "꤁", "〺", "፷", "????", "????","????", "????"};
string pattern = @"\p{N}";

foreach (string num in numbers ) {
    Console.WriteLine(string.Format("{0}, {1}", num, Regex.IsMatch(num, pattern))); 
}

还有输出:

1, True
¼, True
㆓, True
⑱, True
២, True
꘩, True
꤁, True
〺, True
፷, True
????, False
????, False
????, False
????, False

【问题讨论】:

标签: c# .net unicode


【解决方案1】:

发生这种情况的原因是 .NET 中的字符串是 UTF-16 编码的。

只有基本多语言平面中的字符可以用等于其代码点的 16 位数字表示。 补充平面(U+10000 到 U+10FFFF)中的任何字符都必须使用代理对表示(它们被编码为一对 16 位数字)。

因此,.NET 会将这些补充平面中的任何字符归类为“代理”,而不是其他类别之一,例如“LetterNumber”、“OtherNumber”等。这会阻止它们匹配正则表达式中的数字类别。

您可以通过调用“Char.GetUnicodeCategory()”来检查 .NET 认为特定字符属于哪个类别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多