soc*_*soc 6 regex language-agnostic string unicode character-properties
UTS#18中描述了各种级别的Unicode正则表达式支持.
有没有办法对每个需求进行一些测试,因此可以将测试移植到相关语言,运行它们并收集结果?
其他Unicode文档是否也有支持级别的概念,例如String实现/库?
为了记录,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中的脚本,例如非官方ConScript注册表中的脚本.)
在最近发布的JDK7之前,Java甚至不支持UTS#18 Level 1,然后只是最低限度.使用Java6或更早版本时,各种小东西都是错误或缺失的.总而言之,Java在JDK中的Unicode支持非常弱:你应该使用ICU4J的UCharacter等级类而不是 OraSun类来进行任何严肃的Unicode工作,否则你会疯狂.真正做到.
但除了那些少数之外,没有其他任何东西可以接近 如果你小心并且不需要做太多的事情,你有时可以在Python或Ruby中跛行:例如,没有排序或搜索,几乎没有Unicode字符属性,甚至没有适当的字边界等.
人们试图在Javascript或PHP中使用Unicode做任何事情都应该在它们开始之前退出.这太痛苦了,因为你无法以任何有用或现实的方式操纵Unicode而无法访问角色属性,也可能无法访问字形.
还存在案例映射和案例折叠,规范化,换行和整理的跨语言Unicode问题,所有这些问题在不同语言之间都有所不同.对于Unicode工作,您需要访问大多数(如果不是全部).没有完全属性支持是几乎所有语言的真正问题,因为字符属性是许多算法所依赖的基础.
我在我的Unicode支持Shootout演讲中讨论了大部分内容.
最重要的是,在撰写本文时,如果您既不能使用ICU正则表达式或Perl本身(但不能使用PCRE),或者也许也不能使用regexPython中的Matthew Barnett 库,那么您基本上都不会使用Unicode正则表达式.即使Unicode已有20年历史,目前还没有其他人认真对待正则表达式和/或Unicode.
这对Javascript和PHP等"webbish"语言有严重的影响,因为没有可用的替代品,因此您必须将任何实际工作卸载到不同的服务器端语言,因为Webbish语言无法以任何合理的方式处理Unicode时尚.客户端没有什么可行的,这是一个沉重的负担.
另外,请注意,要通过Java获取ICU正则表达式,需要使用自己的JNI(或使用Android中的JNI)来获取ICU4C:ICU正则表达式没有ICU4J绑定.