web-dev-qa-db-ja.com

Javascriptユニコード文字列、漢字、句読点なし

Javascriptを使用してUnicode文字列を廃棄しようとしています。この文字列は、混合文字をカウントする可能性があります。例:我的中文不好。我是意大利人。你知道吗?

最終的に、文字列には-漢字-中国語の句読点-ANSI文字と句読点が含まれる場合があります

漢字だけを残す必要があります。ヒントはありますか?

15
resle

関連するブロックは 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)_\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(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_

26
Brett Zamir

独自のソリューションを発明するのではなく、おそらく nicode-data モジュール(正確には、それによって生成されるモジュールの1つ)を使用できます。これは、本質的に nicodeData.txtデータベース)へのjavascriptインターフェイスです。 (ベルが鳴る場合は、Pythonのunicodedata標準モジュールに似ています)。

0
tutturu

コピーアンドペーストソリューション。 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")
0
Twifty