regex Javascript unicode字符串,中文字符但无标点符号

pbossiut  于 2023-03-24  发布在  Java
关注(0)|答案(5)|浏览(189)

我正在尝试使用javascript废弃一个unicode字符串。该字符串可能包含混合字符。例如:我的中文不好。我是意大利人。你知道吗?
最终,字符串可以包含-中文字符-中文标点- ANSI字符和标点
我只需要留下汉字。有什么提示吗?

7cjasjjr

7cjasjjr1#

您可以在http://www.unicode.org/reports/tr38/#BlockListing或http://www.unicode.org/charts/上查看相关块。
如果你不包括兼容性字符(那些不应该再使用的字符),以及笔画、偏旁部首、CJK字母和月份,下面的内容应该涵盖了它(我在后面添加了单独的JavaScript等效表达式):

  • 中日韩统一表意文字(4 E00 - 9 FCC)[\u4E00-\u9FCC]
  • 中日韩统一表意文字扩展区甲(3400- 4DB 5)[\u3400-\u4DB5]
  • 中日韩统一表意文字扩展B(20000- 2A 6D 6)[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6]
  • 中日韩统一表意文字扩展区C(2A 700 - 2B 734)\ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34]
  • 中日韩统一表意文字扩展区D(2B 840 - 2B 81 D)\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1d]
  • 中日韩兼容表意文字(F900-FA 6D/FA 70-FAD 9)中的12个字符,但实际上是中日韩统一表意文字[\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]

...所以,抓取汉字的正则表达式是:
/[\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d]/
事实上由于许多CJK(中-日-韩)字符,Unicode扩展到处理“基本多语言平面”之外的更多字符(称为“星体”字符),并且由于CJK统一表意文字扩展B-D是这种星体字符的示例,这些扩展具有更复杂的范围,因为它们必须使用UTF-16系统(如JavaScript)中的代理对来编码。代理项对由一个高代理项和一个低代理项组成,这两个代理项本身都是无效的,但当它们连接在一起时,尽管它们的字符串长度为2,但它们形成了一个实际的单个字符。
虽然出于替换的目的,将其表示为非中文字符(用空字符串替换它们)可能更容易,但我提供了中文字符的表达式,以便在需要添加或删除块时更容易跟踪。

2017年9月更新

从ES6开始,可以通过使用“u”标志沿着带有括号的新转义序列内的代码点来表达正则表达式,而无需诉诸代理,例如,“CJK Unified Ideographs Extension B”的/^[\u{20000}-\u{2A6D6}]*$/u
请注意,Unicode也已发展到包括“CJK Unified Ideographs Extension E”([\u{2B820}-\u{2CEAF}])和“CJK Unified Ideographs Extension F”([\u{2CEB0}-\u{2EBEF}])。
对于ES 2018,Unicode属性转义似乎能够进一步简化事情。根据http://2ality.com/2017/07/regexp-unicode-property-escapes.html,它看起来将能够做到:

/^(\p{Block=CJK Unified Ideographs}|\p{Block=CJK Unified Ideographs Extension A}|\p{Block=CJK Unified Ideographs Extension B}|\p{Block=CJK Unified Ideographs Extension C}|\p{Block=CJK Unified Ideographs Extension D}|\p{Block=CJK Unified Ideographs Extension E}|\p{Block=CJK Unified Ideographs Extension F}|[\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29])+$/u

由于http://unicode.org/Public/UNIDATA/PropertyAliases.txthttp://unicode.org/Public/UNIDATA/PropertyValueAliases.txt中较短的别名也可以用于这些块,您可以将其缩短为以下内容(如果需要,还可以将下划线更改为空格或大小写):/^(\p{Blk=CJK}|\p{Blk=CJK_Ext_A}|\p{Blk=CJK_Ext_B}|\p{Blk=CJK_Ext_C}|\p{Blk=CJK_Ext_D}|\p{Blk=CJK_Ext_E}|\p{Blk=CJK_Ext_F}|[\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29])+$/u
如果我们想提高可读性,可以使用命名捕获组来记录错误标记的兼容性字符(参见http://2ality.com/2017/05/regexp-named-capture-groups.html):
x1米11米1x
根据www.example.com的说法http://unicode.org/reports/tr44/#Unified_Ideograph,“Unified_Ideograph”属性(别名“UIdeo”)涵盖了我们所有的统一表意文字,不包括符号/标点符号和兼容字符,如果您不需要从上述内容中进行选择,以下内容可能是您所需要的全部内容:
/^\p{Unified_Ideograph=yes}*$/u
或者用速记法:
/^\p{UIdeo=y}*$/u

s5a0g9ez

s5a0g9ez2#

Chrome 64, Firefox 78, Safari 11.1, and Edge 79开始,测试字符串是否为中文字符的最简单正则表达式是/\p{Script=Han}/u\p{}指定Unicode property escapeScript=Han表达式匹配script属性为Han(中文)的任何字符,uflag允许在正则表达式中使用Unicode功能,例如这些属性转义。
所以你可以像这样从一个字符串中过滤出所有的非中文字符:

console.log(
    "hello! 42 我的中文不好。我是意大利人。你知道吗?"
        .split("")
        .filter(char => /\p{Script=Han}/u.test(char))
        .join("")
);

Script属性名也可以缩写,如/\p{sc=Han}/u

wtzytmuj

wtzytmuj3#

没有捷径可走,你必须用你想要保留的字符类或者你想要删除的字符类构造一个表达式,然后处理它。
Unicode协会为标准定义的各种范围提供了代码表(index)(类似于this PDF of CJK Symbols and Punctuation)。由于它们经常具有长串连续的代码点,因此您可以相对容易地将它们放在字符类中。

zed5wv10

zed5wv104#

一个复制和粘贴的解决方案。使用ES6的unicode标志。所有当前的扩展,直到扩展F,以及Ideographs。

const character_xp = new RegExp(String.raw`
    [\u{FA0E}\u{FA0F}\u{FA11}\u{FA13}\u{FA14}\u{FA1F}\u{FA21}\u{FA23}\u{FA24}\u{FA27}-\u{FA29}]
    |[\u{4E00}-\u{9FCC}]
    |[\u{3400}-\u{4DB5}]
    |[\u{20000}-\u{2A6D6}]
    |[\u{2A700}-\u{2B734}]
    |[\u{2B740}-\u{2B81D}]
    |[\u{2B820}-\u{2CEAF}]
    |[\u{2CEB0}-\u{2EBEF}]
  `.replace(/\s+/g, ''), "u")
dsf9zpds

dsf9zpds5#

你可以使用unicode-data模块而不是发明自己的解决方案(准确地说,是由它生成的模块之一),它本质上是UnicodeData.txt database的javascript接口(类似于python中的unicodedata标准模块,如果你想起来的话)。

相关问题