C# 使用正则表达式(.NET)查找unicode数字

C# 使用正则表达式(.NET)查找unicode数字,c#,.net,unicode,C#,.net,Unicode,我试图从字符串中的任何数字系统中查找数字。我发现.NET正则表达式语言支持查找,所以我想我可以用它来捕获我的数字(此时我可以合理地预期我正在读取的字符串来自UTF-8编码的文件) 问题是我似乎无法正确识别所有数字。这里是我试图识别一些数字的地方,但有些数字没有被识别为unicode数字(在.NET 4.6.2版本地运行带有相同代码的控制台应用程序时会得到相同的结果)。我从unicode数字类别列表中选取了小提琴中的每个测试数字 鉴于此,似乎.NET正则表达式语言无法将标准中的所有unicode数

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

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

鉴于此,似乎.NET正则表达式语言无法将标准中的所有unicode数字都识别为数字。这是正确的吗?它似乎在大多数情况下都是正确的,所以我可能仍然可以在我正在做的事情中使用它,但我想知道我是否做错了什么,或者Microsoft是否有一个声明我找不到与此问题相关的内容

编辑:根据评论者的请求,以下是来自fiddle的代码:


string[]numbers=新字符串[]{“1”、“¼”和㆓", "⑱", "២", "꘩", "꤁", "〺", "፷", " 发生这种情况的原因是.NET中的字符串是UTF-16编码的

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

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


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

请将代码和数据放在非外部站点上。