GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Strings.html ・ emacs-doc.conao3.com

4.3 文字列の作成

以下の関数は、文字列をゼロから作成したり、文字列を連結したり、あるいは分割したりして生成します。(string-replace や replace-regexp-in-string のように、他の文字列の変更後の内容に基づいて文字列を生成する関数については、検索と置換を参照してください。)

関数: make-string count character &optional multibyte

この関数は、character を count 回繰り返した文字列を返します。count が負の値の場合、エラーが通知されます。

(make-string 5 ?x)
     ⇒ "xxxxx"
(make-string 0 ?x)
     ⇒ ""

通常、character が ASCII 文字である場合、結果はユニバイト文字列となります。しかし、オプション引数 multibyte が nil 以外の場合、この関数は代わりにマルチバイト文字列を生成します。これは、後で結果を非 ASCII 文字列と連結したり、一部の文字を非 ASCII 文字に置換したりする必要がある場合に有用です。

これと比較すべき他の関数には、make-vector(ベクトルを参照)やmake-list(Consセルとリストの構築を参照)があります。

関数: string &rest characters

これは、characters という文字を含む文字列を返します。

(string ?a ?b ?c)
     ⇒ "abc"
関数: substring string &optional start end

この関数は、string のうち、インデックス start の文字から(含む)インデックス end の文字まで(ただし含まない)の文字で構成される新しい文字列を返します。最初の文字のインデックスは 0 です。start が省略された場合、または nil が指定された場合は、デフォルトで最初の文字となります。end が省略された場合、または nil が指定された場合は、string の長さを表します。

引数が1つの場合、この関数は単に string をコピーします。

(substring "abcdefg" 0 3)
     ⇒ "abc"

上記の例では、‘a’のインデックスは0、‘b’のインデックスは1、‘c’のインデックスは2となります。インデックス3—文字列の4番目の文字—は、部分文字列がコピーされる文字位置を示します。したがって、‘abc’は文字列"abcdefg"からコピーされます。

負の数は文字列の末尾から数えられるため、−1は文字列の最後の文字のインデックスを表します。例えば:

(substring "abcdefg" -3 -1)
     ⇒ "ef"

この例では、‘e’のインデックスは−3、‘f’のインデックスは−2、‘g’のインデックスは−1となります。したがって、‘e’と‘f’は含まれ、‘g’は除外されます。

end に nil を用いる場合、それは文字列の長さを表します。したがって、

(substring "abcdefg" -3 nil)
     ⇒ "efg"

引数 end を省略することは、nil を指定することと同等である。したがって、(substring string 0) は string 全体のコピーを返すことになる。

(substring "abcdefg" 0)
     ⇒ "abcdefg"

ただし、この目的には copy-sequence を推奨します(シーケンス を参照)。

string からコピーされた文字にテキストプロパティがある場合、そのプロパティも新しい文字列にコピーされます。テキストプロパティを参照してください。

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(バッファ内容の確認を参照)と比較してください。文字列の先頭はインデックス 0 ですが、バッファの先頭はインデックス 1 です。

関数: substring-no-properties string &optional start end

これは substring と同様に動作しますが、値からすべてのテキストプロパティを削除します。また、start は省略可能であり、nil は 0 と同等です。したがって、(substring-no-properties string) はすべてのテキストプロパティが削除された string のコピーを返します。

関数: concat &rest sequences

この関数は、渡された引数に含まれる文字(および、あればそのテキストプロパティ)からなる文字列を返します。引数には文字列、数値のリスト、または数値のベクトルを指定でき、引数自体が変更されることはありません。concat に引数が渡されない場合は、空文字列を返します。

(concat "abc" "-def")
     ⇒ "abc-def"
(concat "abc" (list 120 121) [122])
     ⇒ "abcxyz"
;; nil is an empty sequence.
(concat "abc" nil "-def")
     ⇒ "abc-def"
(concat "The " "quick brown " "fox.")
     ⇒ "The quick brown fox."
(concat)
     ⇒ ""

この関数は、必ずしも新しい文字列を割り当てるとは限りません。呼び出し側は、結果が新しい文字列であることや、既存の文字列に対する eq であることに依存しないよう注意してください。

特に、返された値を変更することで、意図せず別の文字列が変更されたり、プログラム内の定数文字列が書き換えられたり、さらにはエラーが発生したりする可能性があります。安全に変更できる文字列を得るには、結果に対して copy-sequence を使用してください。

与えられたソース文字列 source を n 回繰り返した文字列を作成する必要がある場合は、次のように concat を使用できます。

  (apply #'concat (make-list n source))

これは、concat が任意の種類のシーケンスを引数として取れるという事実を利用したものです。

その他の連結関数に関する情報については、マッピング関数のmapconcat、ベクトル用関数のvconcat、およびConsセルとリストの構築のappendの説明を参照してください。個別のコマンドライン引数を文字列に連結してシェルコマンドとして使用する場合は、combine-and-quote-stringsを参照してください。

関数: split-string string &optional separators omit-empty trim

この関数は、正規表現 separators(正規表現を参照)に基づいて string を部分文字列に分割します。separators の各マッチ箇所が分割点となり、分割点間の部分文字列がリストにまとめられて返されます。

separators が nil である(または省略されている)場合、デフォルト値は split-string-default-separators となり、関数は omit-empty が t であるかのように動作します。

omit-empty が nil (または省略)の場合、separators のマッチが2回連続する場合、またはマッチが string の先頭もしくは末尾に隣接する場合、結果に空文字列が含まれます。omit-empty が t の場合、これらの空文字列は結果から省略されます。

オプション引数 trim が nil 以外の場合、各部分文字列の先頭と末尾からトリミングするテキストにマッチする正規表現を指定する必要があります。前述の通り omit-empty が t である場合、トリミングによって部分文字列が空になり、結果から除外されることがあります。

文字列を call-process や start-process に適した個別のコマンドライン引数のリストに分割する必要がある場合は、split-string-and-unquote を参照してください。

separators に空文字列と一致する値を指定しないでください。結果が予測不能になります。文字列を個々の文字に分割するには、string-to-list または string-to-vector を使用してください。

例:

(split-string "  one  two   ")            ⇒ ("one" "two")
(split-string "one::two:" ":")            ⇒ ("one" "" "two" "")
(split-string "one::two:" ":+")           ⇒ ("one" "two" "")
(split-string "one::two:" ":" t)          ⇒ ("one" "two")
(split-string "one: : two : " ":" t " +") ⇒ ("one" "two")
変数: split-string-default-separators

split-string の separators の既定値。通常の値は "[ \f\t\n\r\v]+" です。

関数: string-clean-whitespace string

string 内の空白を整理し、連続する空白を単一のスペース文字に集約するとともに、string の先頭と末尾にあるすべての空白を削除してください。

関数: string-trim-left string &optional regexp

string から regexp に一致する先頭のテキストを削除します。regexp のデフォルト値は ‘[ \t\n\r]+’ です。

関数: string-trim-right string &optional regexp

string から regexp に一致する末尾のテキストを削除します。regexp のデフォルト値は ‘[ \t\n\r]+’ です。

関数: string-trim string &optional trim-left trim-right

string から、trim-left に一致する先頭のテキストと trim-right に一致する末尾のテキストを削除します。どちらの正規表現もデフォルトでは ‘[ \t\n\r]+’ となります。

関数: string-fill string width

string を、行幅が width を超えないようにワードラップしようと試みます。埋め合わせは空白境界でのみ行われます。width より長い単語が個別に存在する場合、それらは短縮されないため、その場合 string は width より広い行幅で表示される可能性があります。

関数: string-limit string length &optional end coding-system

string が length 文字より短い場合は、string をそのまま返します。そうでない場合は、string の先頭 length 文字からなる部分文字列を返します。オプションの end パラメータが指定されている場合は、代わりに length 文字分の文字列を返します。

coding-system が nil 以外の場合、string は制限前にエンコードされ、その結果は length バイトよりも短いユニバイト文字列となります。string に複数のバイトでエンコードされる文字が含まれている場合(例えば utf-8 を使用する場合など)、結果として得られるユニバイト文字列が文字表現の途中で切り詰められることはありません。

この関数は文字列の長さを文字またはバイト単位で計測するため、表示目的で文字列を短くする必要がある場合には一般的に適していません。代わりに truncate-string-to-width や window-text-pixel-size または string-glyph-split を使用してください(表示テキストのサイズ を参照)。

関数: string-lines string &optional omit-empty keep-newlines

string を改行境界で文字列のリストに分割します。オプション引数 omit-empty が nil 以外の場合、結果から空行を削除します。オプション引数 keep-newlines が nil 以外の場合、結果の文字列から末尾の改行を削除しません。

関数: string-pad string length &optional padding start

paddingをパディング文字として使用し、stringを指定されたlengthの長さに揃えます。paddingのデフォルトはスペース文字です。stringがlengthより長い場合は、パディングは行われません。startがnilであるか、または省略されている場合、パディングはstringの文字の末尾に追加され、nil以外の場合は、stringの文字の先頭に追加されます。

関数: string-chop-newline string

string から末尾の改行(もしあれば)を削除します。