たとえば、漢字で構成される文字列を一致させたい場合はm
、n
次を使用できます。
[single Chinese character regular expression]{m,n}
存在する任意の漢字である可能性がある、単一の漢字の正規表現はありますか?
たとえば、漢字で構成される文字列を一致させたい場合はm
、n
次を使用できます。
[single Chinese character regular expression]{m,n}
存在する任意の漢字である可能性がある、単一の漢字の正規表現はありますか?
中国語 (CJK) 文字に一致する正規表現は次のとおりです。
\p{script=Han}
単純に評価できる
\p{Han}
これは、正規表現コンパイラが要件RL1.2 Properties from UTS#18 Unicode Regular Expressionsを満たしていることを前提としています。Perl と Java 7 はどちらもその仕様を満たしていますが、他の多くは満たしていません。
ジャワでは、
\p{InCJK_UNIFIED_IDEOGRAPHS}{1,3}
存在する任意の漢字である可能性がある、単一の漢字の正規表現はありますか?
おすすめ
Flex 互換の字句アナライザーを使用して中国語の文字やその他の Unicode コード ポイントとパターンを一致させるには、Flexと下位互換性のある C++ 用のRE/flex 字句アナライザーを使用できます。RE/flex は Unicode をサポートし、Bison と連携してレクサーとパーサーを構築します。
次のような RE/flex 仕様で Unicode パターン (および UTF-8 正規表現) を記述できます。
%option flex unicode
%%
[肖晗] { printf ("xiaohan/2\n"); }
%%
global%option unicode
を使用して Unicode を有効にします。ローカル修飾子を使用して、(?u:)
Unicode を単一のパターンに制限することもできます (したがって、他のすべては Flex のように ASCII/8 ビットのままです)。
%option flex
%%
(?u:[肖晗]) { printf ("xiaohan/2\n"); }
(?u:\p{Han}) { printf ("Han character %s\n", yytext); }
. { printf ("8-bit character %d\n", yytext[0]); }
%%
Optionは Flex 互換性を有効にするため、、 、 などflex
を使用できます。オプションを指定しないと、RE/flex はレクサー メソッドの呼び出しを予期します: (or and for and )、(or wide char length)、および. RE/flex メソッド呼び出しはよりクリーンな IMHO であり、ワイド char 操作が含まれます。yytext
yyleng
ECHO
flex
text()
str()
wstr()
std::string
std::wstring
size()
wsize()
echo()
バックグラウンド
普通の古い Flex では、Unicode 識別子のサポートを必要とするコンパイラ プロジェクトのために、ASCII 文字と UTF-8 でエンコードされた文字をキャプチャするために、醜い UTF-8 パターンを定義することになりましたid
。
digit [0-9]
alpha ([a-zA-Z_\xA8\xAA\xAD\xAF\xB2\xB5\xB7\xB8\xB9\xBA\xBC\xBD\xBE]|[\xC0-\xFF][\x80-\xBF]*|\\u([0-9a-fA-F]{4}))
id ({alpha})({alpha}|{digit})*
このパターンは、識別子 (など)alpha
で使用される ASCII 文字、アンダースコア、および Unicode コード ポイントをサポートします。\p{L}
このパターンは、このパターンのサイズを管理可能な状態に保つために絶対に必要な数よりも多くの Unicode コード ポイントを許可するため、コンパクトさと引き換えに正確さを欠き、場合によっては有効な UTF-8 ではないUTF-8 の長すぎる文字を許可します。このアプローチを検討している場合は、問題と安全上の懸念に注意してください。代わりに、RE/flexなどの Unicode 対応のスキャナー ジェネレーターを使用してください。
安全性
Flex パターンで UTF-8 を直接使用する場合、いくつかの懸念事項があります。
Flex で独自の UTF-8 パターンをエンコードして任意の Unicode 文字に一致させると、エラーが発生する可能性があります。パターンは、有効な Unicode 範囲内の文字のみに制限する必要があります。Unicode コード ポイントは、U+0000 から U+D7FF および U+E000 から U+10FFFF の範囲をカバーします。U+D800 から U+DFFF の範囲は、UTF-16 サロゲート ペア用に予約されており、無効なコード ポイントです。ツールを使用して Unicode 範囲を UTF-8 に変換する場合は、無効なコード ポイントを除外してください。
パターンは、長すぎるバイト シーケンスやその他の無効なバイト シーケンスを拒否する必要があります。無効な UTF-8 は黙って受け入れるべきではありません。
レクサーで字句入力エラーをキャッチする.
には、入力が拒否されたというエラー メッセージを生成するために、有効および無効な Unicode (UTF-8 オーバーランや無効なバイト シーケンスを含む) に一致する特殊な (ドット) が必要です。エラーメッセージを生成するためにドットを「catch-all-else」として使用し、ドットが無効な Unicode と一致しない場合、lexer がハングする (「scanner is jammed」) か、lexer が出力に不要な文字をエコーします。 Flex の「デフォルト ルール」によって。
スキャナは、入力内のUTF BOM (Unicode Byte Order Mark) を認識して、UTF-8、UTF-16 (LE または BE)、または UTF-32 (LE または BE) に切り替える必要があります。
ご指摘のとおり[unicode characters]
、括弧リスト内の UTF-8 文字はマルチバイト文字であり、各シングルバイト文字は一致できますが UTF-8 文字は一致しないため、Flex では のようなパターンはまったく機能しません。
RE/flex ユーザー ガイドの無効な UTF エンコーディングも参照してください。
Java 7 以降では、形式は「\p{IsHan}」である必要があります。