ここで実際に正確に何を意味するのかは不明です。数字で遊ぶつもりなら、Unicode 正規表現に関する Unicode Technical Standard #18 の Annex C はprint
、「印刷可能な」コード ポイントを、プロパティを持つ任意のコード ポイントとして定義することを具体的に提案しています。なれ
\p{print}
意味[[\p{graph}\p{blank}]&&[^\p{gc=Control}]]
\p{graph}
意味[^\p{Whitespace}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}]
\p{blank}
意味[\p{Whitespace}&&[^\N{LF}\N{VT}\N{FF}\N{CR}\N{NEL}\p{gc=Line_Separator}\{gc=Paragraph_Separator}]
または、Java 1.7Pattern
クラスがこれらを文書化しているように、 Java7 の新しい Pattern.UNICODE_CHARACTER_CLASSフラグを有効にしてパターンをコンパイルする場合:
\p{Graph}
目に見える文字:[^\p{IsWhite_Space}\p{gc=Cc}\p{gc=Cs}\p{gc=Cn}]
\p{Print}
印刷可能な文字:[\p{Graph}\p{Blank}&&[^\p{Cntrl}]]
\p{Blank}
スペースまたはタブ:[\p{IsWhite_Space}&&[^\p{gc=Zl}\p{gc=Zp}\x0a\x0b\x0c\x0d * \x85]]
\p{Cntrl}
制御文字:\p{gc=Cc}
\p{XDigit}
16 進数:[\p{gc=Nd}\p{IsHex_Digit}]
\p{Space}
空白文字:\p{IsWhite_Space}
「印刷可能な」文字について
Java の(?U)\p{print}
パターン プロパティ (またはCharacter
クラスからの同等のもの) のような合理的なものを使用するだけでも、いくつかの「興味深い」決定を下す必要があります。
次の各コード ポイントを検討してください。
U+000007 gc=Cc columns=0 print=0 graph=0 ALERT
U+000008 gc=Cc columns=0 print=0 graph=0 BACKSPACE
U+000009 gc=Cc columns=0 print=0 graph=0 CHARACTER TABULATION
U+00000C gc=Cc columns=0 print=0 graph=0 FORM FEED (FF)
U+00000D gc=Cc columns=0 print=0 graph=0 CARRIAGE RETURN (CR)
U+000020 gc=Zs columns=1 print=1 graph=0 SPACE
U+000021 gc=Po columns=1 print=1 graph=1 EXCLAMATION MARK
U+000041 gc=Lu columns=1 print=1 graph=1 LATIN CAPITAL LETTER A
U+000061 gc=Ll columns=1 print=1 graph=1 LATIN SMALL LETTER A
U+000080 gc=Cc columns=0 print=0 graph=0 PADDING CHARACTER
U+000085 gc=Cc columns=0 print=0 graph=0 NEXT LINE (NEL)
U+00008D gc=Cc columns=0 print=0 graph=0 REVERSE LINE FEED
U+0000AB gc=Pi columns=1 print=1 graph=1 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
U+0000AD gc=Cf columns=0 print=1 graph=1 SOFT HYPHEN
U+0002B0 gc=Lm columns=1 print=1 graph=1 MODIFIER LETTER SMALL H
U+0002C6 gc=Lm columns=1 print=1 graph=1 MODIFIER LETTER CIRCUMFLEX ACCENT
U+000302 gc=Mn columns=0 print=1 graph=1 COMBINING CIRCUMFLEX ACCENT
U+00036A gc=Mn columns=0 print=1 graph=1 COMBINING LATIN SMALL LETTER H
U+001100 gc=Lo columns=2 print=1 graph=1 HANGUL CHOSEONG KIYEOK
U+002028 gc=Zl columns=0 print=0 graph=0 LINE SEPARATOR
U+002029 gc=Zp columns=0 print=0 graph=0 PARAGRAPH SEPARATOR
U+00202B gc=Cf columns=0 print=1 graph=1 RIGHT-TO-LEFT EMBEDDING
U+00202F gc=Zs columns=1 print=1 graph=0 NARROW NO-BREAK SPACE
U+002060 gc=Cf columns=0 print=1 graph=1 WORD JOINER
U+002061 gc=Cf columns=0 print=1 graph=1 FUNCTION APPLICATION
U+002062 gc=Cf columns=0 print=1 graph=1 INVISIBLE TIMES
U+002064 gc=Cf columns=0 print=1 graph=1 INVISIBLE PLUS
U+002EC1 gc=So columns=2 print=1 graph=1 CJK RADICAL TIGER
U+002F0B gc=So columns=2 print=1 graph=1 KANGXI RADICAL EIGHT
U+003000 gc=Zs columns=2 print=1 graph=0 IDEOGRAPHIC SPACE
U+003008 gc=Ps columns=2 print=1 graph=1 LEFT ANGLE BRACKET
U+00300A gc=Ps columns=2 print=1 graph=1 LEFT DOUBLE ANGLE BRACKET
U+00300C gc=Ps columns=2 print=1 graph=1 LEFT CORNER BRACKET
U+00302B gc=Mn columns=0 print=1 graph=1 IDEOGRAPHIC RISING TONE MARK
U+003030 gc=Pd columns=2 print=1 graph=1 WAVY DASH
U+003037 gc=So columns=2 print=1 graph=1 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
U+003041 gc=Lo columns=2 print=1 graph=1 HIRAGANA LETTER SMALL A
U+00E000 gc=Co columns=1 print=1 graph=1 <unnamed codepoint in blk=Private_Use_Area>
U+00F8FF gc=Co columns=1 print=1 graph=1 <unnamed codepoint in blk=Private_Use_Area>
U+00FB1E gc=Mn columns=0 print=1 graph=1 HEBREW POINT JUDEO-SPANISH VARIKA
U+00FE00 gc=Mn columns=0 print=1 graph=1 VARIATION SELECTOR-1
U+00FE23 gc=Mn columns=0 print=1 graph=1 COMBINING DOUBLE TILDE RIGHT HALF
U+00FE58 gc=Pd columns=2 print=1 graph=1 SMALL EM DASH
U+00FE77 gc=Lo columns=1 print=1 graph=1 ARABIC FATHA MEDIAL FORM
U+00FEFF gc=Cf columns=0 print=1 graph=1 ZERO WIDTH NO-BREAK SPACE
U+00FF06 gc=Po columns=2 print=1 graph=1 FULLWIDTH AMPERSAND
U+00FFFA gc=Cf columns=0 print=1 graph=1 INTERLINEAR ANNOTATION SEPARATOR
U+00FFFD gc=So columns=1 print=1 graph=1 REPLACEMENT CHARACTER
U+01B000 gc=Lo columns=2 print=1 graph=1 KATAKANA LETTER ARCHAIC E
U+01D165 gc=Mc columns=1 print=1 graph=1 MUSICAL SYMBOL COMBINING STEM
U+01D167 gc=Mn columns=0 print=1 graph=1 MUSICAL SYMBOL COMBINING TREMOLO-1
U+100002 gc=Co columns=1 print=1 graph=1 <unnamed codepoint in blk=Supplementary_Private_Use_Area-B>
それらのいくつかは、何を印刷するか、あるいは印刷するかどうかについて、非常に条件付きです。たとえば、U+F8FF の ‹› はあなたにはどのように見えますか?
次に、タブとバックスペースの処理方法を決定する必要があります。
さらに、Unicode拡張書記素クラスター\p{Grapheme_Extend}
を構築するために使用される さまざまなコード ポイントを考慮する必要があります。つまり、ユーザーに表示される文字です。これらのすべてがノンスペース マークであるとは限りません。実際、マークではなく文字である場合もあります。一部はまったく印刷可能な文字ではありませんが、不可避的に関連付けられている印刷可能な文字を変更します。バリエーション セレクターを 1 つの例として考えてみましょう。\p{Grapheme_Base}
警告
これは、Java プログラマー志望者が忘れがちな非常に重要なポイントであり、完全に忘れられていない場合でも、通常は過小評価されています。
Java 文字は Unicode 文字ではないことを常に覚えておいてください。 Unicode 文字には 2 つの合理的な定義があり、Java ではどちらも提供されません。以下に、2 つの合理的な定義を示します。
- 文字がプログラマーに見える意味での文字である場合、その文字は Unicode コード ポイントです。これは
.
、たとえば、Sun または ICU のどちらを使用しても、正規表現エンジンで一致するものです。
- 文字がユーザーに見える意味での文字である場合、その文字は Unicode 拡張書記素クラスターです。これは
\X
、(Sun ではなく ICU) 正規表現エンジンで一致するものです。
Java のいわゆる「文字」は、実際の Unicode コード ポイントの可変幅 UTF-16 表現の低レベルの抽象化された 2 バイト要素です。それは抽象コードポイントでも抽象書記素でもありません。抽象的なものではありません。 Javachar
は、抽象化のエンベロープに違反しています。
はい、一部の Java クラスはcodePointAt
インターフェイスを提供します。それらが使用可能な場合は、必ずそれらを使用する必要があります。しかし、ここで説明するには時間がかかりすぎる多くの点で、Java は文字の抽象化において根本的に壊れています— 文字の抽象化がないためです。
これにより、Java での Unicode 文字と文字列の操作は、せいぜいエラーが発生しやすくなり、ほとんどの場合不可能になります。
幸運を。