Skip to content

std.string ​

文字列操作モジュール。format を除き、すべての関数は引数を読み取り専用借用(&String)し、呼び出し後も元文字列は引き続き使用できる。

すべての関数は引数の型が一致しない場合、空文字列のセマンティクスに縮退する(エラーではない):split/trim/upper などは String 以外の入力を "" として扱う。つまり、引数の型が誤っていても中断はされないが、期待した結果も得られない——コンパイラに依存して型チェックでコンパイル時に遮断することを推奨する。

yaoxiang
use std.string

関数一覧 ​

関数シグネチャ
split(s: &String, sep: &String) -> Vec(String)
trim(s: &String) -> String
upper(s: &String) -> String
lower(s: &String) -> String
replace(s: &String, old: &String, new: &String) -> String
contains(s: &String, sub: &String) -> Bool
starts_with(s: &String, prefix: &String) -> Bool
ends_with(s: &String, suffix: &String) -> Bool
index_of(s: &String, sub: &String) -> Int
substring(s: &String, start: Int, end: Int) -> String
is_empty(s: &String) -> Bool
len(s: &String) -> Int
chars(s: &String) -> Vec(String)
concat(s1: &String, s2: &String) -> String
repeat(s: &String, n: Int) -> String
reverse(s: &String) -> String
format(format: &String, ...args) -> String
parse_int(s: &String) -> Result(Int, Error)
parse_float(s: &String) -> Result(Float, Error)
## 関数

split ​

yaoxiang
split: (s: &String, sep: &String) -> Vec(String)

sep で s を分割し、部分文字列のリストを返す。

  • s —— 分割対象の文字列
  • sep —— 区切り文字;空文字列の場合は文字ごとに分割する

戻り値:List(String)。区切り文字が見つからない場合は単一要素のリストを返す。

yaoxiang
use std.assert
use std.list
use std.string

main: () -> Void = {
    parts = string.split("a,b,c", ",")
    assert(list.len(parts) == 3)
    assert(list.get(parts, 0) == "a")

    // 空の区切り文字 → 1文字ずつ
    cs = string.split("abc", "")
    assert(list.len(cs) == 3)
}

trim ​

yaoxiang
trim: (s: &String) -> String

先頭と末尾の Unicode 空白文字を除去する。

戻り値:先頭と末尾の空白を除去した新しい文字列(s は変更しない)。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.trim("  hi  ") == "hi")
}

upper ​

yaoxiang
upper: (s: &String) -> String

大文字に変換する(Unicode 対応)。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.upper("abc") == "ABC")
}

lower ​

yaoxiang
lower: (s: &String) -> String

小文字に変換する(Unicode 対応)。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.lower("ABC") == "abc")
}

replace ​

yaoxiang
replace: (s: &String, old: &String, new: &String) -> String

s 中のすべての old を new に置換する。

  • old —— 空文字列の場合は s をそのまま返す(挿入しない)
yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.replace("a-b-c", "-", "+") == "a+b+c")
    assert(string.replace("abc", "", "x") == "abc")
}

contains ​

yaoxiang
contains: (s: &String, sub: &String) -> Bool

sub が s 中に出現するかどうか。空文字列は常に true。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.contains("hello", "ell"))
    assert(!string.contains("hello", "xyz"))
}

starts_with ​

yaoxiang
starts_with: (s: &String, prefix: &String) -> Bool

s が prefix で始まるかどうか。空の prefix は常に true。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.starts_with("hello", "he"))
}

ends_with ​

yaoxiang
ends_with: (s: &String, suffix: &String) -> Bool

s が suffix で終わるかどうか。空の suffix は常に true。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.ends_with("hello", "lo"))
}

index_of ​

yaoxiang
index_of: (s: &String, sub: &String) -> Int

sub が最初に現れるバイト位置。

戻り値:見つかった場合はその位置を返す;見つからない場合は -1 を返す。

返り値はバイトオフセットである。マルチバイト文字を含む場合は、chars で変換してから文字位置を特定できる。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.index_of("hello", "ll") == 2)
    assert(string.index_of("hello", "xyz") == -1)
}

substring ​

yaoxiang
substring: (s: &String, start: Int, end: Int) -> String

文字位置で [start, end) の範囲を取り出す。

  • start —— 開始文字位置、デフォルトは 0
  • end —— 終了文字位置(含まない)、デフォルトは文字列の末尾

戻り値:切り出した結果。範囲外の境界はクランプされてエラーにはならない;start > end の場合は空文字列にクランプされる。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.substring("hello", 1, 4) == "ell")
    assert(string.substring("hello", 1, 99) == "ello")   // 上限をクランプ
}

is_empty ​

yaoxiang
is_empty: (s: &String) -> Bool

s が空文字列かどうか。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.is_empty(""))
    assert(!string.is_empty("x"))
}

len ​

yaoxiang
len: (s: &String) -> Int

UTF-8 バイト長を返す。文字数ではない。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.len("hello") == 5)
    assert(string.len("中") == 3)   // バイト長
}

chars ​

yaoxiang
chars: (s: &String) -> Vec(String)

単一文字の文字列リストに分解する(Unicode スカラー値ごと)。

yaoxiang
use std.assert
use std.list
use std.string

main: () -> Void = {
    cs = string.chars("ab")
    assert(list.len(cs) == 2)
    assert(cs[0] == "a")
}

concat ​

yaoxiang
concat: (s1: &String, s2: &String) -> String

2つの文字列を連結する。+ 演算子を直接使用してもよい。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.concat("a", "b") == "ab")
}

repeat ​

yaoxiang
repeat: (s: &String, n: Int) -> String

s を n 回繰り返す。

  • n —— 繰り返し回数;n <= 0 の場合は空文字列を返す
yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.repeat("ab", 3) == "ababab")
    assert(string.repeat("ab", 0) == "")
}

reverse ​

yaoxiang
reverse: (s: &String) -> String

文字単位で反転する。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.reverse("abc") == "cba")
}

format ​

yaoxiang
format: (format: &String, ...args) -> String

{index} プレースホルダでフォーマットし、オプションで幅/配置指定子が使える。

プレースホルダの構文:

形式意味
{0}0 番目の引数(format 以降の引数は 0 から番号付け)
{0:03}幅 3
{0:>3}幅 3、右揃え(デフォルト)
{0:<3}幅 3、左揃え
{0:^3}幅 3、中央揃え

リテラルの波括弧は二重書きで表現する:左波括弧 2 つでリテラル左波括弧 1 つ、右波括弧も同様。

戻り値:フォーマット後の文字列。引数はまず文字列に変換される(convert.to_string と同様);インデックスが範囲外の場合は空文字列、不正な幅は 0 として扱われる。

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.format("{0}-{1}", "a", "b") == "a-b")
    assert(string.format("[{0:>5}]", "ab") == "[   ab]")
    assert(string.format("[{0:<5}]", "ab") == "[ab   ]")
}

parse_int ​

yaoxiang
parse_int: (s: &String) -> Result(Int, Error)

10 進整数を解析する(先頭と末尾の空白を自動的に除去する)。

戻り値:成功時は Result.ok(Int);失敗時は Result.err(Error) で、その code は E6010。例外を投げない。

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    assert(result.is_ok(string.parse_int("42")))
    assert(result.is_err(string.parse_int("abc")))
}

parse_float ​

yaoxiang
parse_float: (s: &String) -> Result(Float, Error)

浮動小数点数を解析する(先頭と末尾の空白を自動的に除去する)。

戻り値:成功時は Result.ok(Float);失敗時は Result.err(Error) で、その code は E6011。

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    assert(result.is_ok(string.parse_float("3.14")))
    assert(result.is_err(string.parse_float("xxx")))
}

関連 ​

  • std.convert —— 数値から文字列への変換
  • std.result —— parse_* の結果のアンラップ