For Development HEAD DRAFTSearch (procedure/syntax/module):

6.10 文字集合

Builtin Class: <char-set>

文字の集合を取り扱う、文字集合(キャラクタセット)のクラスです。 Gaucheは文字集合オブジェクトのサポートと、 ある文字がその集合に属するかどうかを調べる手続きを言語組み込みで持っています。

コレクションプロトコル (gauche.collection - コレクションフレームワーク参照) を実装しているので、 gauche.collectionで提供される標準のコレクションメソッドが使えます。

<char-set>のインスタンスは文字に関数のように適用することができ、 その文字が文字集合に属するかどうかを判定する述語として機能します。 下記のchar-set-contains?を参照してください。

文字集合に関する他の操作、例えば集合演算などは、SRFI-14モジュール (scheme.charset - R7RS文字集合参照) で提供されています。


6.10.1 文字集合リテラル

Reader Syntax: #[char-set-spec]

この構文で、リテラル文字集合を記述することができます。 char-set-specには集合に含める文字を列挙します。 次の特殊なシーケンスを含めることができます。

x-y

文字xと文字yの間の文字全て。xyも含みます。 xyよりも内部文字コードで比較して小さくなければなりません。

^

カレットがchar-set-specの最初に来た場合、以降に示される文字集合の 補集合がこの文字集合となります。

\xN;

UnicodeコードポイントがN(16進数表記)の文字。

\s

空白文字(space, newline, tab, form feed, vertical tab, carriage return). 文字集合char-set:ascii-whitespaceの要素。

\S

空白でない文字。(\sの補集合)

\d

10進数の数字。 文字集合char-set:ascii-digitの要素。

\D

\dの補集合

\w

単語を構成する文字の集合(#[A-Za-z0-9_])。 文字集合char-set:ascii-wordの要素。

\W

\Wの補集合

\\

バックスラッシュ文字

\-

マイナス文字

\^

カレット文字

[:alnum:] …

POSIX風文字集合表記。サポートされる名前については下の表を参照してください。 名前は全て小文字でなければなりません。この表記の文字集合はASCII範囲のみを含みます。

[:^alnum:] …

[:alnum:]等の補集合です。

[:ALNUM:] …

POSIX風文字集合表記のGauche拡張。名前は全て大文字でなければなりません。 この表記の文字集合はUnicode全範囲を対象とします。 サポートされる名前については下の表を参照してください。

[:^ALNUM:] …

[:ALNUM:]等の補集合です。

POSIX風文字集合表記で認識される名前は次のとおりです。

:alpha:ASCIIアルファベット。char-set:ascii-letter, #[A-Za-z]
:alnum:ASCIIアルファベットと数字。char-set:ascii-letter+digits, #[0-9A-Za-z].
:blank:ASCIIブランク文字。char-set:ascii-blank, tab and space.
:cntrl:ASCII制御文字。char-set:ascii-control, U+0000 to U+001f and U+007f.
:digit:ASCII数字。char-set:ascii-digit, #[0-9].
:graph:ASCIIグラフィック文字。char-set:ascii-graphic.
:lower:ASCII小文字アルファベット。char-set:ascii-lower-case, #[a-z].
:print:ASCII印字可能文字。char-set:ascii-printing.
:punct:ASCII句読点。char-set:ascii-punctuation.
:space:ASCII空白文字。char-set:ascii-whitespace.
:upper:ASCII大文字アルファベット。char-set:ascii-upper-case, #[A-Z].
:word:ASCII単語構成文字(POSIXではありません)。 char-set:ascii-word, #[0-9A-Za-z_].
:xdigit:16進数の数字。char-set:hex-digit, #[0-9a-fA-F].
:ascii:ASCII文字 (POSIXではありません). char-set:ascii.
:ALPHA:Unicode通常文字。char-set:letter.
:ALNUM:Unicode通常文字と数字。char-set:letter+digits.
:BLANK:Unicodeブランク文字。char-set:blank.
:CNTRL:Unicode制御文字。char-set:iso-control.
:DIGIT:Unicode数字。char-set:digit.
:GRAPH:Unicodeグラフィック文字。char-set:graphic.
:LOWER:Unicode小文字。char-set:lower-case, #[a-z].
:PRINT:Unicode印字可能文字。char-set:printing.
:PUNCT:Unicode句読点。char-set:punctuation.
:SPACE:Unicode空白文字。char-set:whitespace.
:UPPER:Unicode大文字。char-set:upper-case, #[A-Z].
:WORD:Unicode単語構成文字。char-set:word.
:XDIGIT:16進数の数字。(:xdigit:と同じ).

いくつか例を示します。

#[aeiou]     ; 母音文字’a’, ’e’, ’i’, ’o’, ’u’の集合
#[a-zA-Z]    ; アルファベット
#[[:alpha:]] ; アルファベット (POSIX表記)
#[\\\-]      ; バックスラッシュとマイナス文字
#[]          ; 空の文字集合
#[ぁ-ん]     ; 平仮名の集合
#[\x0d;\x0a;\x3000;]  ; リターン, 改行, 全角空白

リテラル文字集合は他のリテラルデータ同様、変更不可です。 変更しようとした場合はエラーが通知されます。

互換性への注: 以前は、\xNN (2桁固定の16進数、終端のセミコロン無し) を文字と認識していました。 例えば#[\x0d\x0a]はリターン文字と改行文字集合を意味していました。 互換性のため、終端のセミコロンが見当たらない場合は古い構文もサポートされます。 しかし曖昧な場合もあります。#[\x0a;]は新しい構文では 改行文字のみのセットですが、古い構文では改行文字とセミコロンになります。

リーダのモードをlegacyにセットすると、常に古い構文で認識されます。 リーダのモードをwarn-legacyにセットすると、 デフォルトと同じように振る舞いますが、古い構文を見つけた場合は警告が出力されます。 詳しくはリーダー字句モードを参照してください。

古い構文と新しい構文の両方で動作するコードが必要な場合は、\uエスケープを 使ってください。


6.10.2 定義済み文字集合

定義済みの文字集合がいくつか提供されています。 R7RS文字集合ライブラリで定義されているものも含まれます(scheme.charset - R7RS文字集合参照)。 これらの文字集合は変更不可です。

Variable: char-set:letter

[R7RS charset] 文字 (UnicodeカテゴリLuLlLtLmLo)。

Variable: char-set:lower-case
Variable: char-set:upper-case
Variable: char-set:title-case

[R7RS charset] 小文字、大文字、タイトルケース文字 (それぞれ、UnicodeカテゴリLlLuLt)。

Variable: char-set:digit

[R7RS charset] 数字 (UnicodeカテゴリNd)。 これには非ASCIIの数字もたくさん含まれています。 ASCIIの数字(#[0-9])だけが欲しい時はchar-set:ascii-digitを 使ってください。

Variable: char-set:hex-digit

[R7RS charset] 16進数表記に使われる文字、つまり#[0-9A-Fa-f]。 これにはASCII外の文字は含まれません。

Variable: char-set:letter+digit

[R7RS charset] char-set:letterchar-set:digitの和集合です。

Variable: char-set:graphic

[R7RS charset] 何らかのグリフを持っている文字。通常文字、数字、句読点、シンボルの和集合です。

Variable: char-set:printing

[R7RS charset] char-set:graphicchar-set:whitespaceの和集合です。

Variable: char-set:whitespace
Variable: char-set:blank

[R7RS charset] 空白文字およびブランク文字です。 空白文字char-set:whitespaceは、 #\tab#\newline#\u000B (vertical tab)、 #\page#\return、および 一般カテゴリZsZlZpの文字です。 一方、ブランク文字char-set:blankは、 #\tabと一般カテゴリZsの文字です。 char-set:whitespaceは、Schemeのリーダが空白扱いにする文字の集合と一致します。

Variable: char-set:iso-control

[R7RS charset] 制御文字 (Unicode一般カテゴリCc)。

Variable: char-set:punctuation

[R7RS charset] 句読点 (Unicode一般カテゴリ Pc, Pd, Ps, Pe, Pi, Pf, Po)。

Variable: char-set:symbol

[R7RS charset] シンボル文字 (Unicode一般カテゴリ Sm, Sc, Sk, So)。

Variable: char-set:ascii

[R7RS charset] すべてのASCII文字 (U+0000 to U+007f)。

Variable: char-set:empty

[R7RS charset] 空の文字集合。

Variable: char-set:full

[R7RS charset] すべての文字を含む文字集合。

Variable: char-set:word

単語を構成する文字。今のところ、これはchar-set:ascii-word、 つまり#[0-9A-Za-z_]と同じです。 ただ、将来はUnicodeの全域に意味を拡張するかもしれません。 ASCIIの範囲内だけを扱いたい場合はchar-set:ascii-wordを使ってください。

Variable: char-set:ascii-letter
Variable: char-set:ascii-lower-case
Variable: char-set:ascii-upper-case
Variable: char-set:ascii-digit
Variable: char-set:ascii-letter+digit
Variable: char-set:ascii-graphic
Variable: char-set:ascii-printing
Variable: char-set:ascii-whitespace
Variable: char-set:ascii-blank
Variable: char-set:ascii-control
Variable: char-set:ascii-punctuation
Variable: char-set:ascii-symbol
Variable: char-set:ascii-word

これらはそれぞれ、ascii-を除いた名前の文字集合とchar-set:asciiと の積集合です。

文字集合リテラルおよび正規表現リテラルにおける \d\s\wはそれぞれ char-set:ascii-digitchar-set:ascii-whitespacechar-set:ascii-wordに 対応します (Unicode版ではなく)。

また、[:alpha:]などのPOSIX文字クラス表記もこちらのASCII版の方に対応します。

なお、char-set:ascii-title-casechar-set:ascii-hex-digitは ありません。ASCIIの範囲内にtitlecaseにあたる文字はなく、 またchar-set:hex-digitはそれ自体ASCII範囲に限定されています。

Variable: char-set:Lu
Variable: char-set:Ll
Variable: char-set:Lt
Variable: char-set:Lm
Variable: char-set:Lo
Variable: char-set:Mn
Variable: char-set:Mc
Variable: char-set:Me
Variable: char-set:Nd
Variable: char-set:Nl
Variable: char-set:No
Variable: char-set:Pc
Variable: char-set:Pd
Variable: char-set:Ps
Variable: char-set:Pe
Variable: char-set:Pi
Variable: char-set:Pf
Variable: char-set:Po
Variable: char-set:Sm
Variable: char-set:Sc
Variable: char-set:Sk
Variable: char-set:So
Variable: char-set:Zs
Variable: char-set:Zl
Variable: char-set:Zp
Variable: char-set:Cc
Variable: char-set:Cf
Variable: char-set:Cs
Variable: char-set:Co
Variable: char-set:Cn

それぞれ、対応するUniocdeの一般カテゴリに属する文字の集合です。 例えばchar-set:Luは一般カテゴリLuの文字の集合です。

Variable: char-set:L
Variable: char-set:LC
Variable: char-set:M
Variable: char-set:N
Variable: char-set:P
Variable: char-set:S
Variable: char-set:Z
Variable: char-set:C

各文字集合は、その文字で始まるUnicodeの一般カテゴリのすべての文字の集合です。 例えばchar-set:Lは、char-set:Luchar-set:Llchar-set:Ltchar-set:Lmchar-set:Loの和集合です。

char-set:LCは大文字小文字の区別のある文字の集合、つまり char-set:Ltchar-set:Llchar-set:Luの和集合です。


6.10.3 文字集合の操作

包括的な文字集合操作については、scheme.charset - R7RS文字集合も参照してください。

Function: char-set? obj

[R7RS charset] objが文字集合であれば真の値を返します。

Function: char-set-immutable? char-set

char-setが変更不可の文字集合であれば#tを、変更可能な文字集合であれば #fを返します。

Function: char-set-contains? char-set char

[R7RS charset] 文字集合char-setが文字charを含んでいれば真の値を返します。

(char-set-contains? #[a-z] #\y) ⇒ #t
(char-set-contains? #[a-z] #\3) ⇒ #f

(char-set-contains? #[^ABC] #\A) ⇒ #f
(char-set-contains? #[^ABC] #\D) ⇒ #t

(char-set-contains? #[あ-お] #\う) ⇒ #t
(char-set-contains? #[あ-お] #\ぷ) ⇒ #f
Generic application: char-set char

文字集合オブジェクトは文字に適用されると、 (char-set-contains? char-set char) のように振る舞います。

(#[a-z] #\a) ⇒ #t
(#[a-z] #\A) ⇒ #f

(use gauche.collection)
(filter #[a-z] "CharSet") ⇒ (#\h #\a #\r #\e #\t)
Function: char-set char …

[R7RS charset] 文字char … からなる文字集合を作成して返します。

(char-set #\a #\b #\c)   ⇒ #[a-c]
(char-set #\あ #\い #\う) ⇒ #[あいう]
Function: char-set-size char-set

[R7RS charset] 文字集合に含まれる文字数を返します。

gosh> (char-set-size #[])
0
gosh> (char-set-size #[[:alnum:]])
62
Function: char-set-copy char-set

[R7RS charset] char-setのコピーを作って返します。

Function: char-set-complement char-set
Function: char-set-complement! char-set

[R7RS charset] char-setの補集合を返します。上の手続きは常に新たな集合を作って返しますが、 下の手続きは引数を変更して返す可能性があります。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT