For Gauche 0.9.5


Next: , Previous: , Up: ライブラリモジュール - SRFI   [Contents][Index]

11.6 srfi-13 - 文字列ライブラリ

Module: srfi-13

文字列に関連する関数の大きなセットを定義しています。 Gaucheでは、それらの関数はいくつかのファイルに分割されており、 (use srfi-13)というフォームは単にそれらのファイルの オートロードのセットアップをするだけです。 したがって、スクリプトのスタートアップを遅くするようなことは ありません。 詳細な仕様とデザインに関する議論については、SRFI-13 (SRFI-13) を参照して下さい。 このマニュアルは、関数のAPIのリファレンスとして提供されます。 いくつかのSRFI-13の関数は、Gaucheのビルトインになっており、 ここにはリストされていないものもあります。 注意: SRFI-13のドキュメントは、これらの関数を実装するモジュールの 名前を“string-lib”と“string-lib-internals”とすることを推奨しています。 Gaucheでは、一貫性のために“srfi-13”と名付けています。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.1 一般規約

文字列ライブラリのAPIにはいくつか共通するものがありますが、 それぞれの関数の説明において繰り返しません。

引数の仕様

以下の引数名はその型を暗に表しています。

s, s1, s2

これらの引数は文字列でなければなりません。

char/char-set/pred

この引数は、文字、文字セットオブジェクト、あるいは1つの文字を引数に取り 真偽値を返す述語のいずれかです。“文字にchar/char-set/predを適用する” の意味はそれぞれ、char/char-set/predが文字ならば与えられた文字と比較される、 char/char-set/predが文字セットならばその文字セットに与えられた文字が 含まれるかを検査する、char/char-set/predが述語ならばそれを与えられた 文字に適用する、となります。“ある文字がchar/char-set/predを満足する” とは、その文字への前述のような適用が真値を返すという意味になります。

start, end

SRFI-13の関数の多くは、その操作が実行される対象入力文字列の 範囲を限定する開始インデックスと終了インデックスをオプショナルな 引数として取ります。開始(start番目)の文字は含まれ、 終了(end番目)の文字は含まれません。 これらが指定されるとき、0 <= start <= end <= length of the stringが 満たされなければなりません。startendのデフォルト値は、 それぞれ0と文字列の長さです。

sharedバージョン

いくつかの関数は、その名前に“/shared”が付きます。 SRFI-13では、それらの関数はより良いパフォーマンスのために 入力文字列の一部を共有しても良いと定義しています。 Gaucheは、共有文字列という概念を持っていませんし、 それらの関数は単に共有でないバージョンの変名に過ぎません。 しかし、Gaucheは内部的には文字列の保存場所を共有しているので、 一般的には部分文字列をコピーするオーバヘッドについて心配する 必要はありません。

rightバージョン

ほとんどの関数は、入力文字列を左から右へと扱います。 いくつかの関数は、その名前に“-right”が付き、右から左へと 扱うものがあります。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.2 文字列についての述語

Function: string-null? s

[SRFI-13] sが空文字列、""なら、#tを返します。

Function: string-every char/char-set/pred s :optional start end

[SRFI-13] sに含まれる全ての文字がchar/char-set/predを 満足するかを検査します。満足するならば、string-everyは 最後に適用されたchar/char-set/predが返した値を戻り値とします。 どの適用も#fを返した場合は、string-everyはすぐに #fを返します。

Function: string-any char/char-set/pred s :optional start end

[SRFI-13] sに含まれるいずれかの文字がchar/char-set/pred を満足するかを検査します。いずれかの文字が満足するならば、 string-anyはその適用が返した値を戻り値とします。 どの文字もchar/char-set/predを満たさなければ、#fが返ります。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.3 文字列の構築子

Function: string-tabulate proc len

[SRFI-13] procは整数を1つ引数として取り文字を返す手続きで なければなりません。string-tabulateは、そのi番目の 文字が(proc i)で計算されるような文字列を返します。

(string-tabulate
  (lambda (i) (integer->char (+ i #x30))) 10)
 ⇒ "0123456789"
Function: reverse-list->string char-list

[SRFI-13] ≡ (list->string (reverse char-list)).


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.4 文字列の選択

Function: substring/shared s start :optional end

[SRFI-13] Gaucheでは、引数endがオプショナルであることを除いて、 substringと同じです。

(substring/shared "abcde" 2) ⇒ "cde"
Function: string-copy! target tstart s :optional start end

[SRFI-13] 文字列sを、文字列targettstart番目以降へコピーします。 target文字列は変更可能でなければなりません。 オプションの引数startendは、sの範囲を制限します。 コピーされた文字列がtargetの終端を越えたらエラーが通知されます。

(define s (string-copy "abcde"))
(string-copy! s 2 "ZZ")
s ⇒ "abZZe"

targetsに同じ文字列を渡しても構いません。コピー元とコピー先の 領域が重なっていても、コピーは常に正しく行われます。

Function: string-take s nchars
Function: string-drop s nchars
Function: string-take-right s nchars
Function: string-drop-right s nchars

[SRFI-13] string-takeは、sの最初のnchars文字からなる文字列を返します。 string-dropは、sから最初のnchars文字からなる文字列を 除いた残りを返します。*-rightバージョンは、文字列の最後から数えます。 返される文字列はいつもsのコピーであり、どの文字も削除されないことが 保証されています。

(string-take "abcde" 2) ⇒ "ab"
(string-drop "abcde" 2) ⇒ "cde"

(string-take-right "abcde" 2) ⇒ "de"
(string-drop-right "abcde" 2) ⇒ "abc"
Function: string-pad s len :optional char start end
Function: string-pad-right s len :optional char start end

[SRFI-13] 文字列slenより短い場合は、charがそれぞれ左か 右にパディングされた長さlenの文字列を返します。 slenよりも長い場合は、len文字が右端か左端から 取り除かれます。Charのデフォルト値は#\spaceです。 startendが与えられると、sの部分文字列がソース 文字列として使われます。

(string-pad "abc" 10)    ⇒ "       abc"
(string-pad "abcdefg" 3) ⇒ "efg"

(string-pad-right "abc" 10) ⇒ "abc       "

(string-pad "abcdefg" 10 #\+ 2 5)
  ⇒ "+++++++cde"
Function: string-trim s :optional char/char-set/pred start end
Function: string-trim-right s :optional char/char-set/pred start end
Function: string-trim-both s :optional char/char-set/pred start end

[SRFI-13] sからchar/char-set/predにマッチする文字を削除します。 String-trimsの左から文字を削除し、 string-trim-rightは右から、string-trim-bothは 両端から削除します。 Char/char-set/predのデフォルト値は#[\s]、つまり空白文字の 文字セットです。startendが与えられると、sの部分文字列が ソース文字列として使われます。

(string-trim "   abc  ")       ⇒ "abc  "
(string-trim-right "   abc  ") ⇒ "   abc"
(string-trim-both "   abc  ")  ⇒ "abc"

Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.5 文字列の色々な比較

Function: string-compare s1 s2 proc< proc= proc> :optional start1 end1 start2 end2
Function: string-compare-ci s1 s2 proc< proc= proc> :optional start1 end1 start2 end2

[SRFI-13] 文字列s1s2をコードポイント毎に左から比較します。 不一致がs1のインデックスkで見つかった場合、対応するs2の コードポイントよりs1のコードポイントの方が小さければ proc<kを引数にして呼び出し、逆に大きければ proc>kを引数にして呼び出します。 二つの文字列が等しければ、proc=が、s1の比較された最後のインデックスを 引数にして呼び出されます。

(string-compare "abcd" "abzd"
                (^i `(< ,i)) (^i `(= ,i)) (^i `(> ,i)))
  ⇒ (< 2)

(string-compare "abcd" "abcd"
                (^i `(< ,i)) (^i `(= ,i)) (^i `(> ,i)))
  ⇒ (= 3)

省略可能引数は入力の文字列の比較すべき範囲を制限します。 但し、proc<proc=proc>に渡されるインデックスは 常にs1の最初から数えたものになります。

(string-compare "zzabcdyy" "abcz"
   (^i `(< ,i)) (^i `(= ,i)) (^i `(> ,i)) 2 6 0 4)
 ⇒ (< 5)

(string-compare "zzabcdyy" "abcz"
   (^i `(< ,i)) (^i `(= ,i)) (^i `(> ,i)) 2 5 0 3)

 ⇒ (= 4)

string-compare-ciは大文字小文字を区別しない比較です。 文字毎の大文字小文字変換を行って比較するので、文字列の長さが変わる 大文字小文字変換のケース (ドイツ語のエスツェット等) は考慮されません。

Function: string= s1 s2 :optional start1 end1 start2 end2
Function: string<> s1 s2 :optional start1 end1 start2 end2
Function: string< s1 s2 :optional start1 end1 start2 end2
Function: string<= s1 s2 :optional start1 end1 start2 end2
Function: string> s1 s2 :optional start1 end1 start2 end2
Function: string>= s1 s2 :optional start1 end1 start2 end2

[SRFI-13] 二つの文字列s1s2を比較します。省略可能引数で それぞれの文字列の一部のみを比較するように指定できます。 比較は文字ごとに行われます。

註: 組み込み手続きのstring=?等も文字毎の比較に使えますが、 引数の取り方が違います。文字列の比較参照。

Function: string-ci= s1 s2 :optional start1 end1 start2 end2
Function: string-ci<> s1 s2 :optional start1 end1 start2 end2
Function: string-ci< s1 s2 :optional start1 end1 start2 end2
Function: string-ci<= s1 s2 :optional start1 end1 start2 end2
Function: string-ci> s1 s2 :optional start1 end1 start2 end2
Function: string-ci>= s1 s2 :optional start1 end1 start2 end2

[SRFI-13] 二つの文字列s1s2を、大文字小文字を区別せずに比較します。 省略可能引数でそれぞれの文字列の一部のみを比較するように指定できます。 大文字小文字の畳み込みと比較は文字ごとに行われます。複数の文字に 影響を与えるような大文字小文字の畳み込みは考慮しません。

註: Gaucheには他に2種類の大文字小文字を区別しない文字列比較手続き群があります。 どちらもstring-ci=?等のようにクエスチョンマーク付きの名前を持っています。 Gauche組み込みのものは文字毎に大文字小文字を畳み込みます (文字列の比較参照)。一方、gauche.unicodeにあるものは 文字列としての畳み込みを行います(Full string case conversion参照)。 R7RS版は後者です。

Function: string-hash s :optional bound start end
Function: string-hash-ci s :optional bound start end

[SRFI-13] (註: Gaucheは、SRFI-128に準拠したstring-hashstring-ci-hashを 組み込みで持っています。詳しくはハッシュ参照。 SRFI-13のAPIはSRFI-128の上位互換になっています。内部で使っているハッシュ アルゴリズムは一緒なので、省略可能引数を全て省略したSRFI-13のstring-hashは、 組み込みのstring-hashと同じ値を返します。 一方、組み込みのstring-ci-hashは文字列として大文字小文字の畳み込みを 行います(ドイツ語のエスツェットとSSは等しく扱われます)が、SRFI-13の string-hash-ciは文字毎に大文字小文字を畳み込むように定められているので、 結果が異なる可能性があります。特に強い理由がなければ、新しいコードは 組み込みのSRFI-128版を使うことをおすすめします。)

文字列sのハッシュ値を計算して返します。string-hash-ciでは ハッシュ値を計算する前に各文字について大文字小文字を畳み込みを行います。

省略可能引数boundは、与えられたなら正の正確な整数でなければならず、 返される値は0から(- bound 1)までの値に制限されます。 startendは、与えられればs中の対象となる部分文字列を 指定します。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.6 文字列のプリフィックスとサフィックス

Function: string-prefix-length s1 s2 :optional start1 end1 start2 end2
Function: string-suffix-length s1 s2 :optional start1 end1 start2 end2
Function: string-prefix-length-ci s1 s2 :optional start1 end1 start2 end2
Function: string-suffix-length-ci s1 s2 :optional start1 end1 start2 end2

[SRFI-13] 二つの文字列s1s2の、共通するプレフィクスもしくはサフィックスの 長さを返します。省略可能引数はそれぞれの文字列の探索範囲を限定します。 *-ci版は文字ごとに、大文字小文字を区別しない比較を行います。

(string-prefix-length "abacus" "abalone")   ⇒ 3
(string-prefix-length "machine" "umbrella") ⇒ 0
(string-suffix-length "peeking" "poking")   ⇒ 4

(string-prefix-length "obvious" "oblivious" 2 7 4 9)
  ⇒ 5
Function: string-prefix? s1 s2 :optional start1 end1 start2 end2
Function: string-suffix? s1 s2 :optional start1 end1 start2 end2
Function: string-prefix-ci? s1 s2 :optional start1 end1 start2 end2
Function: string-suffix-ci? s1 s2 :optional start1 end1 start2 end2

[SRFI-13] それぞれ、s2s1のプレフィクスまたはサフィックスになっていた場合に #tを、それ以外の場合に#fを返します。 省略可能引数はそれぞれの文字列の探索範囲を限定します。 *-ci版は文字ごとに、大文字小文字を区別しない比較を行います。

(string-prefix? "scheme" "sch")   ⇒ #t
(string-prefix? "scheme" "lisp")  ⇒ #f

(string-prefix? "mit-scheme" "scheme" 4) ⇒ #t

Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.7 文字列の探索

Function: string-index s char/char-set/pred :optional start end
Function: string-index-right s char/char-set/pred :optional start end

[SRFI-13] 文字列sの中で、char/char-set/predにマッチする 最初の要素を探し、そのインデックスを返します。 sの中にchar/char-set/predが見つからない場合は、#fを 返します。オプションのstartendは、sの中で検索対象と なる範囲を制限します。

(string-index "Aloha oe" #\a) ⇒ 4
(string-index "Aloha oe" #[Aa]) ⇒ 0
(string-index "Aloha oe" #[\s]) ⇒ 5
(string-index "Aloha oe" char-lower-case?) ⇒ 1
(string-index "Aloha oe" #\o 3) ⇒ 6

ポータビリティよりも速度を重視する場合は、Gaucheのビルトイン手続き string-scan(文字列を扱うその他の手続き)を参照して下さい。

Function: string-skip s char/char-set/pred :optional start end
Function: string-skip-right s char/char-set/pred :optional start end

[SRFI-13] char/char-set/predにマッチしない最初の要素を探し、 そのインデックスを返します。そのような要素が見つからない場合、#fを 返します。オプションのstartendは、sの中で検索対象と なる範囲を制限します。

Function: string-count s char/char-set/pred :optional start end

[SRFI-13] sの中で、char/char-set/predにマッチする要素の数を カウントします。オプションのstartendは、sの中で検索対象と なる範囲を制限します。

Function: string-contains s1 s2 :optional start1 end1 start2 end2
Function: string-contains-ci s1 s2 :optional start1 end1 start2 end2

[SRFI-13] s1の中で、文字列s2を探します。見つかった場合は、 s1でマッチした文字列が始まるインデックスを返します。そうでなければ、 #fを返します。 オプションのstart1end1start2end2は、 s1s2の範囲を制限します。

ポータビリティよりも速度を重視する場合は、Gaucheのビルトイン手続き string-scan(文字列を扱うその他の手続き)を参照して下さい。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.8 文字列のケース(大文字小文字)マッピング

Function: string-titlecase s :optional start end
Function: string-titlecase! s :optional start end
Function: string-upcase s :optional start end
Function: string-upcase! s :optional start end
Function: string-downcase s :optional start end
Function: string-downcase! s :optional start end

[SRFI-13] 文字列sをタイトルケース、大文字、小文字にそれぞれ変換します。 これらの手続きは、文字ごとにchar-upcase等を使った変換を行います。 すなわち、string-upcasestring-downcaseは以下の操作と 考えることができます。

(string-upcase s)
  ≡ (string-map char-upcase s)
(string-downcase s)
  ≡ (string-map char-downcase s)

一文字がケース変換によって複数文字になるような場合も考慮したい場合は、 gauche.unicodeモジュールに定義されている同名の手続きを使ってください (Full string case conversion参照)。

string-titlecase!string-upcase!string-downcase!はその場で更新するバージョンで、sを破壊的に 変更します。ただし、Gaucheでは文字列の変更は新たな文字列を作るのと効率的に 何ら変わりがありません。これらの手続きは互換性のためだけに用意されています。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.9 文字列の反転と追加

Function: string-reverse s :optional start end
Function: string-reverse! s :optional start end

[SRFI-13] sの文字の位置を逆順にした文字列を返します。 string-reverse!sそのものを変更します。

(string-reverse "mahalo") ⇒ "olaham"
(string-reverse "mahalo" 3) ⇒ "ola"
(string-reverse "mahalo" 1 4) ⇒ "aha"

(let ((s (string-copy "mahalo")))
  (string-reverse! s 1 5)
  s)
  ⇒ "mlahao"
Function: string-concatenate string-list

[SRFI-13] 文字列のリストを連結します。

(string-concatenate '("humuhumu" "nukunuku" "apua" "`a"))
  ⇒ "humuhumunukunukuapua`a"
Function: string-concatenate/shared string-list
Function: string-append/shared s …

[SRFI-13] string-concatenatestring-appendの“共有” バージョンです。Gaucheでは、これらは単に別名です。

Function: string-concatenate-reverse string-list
Function: string-concatenate-reverse/shared string-list

[SRFI-13] string-listを連結する前に逆順にします。 Gaucheでは、“共有”バージョンは全く同じ動作をします。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.10 文字列のマッピング

Function: string-map proc s :optional start end
Function: string-map! proc s :optional start end

[SRFI-13] string-mapは、sの全ての文字に対してprocを 適用し、その結果を文字列に集めそれを返します。 一方、string-map!sそのものを変更します。

(string-map char-upcase "wikiwiki") ⇒ "WIKIWIKI"
(string-map char-upcase "wikiwiki" 4) ⇒ "WIKI"

(let ((s (string-copy "wikiwiki")))
  (string-map! char-upcase s 4)
  s)
  ⇒ "wikiWIKI"
Function: string-fold kons knil s :optional start end
Function: string-fold-right kons knil s :optional start end

[SRFI-13] 文字列に対して動作するfoldfold-right (リストをたどる手続き参照) です。

(string-fold cons '() "abcde")
  ⇒ (#\e #\d #\c #\b #\a)
(string-fold-right cons '() "abcde")
  ⇒ (#\a #\b #\c #\d #\e)
Function: string-unfold p f g seed :optional base make-final

[SRFI-13] A fundamental string builder. The p, f and g are procedures, taking the current seed value. The stop predicate p determines when to stop: If it returns a true value, string building stops. The mapping function f returns a character from the current seed value. The next seed function g returns a next seed value from the current seed value. The seed argument gives the initial seed value.

(string-unfold (^n (= n 10))
               (^n (integer->char (+ n 48)))
               (^n (+ n 1))
               0)
  ⇒ "0123456789"

The optional argument base is, when given, prepended to the result string. Another optional argument make-final is a procedure that takes the last return value of g and returns a string that becomes the suffix of the result string.

(string-unfold (^n (= n 10))
               (^n (integer->char (+ n 48)))
               (^n (+ n 1))
               0 "foo" x->string)
  ⇒ "foo012345678910"
Function: string-unfold-right p f g seed :optional base make-final

[SRFI-13] Another fundamental string builder. The meanings of arguments are the same as ‘string-unfold’. The only difference is that the string is build right-to-left. The optional base, if given, becomes the suffix of result, and the result of make-final becomes the prefix.

(string-unfold-right (^n (= n 10))
                     (^n (integer->char (+ n 48)))
                     (^n (+ n 1))
                     0 "foo" x->string)
  ⇒ "109876543210foo"
Function: string-for-each proc s :optional start end

[SRFI-13] Apply proc on each character of string s, from left to right. Optional start and end arguments limit the range of the input string.

Function: string-for-each-index proc s :optional start end

[SRFI-13] Call proc on each index of the string s.


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.11 文字列のローテーション

Function: xsubstring s from :optional to start end

[SRFI-13] Takes a substring of inifinite repetition of string s between index from (inclusive) and index to (exclusive).

For example, if s is "abcde", we repeat it infinitely to both sides. So 5n-th character for integer n is always #\a, which extends negative n as well.

(xsubstring "abcde" 2 10)
  ⇒ "cdeabcde"
(xsubstring "abcde" -9 -2)
  ⇒ "bcdeabc"
Function: string-xcopy! target tstart s sfrom :optional sto start end

[SRFI-13]


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.12 他の文字列操作

Function: string-replace s1 s2 start1 end1 :optional start2 end2

[SRFI-13] 文字列s1start1文字目(inclusive)からend1文字目(exclusive) までを文字列s2に置き換えた文字列を新たに作って返します。s1, s2は 変更されません。 オプショナルな引数start2end2が与えられた場合は、 s2がまずそれらによって切り取られて置換文字列として使われます。 置き換える隙間の大きさ、つまり(- end1 start1)s2と同じ長さである必要はありません。 実質的に、この手続きは次のコードと等価です。

(string-append (substring s1 0 start1)
               (substring s2 start2 end2)
               (substring s1 end1 (string-length s1)))
Function: string-tokenize s :optional token-set start end

[SRFI-13] 文字列 s を、token-set で指定される文字セットで 構成される、空でない最大限連続した文字のシーケンスのそれぞれを 要素とするリストを返します。 token-set のデフォルト値は char-set:graphic (定義済みの文字セット参照)。

同様の機能を提供する、しかし異なる基準を持つ、Gauche の組み込み手続き string-split (文字列を扱うその他の手続き 参照) も見て下さい。


Next: , Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.13 文字列のフィルタリング

Function: string-filter char/char-set/pred s :optional start end
Function: string-delete char/char-set/pred s :optional start end

[SRFI-13] それぞれ、文字列s中の文字のうちchar/char-set/predで示される テストを通る、または通らない文字からなる文字列を返します。

(string-filter char-upper-case? "Hello, World!")
  ⇒ "HW"

(string-delete char-upper-case? "Hello, World!")
  ⇒ "ello, orld!"

(string-delete #\l "Hello, World!")
  ⇒ "Heo, Word!"

(string-filter #[\w] "Hello, World!")
  ⇒ "HelloWorld"

註: srfi-13は制定後に改訂され、引数char/char-set/predsの 順序が逆になりました。制定時点では引数順は (string-filter s pred)で、Gaucheもそれに従って実装していました。 しかし既存の実装のほとんどは(string-filter pred s)という順序に なっています。srfi-13の参照実装がそうだったからです。

0.9.4からGaucheも現在のsrfi-13の実装に合わせましたが、 以前の仕様で書かれたコードとの互換性を保つため、 引数順を逆にしても動作するようになっています。 新しく書かれるコードは、現在のsrfi-13の引数順を使うのが良いでしょう。


Previous: , Up: 文字列ライブラリ   [Contents][Index]

11.6.14 低レベルな文字列に関する手続き

Function: string-parse-start+end proc s args
Function: string-parse-final-start+end proc s args

[SRFI-13]

Macro: let-string-start+end (start end [rest]) proc-exp s-exp args-exp body …

[SRFI-13]

Function: check-substring-spec proc s start end
Function: substring-spec-ok? s start end

[SRFI-13]

Function: make-kmp-restart-vector s :optional c= start end

[SRFI-13]

Function: kmp-step pat rv c i c= p-start

[SRFI-13]

Function: string-kmp-partial-search pat rv s i :optional c= p-start s-start s-end

[SRFI-13]


Previous: , Up: 文字列ライブラリ   [Contents][Index]