2014-01-14 107 views
9

我想要使用javascript来取消unicode字符串。所述字符串可以是混合字符。例如:我的中文不好。我是意大利人。你知道吗?Javascript unicode字符串,中文字符,但没有标点符号

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

我只需要离开中国汉字。任何提示?

+0

我来晚了,但这里是合作中文字符范围:'\ u4E00- \ u9FA5',其中包含大约26000个字符,这应该足够日常使用。 – Raptor

回答

13

你可以在http://www.unicode.org/reports/tr38/#BlockListinghttp://www.unicode.org/charts/看到相关的块。

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

  • CJK统一汉字(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)的CJK兼容表意文字(F900-FA6D/FA70-FAD9),但其内\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1d]
  • 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扩展为处理“基础多语言平面”(称为“星体”字符)之外的更多字符,并且由于中日韩统一表意文字扩展BD是这样的星体字符,那些扩展的范围更加复杂,因为它们必须使用UTF-16系统(如JavaScript)中的代理对进行编码。一个代理对由高代理和低代理组成,两者都不是单独有效的,但是当它们连接在一起形成一个实际的单个字符时,尽管它们的字符串长度是2)。

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

更新2017年9月

由于ES6的,一个可以表达的正则表达式,而不使用“U”标志用括号,例如新的转义序列内的代码点一起诉诸代理人, “CJK Unified Ideographs Extension B”的/^[\u{20000}-\u{2A6D6}]*$/u

请注意,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.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

+0

谢谢。我使用40多万本中文电子书进行了自动化测试,91%的情况下这个/ [^ \ u4E00- \ u9FA5]/ig似乎足以在不使用任何非标点符号的情况下删除文本。看起来像其他范围的大多数字符很少被使用。 – resle

+0

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

+0

这很有用:http://apps.timwhitlock.info/js/regex –

2

没有捷径。你必须用你想要保留的字符类或要删除的字符类构造一个表达式,然后处理它。

Unicode联盟为标准定义的各种范围提供代码图(index)(如this PDF of CJK Symbols and Punctuation)。由于它们经常有很长的连续代码点,所以可以相对容易地将它们放入字符类中。

+1

它看起来像'CJK_UNIFIED_IDEOGRAPHS'块是有趣的。例如,普通字符['我'](http://www.fileformat.info/info/unicode/char/6211/index.htm)属于此块,而标点符号['。。](http:// www.fileformat.info/info/unicode/char/3002/index.htm)属于'CJK_SYMBOLS_AND_PUNCTUATION'块 – twj

0

而不是发明了自己的解决方案,你大概可以使用unicode-data模块(由它产生的模块之一,要准确),这基本上是一个JavaScript接口UnicodeData.txt database(类似于unicodedata标准模块中的巨蟒,如果戒指你的钟)。