2014-01-14 11 views
9

javascriptを使用してユニコード文字列をスクラップしようとしています。前記文字列は混在文字をカウントすることができる。例: - 漢字 - 中国句読点 - 私は中国語の文字を残しておく必要がありANSI文字と句読点JavaScriptのUnicode文字列、中国語の文字ですが句読記号はありません

我的中文不好。我是意大利人。你知道吗?

最終的には、文字列が が含まれていてもよいです。何かヒント?

+0

私は後半だけど、ここでは共同ですmmonly used中国語の文字列: '\ u4E00- \ u9FA5'は約26000文字で、毎日の使用には十分でなければなりません。 – Raptor

答えて

13

http://www.unicode.org/reports/tr38/#BlockListingまたはhttp://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は "Basic Multilingual Plane"( "アストラル"文字)以外の文字を扱うように拡張されました。また、CJK Unified Ideographs拡張BDはそのようなアトラス文字は、JavaScriptなどのUTF-16システムでサロゲートペアを使用してエンコードする必要があるため、これらの拡張にはさらに複雑な範囲があります。サロゲートペアは、上位サロゲートと低いサロゲートからなり、どちらも単独では有効ではありませんが、結合されたときに文字列の長さが2であっても実際の単一キャラクタを形成します。

これを非中国語の文字(空の文字列で置き換える)として表現するのはおそらくより簡単ですが、代わりに中国語の文字列を提供してブロックを追加または削除する必要がある場合ES6のよう

アップデート2017年9月

、1は例えば、ブラケットを使用して新しいエスケープシーケンスの内部のコードポイントと一緒に「U」フラグを使用してサロゲートに頼ることなく、正規表現を発現することができます、 "CJK統一イデオグラフィックエクステンションB"の/^[\u{20000}-\u{2A6D6}]*$/u

ユニコードでも「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

そして、あなたは外に選び、選択する必要がない場合は、「Unified_Ideograph」プロパティ(別名「UIdeo」)は、当社の統一表意文字のすべてをカバーし、シンボル/句読点と互換性の文字を除いたように、それはhttp://unicode.org/reports/tr44/#Unified_Ideographごとに見えるように上記、以下はあなたが必要なすべてのことがあります

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

や速記で:

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

+0

ありがとうございます。私は40 + MBの中国電子ブックを使って自動テストを行いました。この/ [^ \ u4E00- \ u9FA5]/igの91%は、句読点以外の文字を何も食べずにテキストをスクラップするのに十分なようです。他の範囲のキャラクターの大部分はまれに使用されているようです。 – 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モジュール(正確には、それによって生成されたモジュールの1つ)はUnicodeData.txt databaseのjavascriptインターフェイスです(Pythonのunicodedata標準モジュールに似ていますあなたの鐘)。

関連する問題