我希望在非洲约鲁巴语“ẹ”中匹配这个角色。通常这是通过在点变音符号下组合'é'和'\ u0323'来实现的。我发现:
'é\u0323'.match(/[é]\u0323/) works but
'ẹ́'.match(/[é]\u0323/) does not work.
我不只是想匹配e。我想匹配所有组合。现在,我的解决方案涉及枚举所有组合。像这样:/[ÁÀĀÉÈĒẸE̩Ẹ́É̩Ẹ̀È̩Ẹ̄Ē̩ÍÌĪÓÒŌỌO̩Ọ́Ó̩Ọ̀Ò̩Ọ̄Ō̩ÚÙŪṢS̩áàāéèēẹe̩ẹ́é̩ẹ̀è̩ẹ̄ē̩íìīóòōọo̩ọ́ó̩ọ̀ò̩ọ̄ō̩úùūṣs̩]/
难道没有更短的,因此更好的方法来做到这一点,或者在unicode diacritic组合字符的javascript中的正则表达式匹配不能轻易地工作吗? 谢谢
答案 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规范化的本机支持,因此如果您可以在服务器上进行通常更容易的处理。