使用REGEX(.NET)查找Unicode号码



我正在尝试从字符串中的任何数字系统中找到数字。我发现.NET正则表达语言支持查找Unicode字符类别,因此我认为我可以使用它来捕获我的数字(此刻,我可以合理地期望我正在阅读的字符串来自UTF-8编码文件(。

问题是我似乎无法正确识别所有数字。这是一个小提琴,我试图识别一些数字,但有些数字未识别为Unicode编号(相同的结果来自运行具有.NET版本4.6.2本地代码的控制台应用程序(。我从这里的一个Unicode编号类别列表中的一个小提琴中的每个测试数字列出了。

鉴于这个小提琴,似乎.NET REGEX语言无法识别标准中的所有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

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

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

因此,.NET将将这些补充平面中的任何字符分类为"替代",而不是其他类别之一,例如" Letternumber"," elethernumber"等。正则

中的数字类别

您可以通过调用" char.getunicodecategory(("。

最新更新