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

标签 javascript regex string unicode

我正在尝试使用 javascript 废弃一个 unicode 字符串。所述字符串可以包含混合字符。示例:我的中文不好。我是意大利人。你知道吗?

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

我只需要留下汉字。有什么提示吗?

最佳答案

您可以在 http://www.unicode.org/reports/tr38/#BlockListing 查看相关 block 或 http://www.unicode.org/charts/ .

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

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

虽然出于替换目的,将其表达为非汉字(用空字符串替换它们)可能更容易,但我提供了汉字的表达方式,以便更容易跟踪以防万一您需要添加 block 或从 block 中删除。

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

作为来自 http://unicode.org/Public/UNIDATA/PropertyAliases.txt 的较短别名和 http://unicode.org/Public/UNIDATA/PropertyValueAliases.txt也可以用于这些 block ,您可以将其缩短为以下内容(如果需要,显然也可以将下划线更改为空格或大小写): /^(\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

关于Javascript unicode字符串,中文字符但没有标点符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21109011/

相关文章:

javascript - 粘性标题 Logo 悬停

swift - 如何从开头和结尾包含 # 且末尾不包含空格的字符串中获取主题标签?

python - 匹配新行

Java 正则表达式 : Trying to convert oracle || to CONCAT()

c - Linux,field_buffer不提供UTF-8字符串

javascript - 为什么这个语义用户界面搜索代码片段只显示七个项目?

javascript - ReactJS 导航到新位置并刷新窗口

javascript - 数据加入d3;我一定没有正确理解选择和/或数据键功能

c++ - 最长公共(public)子序列错误打印

c++ - 字符串 argv[] 重定义错误 C++