首页 > 解决方案 > JavaScript 中的正则表达式以匹配没有单词边界的书写系统

问题描述

我试图在文本中检测是否存在属于没有单词边界的语言书写系统的字符。根据维基百科,这些书写系统如下(我添加了 ISO 639-2 或 639-3 代码)

Burmese  MY
Chinese ZH
Japanese JA
S'gaw Karen KAR
Khmer KM
Lao LP
ʼPhags-pa PHAG
Pwo Karen PWO
S'gaw Karen KAR
Tai Tham LANA
Thai TH
Tibetan BO

Chinese我使用特定的正则表达式Han编写系统的情况下:

HAN_REGEX = /[\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FD5\uF900-\uFA6D\uFA70-\uFAD9]/;

作为等价于\p{Han}。中文象形文字的另一种解决方案是直接使用

let regexp = /\p{sc=Han}/gu;

因此,假设给定KanjiUnicode 表,JA在文本中检测的字符集范围是这个

KANJI_REGEX = /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/

但是其他书写系统呢?字符集范围是唯一的方法吗?

标签: javascriptregexunicode

解决方案


这不会处理所有情况,因为我似乎无法获得关于如何识别连续脚本的良好参考,但它应该能让你大部分时间到达那里。

let regex = new RegExp(/[\p{Script_Extensions=Mymr}\p{Script_Extensions=Han}\p{Script_Extensions=Hira}\p{Script_Extensions=Kana}\p{Script_Extensions=Bopo}\p{Script=Khmer}\p{Script=Lao}\p{Script_Extensions=Phag}\p{Script=Tai_Tham}\p{Script=Thai}\p{Script=Tibetan}]/u)

Script_Extensions 将包括除基本字符之外的脚本的所有扩展字符,因此您通常最好尽可能使用 Script_Extensions。

  • \p{Script_Extensions=Mymr} 应该匹配缅甸脚本中的任何字符(这是缅甸语、S'gaw Karen 和 Pwo Karen 似乎映射到的字符)
  • \p{Script_Extensions=Han} 应该匹配汉字或汉字字符
  • \p{Script_Extensions=Bopo} 应该匹配 Bopomofo 字符(因为 Hanb 是 Han+Bopo 但 unicode 没有组合脚本,这应该匹配其他汉字)
  • \p{Script_Extensions=Hira} 应该匹配任何平假名字符
  • \p{Script_Extensions=Kana} 应该匹配任何片假名字符
  • \p{Script=Khmer} 应该匹配高棉脚本中的字符
  • \p{Script=Lao} 应该匹配老挝脚本中的字符
  • \p{Script_Extensions=Phag} 应该匹配 'Phags-pa 脚本中的字符
  • \p{Script=Tai_Tham} 应该匹配 Tai Tham 脚本中的字符
  • \p{Script=Thai} 应该匹配泰文中的字符
  • \p{Script=Tibetan} 应该匹配藏文中的字符

并且由于没有设置 unicode 标志就不能使用 unicode 属性转义,因此记住传递 'u' 标志很重要。


推荐阅读