如何检查哪种语言支持Unicode正则表达式中的哪个支持级别?

时间:2011-08-19 18:00:49

标签: regex string language-agnostic unicode character-properties

UTS#18中描述了各种级别的Unicode正则表达式支持。

有没有办法针对每个需求进行一些测试,因此可以将测试移植到相关语言,运行它们并收集结果?

其他Unicode文档是否也有支持级别的概念,例如: G。对于String实现/库?

2 个答案:

答案 0 :(得分:7)

为了记录,ICU4C和Perl都支持UTS#18 Level 1以及几个重要的几个Level 2功能。其中包括\N{...}的命名字符,\X的字形,\p{East_Asian_Width=Full_Width}的完整属性,以及ICU的情况,通过调整\b也可以获得更高级的字默认边界。所有这三个Level-2正则表达式功能都极大地简化了在Unicode上使用正则表达式的功能,如果没有它们,你必须在最好的情况下做一些不愉快的事情,最糟糕的是根本不能这样做。

Perl和ICU4C有些不同,因为Perl支持基于字符串的完整案例折叠,而ICU仅支持简单的基于字符的案例折叠。 Perl还有一些ICU不支持的非Unicode正则表达式扩展,例如正则表达式中的外观和命名组,它们都非常有用。

Perl还允许用户定义/自定义属性和命名字符,这些字符对很多东西很有用,包括私有使用区域(PUA)代码点,因为您现在可以为您想要的任何PUA字符定义自己的名称和属性使用。 (例如,对于计划包含在Unicode中的脚本,例如unofficial ConScript registry中的脚本。)

在最近发布的JDK7之前,Java甚至不支持UTS#18 Level 1,然后只是最低限度。使用Java6或更早版本时,各种小东西都是错误或缺失的。总而言之,Java在JDK中的Unicode支持非常弱:你应该使用ICU4J的UCharacter等类,而不是 OraSun类,对于任何严肃的Unicode工作,或者你会疯了。真正

但是除了这几个之外,没有其他任何东西可以接近。如果你小心并且不需要做太多,你有时会在Python或Ruby中跛行:例如,< / em>没有排序或搜索,几乎没有Unicode字符属性,甚至没有合适的字边界等。

人们试图在Javascript或PHP中使用Unicode做任何事情都应该在它们开始之前退出。这太痛苦了,因为你无法以任何有用或现实的方式操纵Unicode而无法访问角色属性,也可能无法访问字形。

还存在案例映射和案例折叠,规范化,换行和整理的跨语言Unicode问题,所有这些问题在不同语言之间都有所不同。您需要访问大多数(如果不是全部)Unicode工作。没有完全的属性支持是几乎所有语言的真正问题,因为字符属性是许多算法所依赖的基础。

我在Unicode Support Shootout演讲中讨论了大部分内容。

底线

最重要的是,在撰写本文时,如果您既不能使用ICU正则表达式或Perl本身(但不能使用PCRE),或者也可能使用Python中的Matthew Barnett的regex库,那么基本上你就是搞砸了Unicode正则表达式。即使Unicode已有20年历史,目前还没有其他人认真对待正则表达式和/或Unicode。

这对“webbish”语言(如Javascript和PHP)有严重影响,因为没有可用的替代品,因此您必须将任何实际工作卸载到不同的服务器端语言,因为Webbish语言无法处理Unicode以任何合理的方式。客户端没有什么可行的,这是一个沉重的负担。

另外,请注意,要通过Java获取ICU正则表达式,需要使用自己的JNI(或使用Android中的JNI)来获取ICU4C:ICU正则表达式没有ICU4J绑定。

答案 1 :(得分:3)

我认为现有的测试可以验证支持级别 例如,在Perl中,正则表达式中有相当广泛的Unicode支持文档 和语言中的Unicode支持。

示例Perl正则表达式支持级别docs:
http://perldoc.perl.org/perlunicode.html#Unicode-Regular-Expression-Support-Level

Unicode非常复杂,测试用例来自语言编写者。