C#正则表达式,模式中带有\ Uxxxxxxxx字符

Ben*_*iel 6 c# regex unicode astral-plane

Regex.IsMatch( "foo", "[\U00010000-\U0010FFFF]" ) 
Run Code Online (Sandbox Code Playgroud)

抛出:System.ArgumentException:以相反的顺序解析"[ - ]" - [xy]范围.

查看\ U00010000和\ U0​​010FFF的十六进制值,我得到:第一个字符为0xd800 0xdc00,第二个字符为0xdbff 0xdfff.

所以我想我确实有一个问题.为什么用\ U形成的Unicode字符在字符串中分成两个字符?

Jon*_*eet 10

他们是代理人对.查看值 - 它们超过65535. char只有16位值.你如何只用16位表达65536?

不幸的是,从文档中不清楚.NET中的正则表达式引擎如何(或是否)处理不在基本多语言平面中的字符.(正则表达式文档中的\ uxxxx模式仅涵盖0-65535,就像\ uxxxx作为C#转义序列一样.)

你真正的正则表达式是否更大,或者你真的只是想看看那里是否有任何非BMP字符?

  • 自发布以来已有 12 年了,但这仍然不受支持。 (4认同)

And*_*y K 5

为了使用 .Net 正则表达式引擎解决此类问题,我使用了以下技巧: "[\U010000-\U10FFFF]"替换为[\uD800-\uDBFF][\uDC00-\uDFFF] 背后的想法是,由于 .Net 正则表达式处理代码单元而不是代码点,因此我们将代理范围作为常规字符提供给它。也可以通过边缘操作来指定更窄的范围,例如:[\U011DEF-\U013E07](?:\uD807[\uDDEF-\uDFFF])|(?:[\uD808-\uD80E][\uDC00-\uDFFF])|(?:\uD80F[\uDC00-uDE07])

它更难阅读和操作,也不是那么灵活,但仍然适合作为解决方法。