Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regex+;Unicode变音组合字符`_Javascript_Regex_Unicode_Diacritics - Fatal编程技术网

Javascript Regex+;Unicode变音组合字符`

Javascript Regex+;Unicode变音组合字符`,javascript,regex,unicode,diacritics,Javascript,Regex,Unicode,Diacritics,我想在非洲约鲁巴语中匹配这个字符'ẹ́'. 通常,这是通过在圆点变音符号下结合一个“é”和一个“\u0323”来实现的。我发现: 'é\u0323'.match(/[é]\u0323/) works but 'ẹ́'.match(/[é]\u0323/) does not work. 我不只是想和e比赛。我想匹配所有的组合。现在,我的解决方案涉及枚举所有组合。像这样:/[193ÀĀÈĒẸE̩Ẹ́É̩Ẹ̀È̩Ẹ̄Ē̩ÍÌĪÓÒŌỌO̩Ọ́Ó̩Ọ̀Ò̩Ọ̄Ō̩ÚÙŪṢS̩ááāēẹe̩ẹ́é̩ẹ̀

我想在非洲约鲁巴语中匹配这个字符'ẹ́'. 通常,这是通过在圆点变音符号下结合一个“é”和一个“\u0323”来实现的。我发现:

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

难道没有一种更短、更好的方法可以做到这一点吗?或者,javascript中unicode发音组合字符的正则表达式匹配不容易做到这一点吗?
谢谢

通常情况下,解决方案是使用JavaScript,但JavaScript本身不支持它们

但是存在添加这种支持的库。有了这个库,您可以使用

\p{L}
:匹配来自任何语言的任何种类的字母

\p{M}
:打算与另一个字符组合的字符(例如重音符号、元音、包围盒等)

因此,您的角色类将如下所示:

[\p{L}\p{M}]+
这将匹配Unicode表中所有可能的字母

如果您想限制它,可以查看脚本并用脚本替换
\p{L}
,它们收集来自特定语言的所有字母。e、 g.
\p{Latin}
用于所有拉丁字母,或
\p{西里尔字母}
用于所有西里尔字母

通常,这是通过在圆点变音符号下结合一个“é”和一个“\u0323”来实现的

然而,这并不是你在这里看到的:

'ẹ́'
这不是U+0065,U+0323,而是U+1EB9,U+0301-组合一个
带有明显的变音符号

通常的解决方案是在进行比较之前将每个字符串标准化(通常为Unicode标准格式C)

我不只是想和e比赛。我想匹配所有的组合

不带变音符号的匹配通常通过标准化为标准形式D并删除所有组合变音符号来完成

不幸的是,JS中不提供规范化,所以如果您需要,您必须拖入代码来实现规范化,这必须包括一个大型Unicode数据表。这样的努力之一就是。为了提取基于Unicode属性的字符,比如组合变音符号,您还需要一个支持Unicode数据库的regexp引擎,例如


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

老实说,我更愿意阅读和维护短字符串,而不是解密和理解可能更聪明的正则表达式的\uxxx部分。使用查找表总是比首先计算字符快。如果正则表达式失败,一种可能的方法是在一个范围内呈现字符,然后进行比较,这是一个很好的观点。也许当前的方法更好。我最终选择了\uxxx部分,因为在vim中编辑它更有意义,因为没有到处都是不同宽度的unicode点和不同的流向,光标位置做了非常奇妙的事情:它的位置基本上变成了一个随机变量。这就解释了这一点。谢谢您B当您有时间时,您可以更新此内容以参考ES6的
。规范化