std.string
文字列を扱う関数の集まりです。コピーすべきか、せざるべきか? 関数が文字列を引数として取り文字列を返すとき、 入力と出力は同じ文字列にしてin-placeで書き換えるべきでしょうか? それとも入力と出力は別の文字列にして、入力のコピーを書き換えたものを返すべきでしょうか。 Dの配列処理は "copy-on-write" の慣習を持っています。これはすなわち、 変更がない時は、元々の文字列(あるいはその一部分)を返し、 変更があれば、コピーを返す、という動作をすることを示しています。
- class StringException: object.Exception;
- 文字列関数内でのエラー時に投げられます。
- const char[16] hexdigits;
- 0..9A..F
- const char[10] digits;
- 0..9
- const char[8] octdigits;
- 0..7
- const char[26] lowercase;
- a..z
- const char[26] uppercase;
- A..Z
- const char[52] letters;
- A..Za..z
- const char[6] whitespace;
- ASCIIの空白文字
- const dchar LS;
- UTFの改行文字
- const dchar PS;
- UTFの改段落文字
- const char[2] newline;
- このシステムでの改行文字列
- bool iswhite(dchar c);
- c が空白文字のときtrueを返します。
- long atoi(in string s);
- 文字列を整数値へ変換
- real atof(in string s);
- 文字列を実数値へ変換
- int cmp(in char[] s1, in char[] s2);
int icmp(in char[] s1, in char[] s2); - 二つの文字列を比較します。cmp は大文字小文字を区別します。icmp は区別しません。
Returns:
< 0 s1 < s2 = 0 s1 == s2 > 0 s1 > s2
- char* toStringz(char[] s);
- Dの配列をC風の0終端文字列へ変換します。
s[] の中に \0 が含まれていてはいけません。
- ptrdiff_t find(in char[] s, dchar c);
ptrdiff_t ifind(in char[] s, dchar c);
ptrdiff_t rfind(in char[] s, dchar c);
ptrdiff_t irfind(in char[] s, dchar c); - findと ifind は、文字列 s 中での最初の文字 c の出現を探します。
rfind と irfind は同様に最後の出現を探します。
find, rfind は大文字小文字を区別し、ifind, irfind は区別しません。
Returns:
見つかったら c の出現したindexを、見つからなければ -1 を返します。
- ptrdiff_t find(in char[] s, in char[] sub);
ptrdiff_t ifind(in char[] s, in char[] sub);
ptrdiff_t rfind(in char[] s, in char[] sub);
ptrdiff_t irfind(in char[] s, in char[] sub); - findと ifind は、文字列 s 中での最初の文字列 sub[] の出現を探します。
rfind と irfind は同様に最後の出現を探します。
find, rfind は大文字小文字を区別し、ifind, irfind は区別しません。
Returns:
見つかったら sub[] の出現したindexを、見つからなければ -1 を返します。
- string tolower(string s);
- 文字列を小文字に変換
- string toupper(string s);
- 文字列を大文字に変換
- string capitalize(string s);
- 最初の一文字を大文字、
残りを小文字に変換します
- string capwords(string s);
- 文字列中の全ての単語をキャピタライズします。
また、先頭と末尾の全ての空白を除き、
連続する空白文字を一文字にまとめます
- string repeat(string s, size_t n);
- 文字列 s[] を n 回繰り返し結合した文字列を返します
- string join(in char[][] words, in string sep);
- sep[]
をセパレータとして全ての文字列を結合します
- string[] split(string s);
- s[] を単語の配列へ分割します。
空白文字を区切りとして使います。
- string[] split(string s, string delim);
- s[] を単語の配列へ分割します。
delim[]を区切りとして使います。
- string[] splitlines(string s);
- s[] を行の配列へと分割します。
CR, LF, CR-LF を区切りとして使います。
改行文字そのものは結果文字列には含まれません。
- string stripl(string s);
string stripr(string s);
string strip(string s); - 先頭、末尾、あるいは両方の空白文字を取り除きます。
- C[] chomp(C)(C[] s, in C[] delimiter = null);
- s から末尾の delimiter がもし存在すれば取り除いた文字列を返します。
delimiter が null の時、末尾の CR,LF,CRLF が全て取り除かれます。
- string chop(string s);
- s から末尾の文字を取り除いた文字列を返します。
最後の二文字が CR-LF であれば、二文字とも取り除きます。
- string ljustify(string s, int width);
string rjustify(string s, int width);
string center(string s, int width); - 幅 width
文字の中で文字を左寄せ/右寄せ/センタリングします。
- string zfill(string s, int width);
- rjustify() と同じですが、空白でなく '0' で埋めます。
- string replace(string s, string from, string to);
- s[] での from[] の出現を to[] に置き換えます。
- string replaceSlice(string s, in string slice, in string replacement);
- 文字列 string[] 内の部分文字列 s[] を replacement[] に置き換えます。
- string insert(string s, size_t index, string sub);
- s[] の位置index に sub[] を挿入します。
- size_t count(string s, string sub);
- s[] 内での sub[] の出現回数をカウントします。
- string expandtabs(string str, int tabsize = 8);
- タブを適切な個数の空白文字へ置き換えます。
tabsize がタブ幅です。
- string entab(string s, int tabsize = 8);
- 文字列 s 内の空白文字を最適な個数のタブ文字に置き換えます。
行末の空白やタブは削除されます。
Params:
string s 変換したい文字列 int tabsize tabsize個の空白がタブ幅になります。デフォルトは8です。
- string maketrans(in string from, in string to);
- translate() 用の変換テーブルを作成
BUG:
ASCII文字に対してのみ動作します
- string translate(string s, in string transtab, in string delchars);
- s[] 内の文字を、maketrans() で作られたテーブルに従って変換します。
delchars[] 内の文字は削除します。
BUG:
ASCII文字に対してのみ動作します
- string toString(bool b);
string toString(char c);
string toString(ubyte ub);
string toString(ushort us);
string toString(uint u);
string toString(ulong u);
string toString(byte b);
string toString(short s);
string toString(int i);
string toString(long i);
string toString(float f);
string toString(double d);
string toString(real r);
string toString(ifloat f);
string toString(idouble d);
string toString(ireal r);
string toString(cfloat f);
string toString(cdouble d);
string toString(creal r); - string へ変換
- string toString(long value, uint radix);
string toString(ulong value, uint radix); - value を radix 進数表現で文字列に変換します。
radix は2以上36以下の数でなければなりません。 radix が10の時のみ、arg を符号付き値として扱います。 文字AからZによって、10から36までの桁の値が表現されます。
- string toString(char* s);
- C風の0終端文字列sを、D風のchar[]文字列に変換します。
- string format(...);
- 引数を文字列へと整形します。
- string sformat(char[] s,...);
- 引数を整形して文字列 s へ格納します。
サイズが小さすぎる場合は ArrayBoundsError が送出されます。
Returns:
s
- bool inPattern(dchar c, in string pattern);
- 文字 c が pattern に含まれるか否か判定
Patterns:
pattern は、正規表現で言う 文字列クラス のような文字の配列です。基本的には文字の列によって指定することができます。 例えば、"abcde" などです。また、'-' 文字は文字の範囲を表現します。 例えば "a-e" は "abcde" と同じパターンを表現し、 "a-fA-F0-9" は16進表現に使う全ての文字を表現します。 もし最初の文字が '^' ならば、 パターンが反転されます。つまり例えば、"^0-9" は数字以外の文字を意味します。 以下の関数 inPattern, countchars, removeschars, squeeze がpatternを使います。
Note:
将来的には、 pattern の構文はより正規表現の文字クラスに近い形へと改良される予定です。
- int inPattern(dchar c, in string[] patterns);
- c がpatternsの全てのパターンに含まれているか否かを返します
- size_t countchars(string s, string pattern);
- 文字列 s 中の pattern に含まれる文字の数を返します。
- string removechars(string s, in string pattern);
- 文字列 s のうち、pattern にマッチした文字を全て取り除いたものを返します。
- string squeeze(string s, string pattern = null);
- pattern
にマッチする文字の複数文字の繰り返しを取り除きます。
pattern が null ならば、全ての文字が適用対象になります。
- string succ(string s);
- s の'直後'の文字列を返します。
右端の文字が a-zA-Z0-9 ならば、大文字小文字や数字という元の文字種を変えない範囲で
1つ後ろの文字に変更します。 繰り上がりがある場合は、
すぐ左の文字に対して処理が繰り返されます。
- string tr(string str, string from, string to, string modifiers = null);
- from に含まれている文字が str の中にあると、
str のその部分を対応する to の文字に置き換え、
置換結果の文字列を返します。
Params:
string modifiers modifier文字の並び
Modifiers:
Modifier 説明 c from の文字集合の補集合をとります。 d to に対応要素がない場合、その文字は削除します。 s 置換後の文字列で同じ文字が隣り合っていたら重なりを除去します。
Modifier d がある場合、 to は0文字か1文字でなければなりません。
Modifier d がなく、to が null ならば、 to は from と同じ文字列が使用されます。
Modifier d がなく、to が from より短い場合、 to は to の最後の文字を繰り返す形で拡張されます。
from も to も、- 文字を使った範囲の表現を含むことができます。 例えば a-d は abcd と同義です。 ^ を補集合の意味で使うことはできません。 (この目的には Modifier c を使います。)
- final bool isNumeric(string s, in bool bAllowSep = false);
- 文字列 s が以下の形式かどうかを確かめます:
整数: (for byte, ubyte, short, ushort, int, uint, long, and ulong) ['+'|'-']digit(s)[U|L|UL]
Examples:
123, 123UL, 123L, +123U, -123L
浮動小数点数: (float, double, real, ifloat, idouble, ireal) ['+'|'-']digit(s)[.][digit(s)][[e-|e+]digit(s)][i|f|L|Li|fi]] or [nan|nani|inf|-inf]
Examples:
+123., -123.01, 123.3e-10f, 123.3e-10fi, 123.3e-10L
(cfloat, cdouble, creal) ['+'|'-']digit(s)[.][digit(s)][[e-|e+]digit(s)][+] [digit(s)[.][digit(s)][[e-|e+]digit(s)][i|f|L|Li|fi]] or [nan|nani|nan+nani|inf|-inf]
Examples:
nan, -123e-1+456.9e-10Li, +123e+10+456i, 123+456
[in] bool bAllowSep デフォルトではfalseです。trueにした場合、文字列中の "," や "_" といったセパレータを無視して判定します。ただし 変換関数 toInt(), toFloat() などに渡す前には、 これらの文字を取り除かないと エラーになります。
また、先頭、末尾、途中といった場所を問わず、 空白文字は許可されていないことに注意してください。 つまり、この関数やその他変換関数に渡す前に、 空白文字はあらかじめ取り除いておく必要があります。
- bool isNumeric(...);
- 引数として任意のオブジェクトを取ります
- bool isNumeric(TypeInfo[] _arguments, va_list _argptr);
- 第一引数のみを検査し、残りは無視します
- char[] soundex(string string, char[] buffer = null);
- Soundex アルゴリズム
Soundex アルゴリズムは、発音に基づいて英単語を4文字の文字列に 変換します。 これは、似た発音をもつ綴りに同じSoudex値を割り当てることで、 名前のあいまい検索のインデックス等に 活用できるようにするものです。
Params:
string string Soundex 表現に変換したい文字列 char[] buffer Soundex の結果を格納する4文字の配列を指定します。 null を指定すると、 返値用のバッファはヒープに確保されます。
Returns:
Soundexアルゴリズムの結果を返す4文字の配列を返します。 string に対応するSoundex表現がない場合、null を返します。
See Also:
Wikipedia, The Soundex Indexing System
BUGS:
英語の名前に対してのみ動作します。 他により良い結果を返すといわれる Soundex アルゴリズムもありますが、 これが標準的な方式です。
- string[string] abbrev(string[] values);
- values に含まれる文字列の中の一つを確定するのに
十分な長さの全ての省略形からの連想配列を返します。
この関数は、ユーザが既知の文字列集合のうちのどれかをタイプする際に、 十分な文字が入力されたら プログラムが自動補完して ユーザーの手間を減らす処理などに役立ちます。
Example:
import std.stdio; import std.string; void main() { static string[] list = [ "food", "foxy" ]; auto abbrevs = std.string.abbrev(list); foreach (key, value; abbrevs) { writefln("%s => %s", key, value); } }
以下のように出力されます:fox => foxy food => food foxy => foxy foo => food
- size_t column(string str, int tabsize = 8);
- 文字列 string が0桁目から開始するとしたとき、
文字列全体の右端が何桁目に達するかを返します。
- string wrap(string s, int columns = 80, string firstindent = null, string indent = null, int tabsize = 8);
- 文字列の折り返し処理をします
入力文字列 s を、\nでいくつかの行に分割して 段落の形にします。 各行の長さは columns を超えないように 調整されます。 最後の行は \n で終了します。
Params:
string s 折り返し処理の対象とする文字列 int columns 段落の最大桁数 string firstindent 段落の先頭行のインデントに用いる文字列 string indent 段落の後続行のインデントに用いる文字列 int tabsize タブの桁数
Returns:
変換結果の段落文字列
- string isEmail(string s);
- 文字列 s[] の先頭部分がEメールアドレスになっているか?
Returns:
メールアドレスになっていない場合は null、 なっている場合は、s[] のその部分のスライス
References:
RFC2822
- string isURL(string s);
- 文字列 s[] の先頭部分がURLになっているか?
Returns:
URLになっている場合は null、 なっている場合は s[] のその部分のスライス