15

StackOverflow には、「文字」が正規表現で[a-zA-Z]. ただし、Unicode では、ほとんどの人が文字と見なす文字がさらに多くあります (すべてのギリシャ文字、キリル文字など)。Unicodeでは、それぞれが「文字」を持つ可能性のある多くのブロックが定義されています。

Java 定義では、アルファベット文字などのPosix クラス を定義していますが、これは US-ASCII でのみ機能するように指定されています。事前定義された文字クラスでは[a-zA-Z_0-9]、単語が で構成されるように定義されていますが、多くの文字も除外されています。

では、どうすれば Unicode 文字列と適切に一致させることができるでしょうか? これを正しく行う他のライブラリはありますか?

4

3 に答える 3

16

ここに非常に素晴らしい説明があります:

http://www.regular-expressions.info/unicode.html

いくつかのヒント:

「残念ながら、Java と .NET は\X(まだ) サポートしていません。\P{M}\p{M}*代用として使用してください。任意の数の書記素に一致させるには、(?:\P{M}\p{M}*)+代わりに を使用してください\X+。」

\uFFFF「Java では、正規表現の等価性をオンにした場合でも、正規表現トークンは指定されたコード ポイントとのみ一致します。ただし、同じ構文\uFFFFを使用して、Java ソース コードのリテラル文字列に Unicode 文字を挿入することもできます。Pattern.compile("\u00E0")単一コードと単一コードの両方に一致します。 -point および double-code-point encodings of à, whilePattern.compile("\\u00E0")は single-code-point バージョンのみに一致します. 正規表現を Java 文字列リテラルとして記述する場合、バックスラッシュをエスケープする必要があることに注意してください. 前者の Java コードは regex をコンパイルしますがà、後者は regex をコンパイルしますコンパイルします\u00E0。実行内容によっては、違いが大きくなる場合があります。」

于 2011-03-15T17:16:33.227 に答える
5

文字などの Unicode カテゴリについて話しているのですか? これらは、形式の正規表現によって照合されます\p{CAT}。ここで、「CAT」は、すべての文字のようなカテゴリ コード、または大文字やタイトルケースのLようなサブカテゴリです。LuLt

于 2011-03-15T17:13:20.057 に答える
2

java.util.regex.Patternの JavaDoc からの引用。

ユニコードのサポート

このクラスは、Unicode Technical Standard #18: Unicode Regular Expression Guidelinesの Level 1と RL2.1 Canonical Equivalents に準拠しています。

Java ソース コードの \u2014 などの Unicode エスケープ シーケンスは、Java 言語仕様の§3.3で説明されているように処理されます。このようなエスケープ シーケンスは、ファイルまたはキーボードから読み取られる式で Unicode エスケープを使用できるように、正規表現パーサーによっても直接実装されます。したがって、文字列 "\u2014" と "\\u2014" は等しくはありませんが、16 進値 0x2014 を持つ文字に一致する同じパターンにコンパイルされます。

Unicode ブロックとカテゴリは、Perl と同様に \p および \P 構造で記述されます。\p{prop} は、入力にプロパティ prop がある場合に一致しますが、\P{prop} は、入力にそのプロパティがある場合には一致しません。ブロックは、InMongolian のように接頭辞 In で指定されます。カテゴリはオプションの接頭辞 Is で指定できます: \p{L} と \p{IsL} の両方が Unicode 文字のカテゴリを示します。ブロックとカテゴリは、文字クラスの内外で使用できます。

サポートされているカテゴリは、Character クラスで指定されたバージョンの Unicode 標準のカテゴリです。カテゴリ名は、規格で定義されているものであり、規範的かつ参考的なものです。Pattern でサポートされているブロック名は、UnicodeBlock.forName で受け入れられ、定義されている有効なブロック名です。

于 2011-03-15T17:15:43.417 に答える