2014-01-14 252 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標準模塊中的巨蟒,如果戒指你的鐘)。