Javascriptを使用してUnicode文字列を廃棄しようとしています。この文字列は、混合文字をカウントする可能性があります。例:我的中文不好。我是意大利人。你知道吗?
最終的に、文字列には-漢字-中国語の句読点-ANSI文字と句読点が含まれる場合があります
漢字だけを残す必要があります。ヒントはありますか?
関連するブロックは http://www.unicode.org/reports/tr38/#BlockListing または http://www.unicode.org/charts/ で確認できます。 。
互換性のある文字(使用されなくなった文字)、ストローク、部首、囲みCJKの文字と月を除外する場合は、次のようにカバーする必要があります(後で個々のJavaScriptの同等の式を追加しました)。
[\u4E00-\u9FCC]
_[\u3400-\u4DB5]
_[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6]
_\ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34]
_\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1d]
_[\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(Chinese-Japanese-Korean)文字が多いため、Unicodeは「基本多言語面」(「アストラル」文字と呼ばれる)を超える文字を処理するように拡張されました。CJK統合漢字拡張BDは、そのような例です。アストラル文字。これらの拡張機能の範囲は、JavaScriptなどのUTF-16システムで代理ペアを使用してエンコードする必要があるため、より複雑になります。サロゲートペアは、ハイサロゲートとローサロゲートで構成され、どちらもそれ自体では有効ではありませんが、結合すると、文字列の長さが2)であるにもかかわらず、実際の1文字を形成します。
これを中国語以外の文字として表現する(空の文字列に置き換える)のはおそらく置換の目的で簡単ですが、必要に応じて追跡しやすいように、代わりに漢字の表現を提供しました。ブロックに追加またはブロックから削除します。
2017年9月の更新
ES6以降、「CJK統合漢字拡張B」の場合は_/^[\u{20000}-\u{2A6D6}]*$/u
_のように、括弧付きの新しいエスケープシーケンス内のコードポイントとともに「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.txt および http://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
_
独自のソリューションを発明するのではなく、おそらく nicode-data モジュール(正確には、それによって生成されるモジュールの1つ)を使用できます。これは、本質的に nicodeData.txtデータベース)へのjavascriptインターフェイスです。 (ベルが鳴る場合は、Pythonのunicodedata標準モジュールに似ています)。
コピーアンドペーストソリューション。 ES6のUnicodeフラグを使用します。拡張機能Fまでの現在のすべての拡張機能、および表意文字。
const character_xp = new RegExp(String.raw`
[\u{FA0E}\u{FA0F}\u{FA11}\u{FA13}\u{FA14}\u{FA1F}\u{FA21}\u{FA23}\u{FA24}\u{FA27}-\u{FA29}]
|[\u{4E00}-\u{9FCC}]
|[\u{3400}-\u{4DB5}]
|[\u{20000}-\u{2A6D6}]
|[\u{2A700}-\u{2B734}]
|[\u{2B740}-\u{2B81D}]
|[\u{2B820}-\u{2CEAF}]
|[\u{2CEB0}-\u{2EBEF}]
`.replace(/\s+/g, ''), "u")