【问题标题】:Javascript Regex + Unicode Diacritic Combining Characters`Javascript 正则表达式 + Unicode 变音符号组合字符`
【发布时间】:2013-06-28 05:20:46
【问题描述】:

我想匹配非洲约鲁巴语“ẹ́”中的这个字符。通常这是通过在点变音符号下将 'é' 与 '\u0323' 组合而成。我发现:

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

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

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

【问题讨论】:

  • 如果我不得不说实话,我宁愿阅读和维护那个短字符串,也不愿解密和理解可能更聪明的正则表达式的 \uxxxx 部分。使用查找表总是比先计算 char 快。如果正则表达式失败,一种可能的方法是在跨度中呈现字符,然后比较
  • 这很好。也许现在的方式更好。
  • 我最终选择了 \uxxxx 部分,因为在 vim 中编辑它更有意义,因为当没有不同宽度的 unicode 点随处可见不同的流动方向时,光标位置会做一些非常棒的事情:它的位置基本上变成了一个随机变量。

标签: javascript regex unicode diacritics


【解决方案1】:

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

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

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

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

所以你的角色类应该是这样的:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    'ẹ́'
    

    这不是 U+0065,U+0323 而是 U+1EB9,U+0301 - 将 与尖锐的变音符号组合在一起。

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

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

    没有变音符号的匹配通常是通过规范化到范式 D 并删除所有组合的变音字符来完成的。

    不幸的是,规范化在 JS 中不可用,所以如果你想要它,你必须拖入代码才能做到这一点,这必须包括一个大的 Unicode 数据表。一种这样的努力是unorm。要根据 Unicode 前置操作(例如组合变音符号)提取字符,您还需要一个支持 Unicode 数据库的正则表达式引擎,例如 XRegExp Unicode Categories

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

    【讨论】:

    • 这就解释了。谢谢
    • bobince 当你有时间你可以更新这个来参考 ES6 的.normalize
    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2011-08-13
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多