[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs Lispの文字列は文字の順序列を保持している配列です。 文字列は、シンボル、バッファ、ファイルのそれぞれの名前として、 ユーザーへメッセージを送るため、 バッファ間でコピーするテキストを保持するため、 その他さまざまな目的に使われます。 文字列はとても重要なので、 Emacs Lispには文字列を操作する関数が数多くあります。 Emacs Lispのプログラムでは、個々の文字よりも文字列を多用します。
キーボード文字イベントを表す文字列に関する特別な配慮については、 See 節 20.5.14 キーボードイベントを文字列で保持する。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs Lispの文字列は文字の順序列を保持している配列です。 Emacs Lispでは文字を整数で表現します。 整数が文字であるかどうかは、その使われ方からしか判断できません。 したがって、文字列は、実際には、整数群を保持しているのです。
(任意の配列と同様に)文字列の長さは固定されていて、 文字列をいったん作成すると変更できません。 Lispの文字列は特別な文字コードで終端されるのではありません。 (対照的に、C言語の文字列はASCIIコード0で終端される。)
文字列は配列ですからシーケンスでもあり、 一般の配列関数やシーケンス関数で文字列を操作できます。 (see 節 6. シーケンス、配列、ベクトル。) たとえば、関数aref
とaset
(see 節 6.3 配列操作関数)を 用いて、文字列内の個々の文字を参照したり変更できます。
Emacs文字列(およびバッファ)内の非ASCII文字のテキスト表現は 2種類あります。 ユニバイトとマルチバイトです(see 節 32.1 テキスト表現)。 ASCII文字は、文字列内ではつねに1バイトを占めます。 実際、すべてがASCII文字である文字列では、2つの表現に違いはありません。 ほとんどのLispプログラムでは、 読者はこれらの2つの表現を考慮する必要はないでしょう。
キー列を文字列として表現することがあります。 文字列がキー列を表す場合、128から255の範囲にある文字列の要素は、 その範囲の文字コードとしてではなく、 (非常に大きな整数になる)メタ文字を表現します。
文字列は、ハイパー、スーパー、アルトの修飾子を持つ文字を保持できません。 文字列はASCIIコントロール文字を保持できますが、 それ以外のコントロール文字を保持できません。 文字列では、ASCIIコントロール文字の大文字小文字を区別できません。 キー列などのそのような文字をシーケンスに収めるには、 文字列のかわりにベクトルを使う必要があります。 キーボード入力文字に対するメタなどの修飾子の表現については、 See 節 2.3.3 文字型。
文字列は正規表現を保持するのにも便利です。 文字列に対して正規表現の一致を取ることもできます(see 節 33.3 正規表現の探索)。 関数match-string
(see 節 33.6.2 マッチデータの簡単な参照)と replace-match
(see 節 33.6.1 一致したテキストの置換)は、 正規表現の一致に基づいて文字列を分解したり変更するのに便利です。
バッファと同様に、文字列は、 文字そのものに加えて文字列内の文字に対するテキスト属性を保持できます。 See 節 31.19 テキスト属性。 文字列からバッファや他の文字列へテキストをコピーするすべてのLisp基本関数は、 コピーする文字の属性もコピーします。
文字列を表示したりバッファへコピーする関数については、See 節 31. テキスト。 文字と文字列の構文については、2.3.3 文字型とSee 節 2.3.8 文字列型。 テキスト表現を変換したり、文字コードを符号化/復号化する関数については、 See 節 32. 非ASCII文字。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
一般のシーケンスや配列に対する述語について詳しくは、 6. シーケンス、配列、ベクトルとSee 節 6.2 配列。
t
を返し、 さもなければnil
を返す。t
を返し、さもなければnil
を返す。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
以下の関数は、新たに文字列を作成したり、 文字列を連結したり分解して文字列を作成します。
(make-string 5 ?x) => "xxxxx" (make-string 0 ?x) => "" |
この関数に対比するものに、 char-to-string
(see 節 4.6 文字と文字列の変換)、 make-vector
(see 節 6.4 ベクトル)、 make-list
(see 節 5.5 コンスセルとリストの構築)などがある。
(string ?a ?b ?c) => "abc" |
(substring "abcdefg" 0 3) => "abc" |
ここで、`a'の添字は0、`b'の添字は1、`c'の添字は2である。 したがって、文字列"abcdefg"
から3文字`abc'をコピーする。 添字3はコピーする部分文字列の境界の文字位置を表す。 添字が3である文字は、実際には文字列内の4番目の文字である。
負の数は文字列の末尾から数える。 したがって、-1は文字列の最後の文字の添字である。 たとえば、
(substring "abcdefg" -3 -1) => "ef" |
この例では、`e'の添字は-3、`f'の添字は-2、 `g'の添字は-1である。 したがって、`e'と`f'を含むが`g'は含まない。
添字にnil
を使うと、文字列の長さを意味する。 したがって、つぎのようになる。
(substring "abcdefg" -3 nil) => "efg" |
引数endを省略することは、nil
を指定することと等価である。 そのため、(substring string 0)
は、 string全体をコピーしたものを返す。
(substring "abcdefg" 0) => "abcdefg" |
しかし、このような目的にはcopy-sequence
を勧める (see 節 6.1 シーケンス)。
stringからコピーした文字にテキスト属性があれば、 新たな文字列にもそのテキスト属性をコピーする。 see 節 31.19 テキスト属性。
substring
は第1引数としてベクトルも受け付ける。 たとえば、つぎのとおり。
(substring [a b (c) "d"] 1 3) => [b (c)] |
startやendが整数でもnil
でもないと、 エラーwrong-type-argument
を通知する。 startがendよりうしろの文字を指していたり、 いずれかの整数がstringの範囲外であると エラーargs-out-of-range
を通知する。
この関数と対照的なのがbuffer-substring
(see 節 31.2 バッファの内容を調べる)であり、 カレントバッファ内のテキストの一部を収めた文字列を返す。 文字列の先頭は0で添字付けするが、バッファの先頭は1で添字付けする。
concat
に引数を指定しないと空文字列を返す。
(concat "abc" "-def")
=> "abc-def"
(concat "abc" (list 120 121) [122])
=> "abcxyz"
;;
|
関数concat
は、 既存の文字列とeq
ではない新たな文字列をつねに作り出す。
引数が(整数のシーケンスではなく)整数であると、 その整数の表示表現を構成する文字列に変換する。 この機能を使わないでほしい。 削除する予定である。 読者がこの機能を使っていたら、今すぐプログラムを直すこと! 整数をこのような10進数に変換する正しい方法は、
format
(see 節 4.7 文字列の書式付け)や number-to-string
(see 節 4.6 文字と文字列の変換)を使うことである。
(concat 137) => "137" (concat 54 321) => "54321" |
他の連結関数については、 11.6 マップ関数のmapconcat
、 6.4 ベクトルのvconcat
、 5.5 コンスセルとリストの構築のappend
を参照。
nil
である(つまり、省略する)と、 デフォルトは"[ \f\t\n\r\v]+"
である。
たとえば、つぎのようになる。
(split-string "Soup is good food" "o") => ("S" "up is g" "" "d f" "" "d") (split-string "Soup is good food" "o+") => ("S" "up is g" "d f" "d") |
文字列の先頭や末尾で一致した場合には、 リストの先頭や末尾に空文字列は現れない。
(split-string "out to moo" "o+") => ("ut t" " m") |
空の一致箇所は、それらが連続していない限り分割点になる。
(split-string "Soup is good food" "o*") =>("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d") (split-string "Nice doggy!" "") =>("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!") |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
既存の文字列の内容を変更するもっとも基本的な方法は、 aset
(see 節 6.3 配列操作関数)を使うことです。 (aset string idx char)
は、 stringの添字idx位置にcharを格納します。 各文字は1バイト以上を占めます。 charが必要とするバイト数が指定した添字位置の文字が占めるバイト数と 異なる場合には、aset
はエラーを通知します。
より強力な関数はstore-substring
です。
既存の文字列の長さを変更することは不可能なので、 新たな文字に必要なバイト数がstringの当該箇所の文字のバイト数と 異なるなどして、 objがstringの実際の長さに収まらないときにはエラーである。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
t
を返し、 さもなければnil
を返す。 case-fold-search
がnil
以外であると、 この関数は大文字小文字の違いを区別しない。
(char-equal ?x ?x) => t (let ((case-fold-search nil)) (char-equal ?x ?X)) => nil |
t
を返す。 大文字小文字を区別する。
(string= "abc" "abc") => t (string= "abc" "ABC") => nil (string= "ab" "ABC") => nil |
関数string=
は2つの文字列のテキスト属性を無視する。 equal
(see 節 2.6 同値述語)が2つの文字列を比較する際には、 string=
を使う。
文字列に非ASCII文字が含まれ、 一方がユニバイトであり他方がマルチバイトである場合、 それらが等しいことはない。 see 節 32.1 テキスト表現。
string-equal
はstring=
の別名。t
を返す。 文字の小さいほうがstring2の文字であるならば、 string1が大きく、この関数はnil
を返す。 2つの文字列が完全に一致する場合、値はnil
である。
文字の対は、それらの文字コードで比較する。 ASCII文字集合では、小文字は大文字より大きな数値であり、 数字文字や多くの句読点文字は大文字より小さな数値であることに注意。 ASCII文字はどんな非ASCII文字よりも小さい。 ユニバイト非ASCII文字はマルチバイト非ASCII文字よりもつねに小さい。 (see 節 32.1 テキスト表現)。
(string< "abc" "abd") => t (string< "abd" "abc") => nil (string< "123" "abc") => t |
文字列の長さが異なりstring1の長さまで一致する場合、 結果はt
である。 string2の長さまで一致する場合、結果はnil
である。 空文字列は他のどんな文字列よりも小さい。
(string< "" "abc") => t (string< "ab" "abc") => t (string< "abc" "") => nil (string< "abc" "ab") => nil (string< "" "") => nil |
string-lessp
はstring<
の別名。どちらの文字列も比較のためにマルチバイトに変換するので (see 節 32.1 テキスト表現)、 ユニバイト文字列とマルチバイトが等しくなる場合もある。 ignore-caseがnil
でなければ、大文字小文字を区別しないので、 大文字は小文字に等しくなる
2つの文字列の指定部分が一致すれば、値はt
。 さもなければ、値は何文字目までが一致してどちらの文字列が小さいかを示す。 その絶対値は、2つの文字列の始めから一致した文字の個数に1を加えたもの。 string1(の指定部分)が小さいならば符号は負になる。
assoc
と同様に動作するが、 keyは文字列である必要があり、 compare-strings
を用いて比較する点が異なる。 大文字小文字を区別しないで比較する。assoc
と同様に動作するが、 keyは文字列である必要があり、 compare-strings
を用いて比較する点が異なる。 大文字小文字を区別して比較する。バッファ内のテキストを比較する 31.3 テキストの比較のcompare-buffer-substrings
も参照してください。 文字列に対して正規表現の一致を取る関数string-match
は、 ある種の文字列比較に使えます。 See 節 33.3 正規表現の探索。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、文字や文字列と整数のあいだの変換関数について説明します。 format
とprin1-to-string
(see 節 18.5 出力関数)は、 Lispオブジェクトを文字列に変換するために使えます。 read-from-string
(see 節 18.3 入力関数)は、 Lispオブジェクトの文字列表現をオブジェクトに『変換』できます。 関数string-make-multibyte
とstring-make-unibyte
は、 文字列のテキスト表現を変換します(see 節 32.2 テキスト表現の変換)。
テキスト文字と一般の入力イベントのテキスト表現を生成する関数 (single-key-description
とtext-char-description
)については、 See 節 23. 説明文。 これらの関数は、主に、ヘルプメッセージの作成に使います。
string
のほうがより汎用であるので、 この関数はほぼ廃れている。 see 節 4.3 文字列の作成。
(string-to-char "ABC") => 65 (string-to-char "xyz") => 120 (string-to-char "") => 0 (string-to-char "\000") => 0 |
この関数は、存続させるほど有用でなければ、将来、取り除くかもしれない。
(number-to-string 256) => "256" (number-to-string -23) => "-23" (number-to-string -23.5) => "-23.5" |
int-to-string
は、この関数のほぼ廃れている別名。
4.7 文字列の書式付けのformat
も参照。
nil
以外ならば、これを基数として整数に変換する。 baseがnil
ならば10を基数とする。 浮動小数点数の変換はつねに10を基数とする。 浮動小数点数に対しては別の基数を実装していない。 作業量も多くそのわりには有用とも思えないからである。
解析するとき、stringの先頭にある空白やタブは無視し、 数と解釈できる限りをstringから読み取る。 (先頭の空白やタブ以外の他の白文字を無視するシステムもある。) 無視した白文字のあとの最初の文字が、数字文字、プラス記号、 マイナス記号でなければ、この関数は0を返す。
(string-to-number "256") => 256 (string-to-number "25 is a perfect square.") => 25 (string-to-number "X256") => 0 (string-to-number "-4.5") => -4.5 |
文字列へ/から変換するその他の関数を以下にあげておきます。
concat
concat
は、ベクトルやリストを文字列へ変換する。 see 節 4.3 文字列の作成。
vconcat
vconcat
は、文字列をベクトルへ変換する。 see 節 6.5 ベクトル向け関数。
append
append
は、文字列をリストへ変換する。 see 節 5.5 コンスセルとリストの構築。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
書式付け(formatting)とは、 定数文字列内のさまざま部分を計算値で置き換えた文字列を作ることです。 この文字列は、文字列自体に加えて、 他の値をどのように表示するかも制御します。 この文字列を書式付け文字列(format string)と呼びます。
書式付けは、表示するメッセージを計算する場合に便利です。 実際、関数message
と関数error
には、 ここで説明するのと同じ書式付け機能があります。 それらとformat
との違いは、 書式付けした結果をどのように利用するかです。
書式付け指定は`%'で始まる文字の列です。 したがって、string内に`%d'があると、 関数format
はそれを書式付けすべき値の1つ (引数objectsの1つ)の表示表現で置き換えます。 たとえば、つぎのとおりです。
(format "The value of fill-column is %d." fill-column) => "The value of fill-column is 72." |
stringに2個以上の書式付け指定がある場合、 書式付け指定はobjectsの後続の値に対応します。 つまり、stringの最初の書式付け指定は最初の値を使い、 2番目の書式付け指定は2番目の値を使い、といった具合です。 (値が対応しない)余計な書式付け指定は、 予測不可能なふるまいを引き起こします。 余計な値は無視します。
特定の書式付け指定は、特定の型の値を必要とします。 要求に適合しない値を読者が指定するとエラーを通知します。
有効な書式付け指定をつぎに示します。
prin1
ではなくprinc
を用いる。see 節 18.5 出力関数) 表示表現で置き換える。 したがって、文字列は`"'文字なしでその内容を表示し、 シンボルは`\'文字なしで表示する。
対応するオブジェクトがなければ空文字列を使う。
prin1
を用いる。see 節 18.5 出力関数) 表示表現で置き換える。 したがって、文字列は`"'文字で囲んで表示し、 シンボルは特別な文字のまえには`\'文字を付けて表示する。
対応するオブジェクトがなければ空文字列を使う。
(format "%% %d" 30)
は"% 30"
を返す。上記以外の書式付け文字は、エラー`Invalid format operation'になります。
例をいくつか示します。
(format "The name of this buffer is %s." (buffer-name)) => "The name of this buffer is strings.texi." (format "The buffer object prints as %s." (current-buffer)) => "The buffer object prints as strings.texi." (format "The octal value of %d is %o, and the hex value is %x." 18 18 18) => "The octal value of 18 is 22, and the hex value is 12." |
すべての書式付け文字には、`%'とその文字のあいだに、 数前置子を指定できます。 省略可能な数前置子はオブジェクトの最小幅を指定します。 オブジェクトの表示表現がこの幅より小さい場合、パディングします。 数前置子が正ならば(あるいはゼロで始まれば)左側にパディングし、 数前置子が負ならば右側にパディングします。 パディング文字は、通常、空白ですが、 数前置子がゼロで始まれば、ゼロでパディングします。 パディングの例を示します。
(format "%06d is padded on the left with zeros" 123) => "000123 is padded on the left with zeros" (format "%-6d is padded on the right" 123) => "123 is padded on the right" |
format
は、どんな幅を指定しても、 オブジェクトの表示表現を切り詰めることはありません。 つまり、情報を失うことなく、数前置子を使って最小の桁幅を指定できます。
つぎの3つの例において、`%7s'は最小幅7を指定します。 最初の例では、`%7s'に置き換わる文字列は3文字ですから、 パディングとして空白4個を挿入します。 2番目の例では、文字列"specification"
は13文字幅ですが切り詰めません。 3番目の例では、右側にパディングします。
(format "The word `%7s' actually has %d letters in it." "foo" (length "foo")) => "The word ` foo' actually has 3 letters in it." (format "The word `%7s' actually has %d letters in it." "specification" (length "specification")) => "The word `specification' actually has 13 letters in it." (format "The word `%-7s' actually has %d letters in it." "foo" (length "foo")) => "The word `foo ' actually has 3 letters in it." |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
大文字小文字変換関数は、1文字や文字列内の大文字小文字を変更します。 関数は、通常、アルファベット文字 (非ASCII文字のアルファベットに加えて、 `A'から`Z'と`a'から`z')だけを変換します。 それ以外の文字は変わりません。 (大文字小文字テーブルを指定して異なる大文字小文字変換を指定できる。 see 節 4.9 大文字小文字テーブル)
これらの関数は、引数として渡した文字列は変更しません。
以下の例では、文字`X'と`x'を使います。 ASCIIコードは、それぞれ、88と120です。
downcase
の引数が文字列であると、 この関数は、引数の各文字の大文字を小文字に変換した新たな文字列を作成する。 downcase
の引数が文字であると、 downcase
は対応する小文字を返す。 この値は整数である。 もとの文字が小文字であったりアルファベット文字でなければ、 値はもとの文字に等しい。
(downcase "The cat in the hat") => "the cat in the hat" (downcase ?X) => 120 |
upcase
の引数が文字列であると、 この関数は、引数の各文字の小文字を大文字に変換した新たな文字列を作成する。
upcase
の引数が文字であると、 upcase
は対応する大文字を返す。 この値は整数である。 もとの文字が大文字であったりアルファベット文字でなければ、 値はもとの文字に等しい。
(upcase "The cat in the hat") => "THE CAT IN THE HAT" (upcase ?x) => 88 |
単語の定義は、現在の構文テーブル(See 節 34.2.1 構文クラス一覧)において 単語構成文字に分類された文字が連続した列である。
capitalize
の引数が文字の場合には、 capitalize
はupcase
の結果と同じである。
(capitalize "The cat in the hat") => "The Cat In The Hat" (capitalize "THE 77TH-HATTED CAT") => "The 77th-Hatted Cat" (capitalize ?x) => 88 |
単語の定義は、現在の構文テーブル(See 節 34.2.1 構文クラス一覧)において 単語構成文字に分類された文字が連続した列である。
(upcase-initials "The CAT in the hAt") => "The CAT In The HAt" |
文字列を比較する関数については、See 節 4.5 文字と文字列の比較。 これらは、大文字小文字を区別しないものもあれば、 場合によって大文字小文字を区別しないものもある。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
特別な大文字小文字テーブル(case table)をインストールすれば、 大文字小文字変換をカスタマイズできます。 大文字小文字テーブルは、大文字と小文字の対応関係を指定します。 このテーブルは、Lispオブジェクトの大文字小文字変換関数(前節参照)と バッファ内のテキストに作用する大文字小文字変換関数(see 節 31.18 大文字小文字の変更)の 両方に影響します。 各バッファごとに大文字小文字テーブルがあります。 新たなバッファの大文字小文字テーブルを初期化するために使う 標準の大文字小文字テーブルもあります。
大文字小文字テーブルは、サブタイプがcase-table
である 文字テーブル(see 節 6.6 文字テーブル)です。 この文字テーブルは、各文字を対応する小文字に対応付けます。 これには3つの追加スロットがあり、関連するテーブルを保持します。
単純な場合、必要なことは、小文字への対応付けを指定するだけです。 関連する3つのテーブルはこの対応付けから自動的に計算されます。
言語によっては、大文字と小文字の対応関係が1対1でないことがあります。 2つの異なる小文字が同じ大文字に対応することがあります。 このような場合、大文字から小文字への対応付けと、 小文字から大文字への対応付けの両方を指定する必要があります。
追加のテーブルcanonicalize(正則)は、各文字を正則文字に対応付けます。 2つの任意の文字が大文字小文字変換で関連付けられている場合、 その2つの文字は同一の正則文字を持ちます。 たとえば、`a'と`A'は、大文字小文字変換で関連付けられているので、 これらは同一の正則文字を持つはずです (両方の文字に対して`a'であるか、両方の文字に対して`A'である)。
追加のテーブルequivalences(同値)は、 同じ正則クラス(同一の正則文字を持つ文字群)の文字を巡回して対応付けます。 (普通のASCIIでは、`a'を`A'に対応付け、 `A'を`a'に対応付ける。 各正則クラスについても同様。)
大文字小文字テーブルを作成するときには、 canonicalize(正則)にはnil
を指定できます。 そうすると、Emacsはこのスロットを小文字と大文字の対応付けから埋めます。 equivalences(同値)にもnil
を指定できます。 そうすると、Emacsはこのスロットをcanonicalize(正則)から埋めます。 実際に使用している大文字小文字テーブルでは、 これらの要素はnil
以外です。 canonicalize(正則)を指定せずに equivalences(同値)を指定しないでください、
つぎに、大文字小文字テーブルを操作する関数を示します。
nil
以外を返す。以下の3つ関数は、非ASCII文字集合を定義するパッケージ向けの 便利なサブルーティンです。 これらは、指定した大文字小文字テーブルcase-tableを変更します。 さらに、標準の構文テーブルも変更します。 See 節 34. 構文テーブル。 普通、標準の大文字小文字テーブルを変更するためにこれらの関数を使います。
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |