Javascript unicode字符串,中文字符但没有标点符号

res*_*sle 14 javascript regex string unicode

我试图使用javascript废弃unicode字符串.所述字符串可以计算混合字符.例:???????????????????

最终,字符串可能包含 - 中文字符 - 中文标点符号 - ANSI字符和标点符号

我只需留下汉字.任何提示?

Bre*_*mir 27

您可以在http://www.unicode.org/reports/tr38/#BlockListinghttp://www.unicode.org/charts/上查看相关的块.

如果您要排除兼容性字符(不应再使用的字符),以及笔画,部首和封闭的CJK字母和月份,则应覆盖以下内容(之后我添加了单独的JavaScript等效表达式):

  • CJK统一表意文字(4E00-9FCC) [\u4E00-\u9FCC]
  • 中日韩统一表意文字扩展A(3400-4DB5) [\u3400-\u4DB5]
  • CJK统一表意文字扩展B(20000-2A6D6) [\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6]
  • 中日韩统一表意文字扩展C(2A700-2B734) \ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34]
  • 中日韩统一表意文字扩展D(2B840-2B81D) \ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1d]
  • CJK兼容性表意文字(F900-FA6D/FA70-FAD9)中的12个字符,但实际上是CJK统一表意文字 [\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统一表意文字扩展BD是这样的例子.星界字符,这些扩展的范围更复杂,因为它们必须使用UTF-16系统(如JavaScript)中的代理对进行编码.代理对由高代理和低代理组成,它们本身都不是有效的,但是当它们连接在一起形成一个实际的单个字符,尽管它们的字符串长度是2).

虽然替换目的可能更容易将其表示为非中文字符(用空字符串替换它们),但我提供了中文字符的表达式,以便在需要时更容易跟踪添加或删除块.

2017年9月更新

从ES6开始,可以通过使用"u"标志以及带有括号的新转义序列内部的代码点来表达正则表达式而不诉诸代理,例如,/^[\u{20000}-\u{2A6D6}]*$/u对于"CJK统一表意文字扩展B".

请注意,Unicode也已经发展到包括"CJK统一表意文字扩展E"([\u{2B820}-\u{2CEAF}])和"CJK统一表意文字扩展F"([\u{2CEB0}-\u{2EBEF}]).

对于ES2018,似乎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
Run Code Online (Sandbox Code Playgroud)

由于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):

/^(\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}|(?<CJKFalseCompatibilityUnifieds>[\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]))+$/u

因为它看起来像http://unicode.org/reports/tr44/#Unified_Ideograph一样,"Unified_Ideograph"属性(别名"UIdeo")涵盖了我们所有统一的表意文字,并且不包括符号/标点和兼容性字符,如果你不这样做需要选择以上内容,以下可能是您所需要的:

/^\p{Unified_Ideograph=yes}*$/u

或者简写:

/^\p{UIdeo=y}*$/u

  • 问题:0x20000-0x2A6D6 范围(CJK 扩展 B)如何映射到该 Javascript 正则表达式,`[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6]`? (2认同)

jdu*_*ing 12

Chrome 64、Firefox 78、Safari 11.1 和 Edge 79 开始,测试字符串是否为中文字符的最简单的正则表达式是/\p{Script=Han}/u. 的\p{}指定一个的Unicode属性逃逸,则Script=Han表达式匹配,其任何字符script属性是Han(中国),以及u 标志使得能够在正则表达式的Unicode的使用特征,如这些属性逃逸。

所以你可以像这样过滤掉字符串中的中文字符:

console.log(
    "hello! 42 ???????????????????"
        .split("")
        .filter(char => /\p{Script=Han}/u.test(char))
        .join("")
);
Run Code Online (Sandbox Code Playgroud)

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