Javascript Regex + Unicode Diacritic组合字符`

时间:2013-06-28 05:20:47

标签: javascript regex unicode diacritics

我希望在非洲约鲁巴语“ẹ”中匹配这个角色。通常这是通过在点变音符号下组合'é'和'\ u0323'来实现的。我发现:

'é\u0323'.match(/[é]\u0323/) works but
'ẹ́'.match(/[é]\u0323/) does not work.

我不只是想匹配e。我想匹配所有组合。现在,我的解决方案涉及枚举所有组合。像这样:/[ÁÀĀÉÈĒẸE̩Ẹ́É̩Ẹ̀È̩Ẹ̄Ē̩ÍÌĪÓÒŌỌO̩Ọ́Ó̩Ọ̀Ò̩Ọ̄Ō̩ÚÙŪṢS̩áàāéèēẹe̩ẹ́é̩ẹ̀è̩ẹ̄ē̩íìīóòōọo̩ọ́ó̩ọ̀ò̩ọ̄ō̩úùūṣs̩]/

难道没有更短的,因此更好的方法来做到这一点,或者在unicode diacritic组合字符的javascript中的正则表达式匹配不能轻易地工作吗? 谢谢

2 个答案:

答案 0 :(得分:5)

通常解决方案是使用Unicode properties and/or scripts,但JavaScript本身不支持它们。

但是存在增加此支持的lib XRegExp。使用此库,您可以使用

\p{L}:匹配任何语言的任何类型的信件。

\p{M}:一个旨在与另一个角色组合的角色(例如重音符号,变音符号,封闭框等)。

所以你的角色类看起来像这样:

[\p{L}\p{M}]+

将匹配Unicode表中的所有可能字母。

如果您想限制它,可以查看Unicode脚本并用脚本替换\p{L},它们会收集某些语言的所有字母。例如所有拉丁字母\p{Latin}或所有西里尔字母\p{Cyrillic}

答案 1 :(得分:3)

  

通常这是通过在点变音符下将'é'与'\ u0323'组合而成的

然而,这不是你在这里所拥有的:

'ẹ́'

那不是U + 0065,U + 0323而是U + 1EB9,U + 0301 - 将与急性变音符号组合在一起。

通常的解决方案是在进行比较之前规范化每个字符串(通常为Unicode Normal Form C)。

  

我不只是想匹配e。我想匹配所有组合

没有变音符号的匹配通常通过归一化到法线形式D并删除所有组合变音字符来完成。

不幸的是,JS中没有规范化,所以如果你需要它,就必须拖入代码才能完成它,这必须包含一个大的Unicode数据表。其中一项努力是unorm。对于基于Unicode特性的拾取字符(如组合变量),您还需要一个支持Unicode数据库的正则表达式引擎,例如XRegExp Unicode Categories

服务器端语言(例如Python,.NET)通常具有对Unicode规范化的本机支持,因此如果您可以在服务器上进行通常更容易的处理。