模組 String

module String: sig .. end

字串。

長度為 n 的字串 s 是一個可索引且不可變的 n 個位元組序列。由於歷史原因,這些位元組被稱為字元。

字串函式的語意是根據索引和位置來定義的。這些如下所示和描述。

positions  0   1   2   3   4    n-1    n
           +---+---+---+---+     +-----+
  indices  | 0 | 1 | 2 | 3 | ... | n-1 |
           +---+---+---+---+     +-----+
  • s索引 i 是範圍在 [0;n-1] 中的整數。它代表 s 的第 i 個位元組(字元),可以使用常數時間字串索引運算符 s.[i] 來存取。
  • s位置 i 是範圍在 [0;n] 中的整數。它代表字串的開頭、兩個索引之間的點或字串的結尾。第 i 個位元組索引在位置 ii+1 之間。

如果 len >= 0 並且 startstart+lens 的位置,則兩個整數 startlen 被稱為定義 s有效子字串

Unicode 文字。字串是任意位元組序列,它們可以保存任何種類的文字編碼。但是,在 OCaml 字串中儲存 Unicode 文字的建議編碼是 UTF-8。這是字串文字中 Unicode 跳脫字元使用的編碼。例如,字串 "\u{1F42B}" 是 Unicode 字元 U+1F42B 的 UTF-8 編碼。

過去的可變性。在 OCaml 4.02 之前,字串像 Bytes.t 可變位元組序列一樣可以在原地修改。OCaml 4 有各種編譯器標誌和組態選項來支援從可變字串到不可變字串的過渡時期。這些選項不再可用,並且字串現在始終是不可變的。

此模組的標籤版本可以按照 StdLabels 模組中的描述使用。


字串

type t = string 

字串的類型。

val make : int -> char -> string

make n c 是一個長度為 n 的字串,其中每個索引都包含字元 c

val init : int -> (int -> char) -> string

init n f 是一個長度為 n 的字串,其中索引 i 包含字元 f i (按遞增的索引順序呼叫)。

val empty : string

空字串。

val length : string -> int

length ss 的長度 (位元組/字元數)。

val get : string -> int -> char

get s is 中索引 i 處的字元。這與寫 s.[i] 相同。

val of_bytes : bytes -> string

返回一個新字串,其中包含與給定的位元組序列相同的位元組。

val to_bytes : string -> bytes

返回一個新的位元組序列,其中包含與給定的字串相同的位元組。

val blit : string -> int -> bytes -> int -> int -> unit

Bytes.blit_string 相同,應該優先使用。

串接

注意。(^) 二元運算符串接兩個字串。

val concat : string -> string list -> string

concat sep ss 串接字串列表 ss,在每個字串之間插入分隔符字串 sep

val cat : string -> string -> string

cat s1 s2 串接 s1 和 s2 (s1 ^ s2)。

述詞與比較

val equal : t -> t -> bool

當且僅當 s0s1 的字元相等時,equal s0 s1true

val compare : t -> t -> int

compare s0 s1 按字典順序排序 s0s1compare 的行為類似於字串的 compare,但可能更有效率。

val starts_with : prefix:string -> string -> bool

當且僅當 sprefix 開頭時,starts_with ~prefix strue

val ends_with : suffix:string -> string -> bool

當且僅當 ssuffix 結尾時,ends_with ~suffix strue

val contains_from : string -> int -> char -> bool

當且僅當 c 出現在 s 中位置 start 之後時,contains_from s start ctrue

val rcontains_from : string -> int -> char -> bool

當且僅當 c 出現在 s 中位置 stop+1 之前時,rcontains_from s stop ctrue

val contains : string -> char -> bool

contains s cString.contains_from s 0 c

提取子字串

val sub : string -> int -> int -> string

sub s pos len 是一個長度為 len 的字串,其中包含 s 的子字串,該子字串從位置 pos 開始,長度為 len

val split_on_char : char -> string -> string list

split_on_char sep ss 的所有(可能為空)子字串的列表,這些子字串由字元 sep 分隔。如果 s 為空,則結果為單例列表 [""]

函式的結果由以下不變量指定

  • 列表不為空。
  • 使用 sep 作為分隔符號串接其元素會返回一個等於輸入的字串 (concat (make 1 sep)
          (split_on_char sep s) = s
    )。
  • 結果中沒有字串包含 sep 字元。

轉換

val map : (char -> char) -> string -> string

map f s 是將 f 按遞增順序應用於 s 的所有字元所產生的字串。

val mapi : (int -> char -> char) -> string -> string

mapi f s 類似於 String.map,但是字元的索引也會傳遞給 f

val fold_left : ('acc -> char -> 'acc) -> 'acc -> string -> 'acc

fold_left f x s 計算 f (... (f (f x s.[0]) s.[1]) ...) s.[n-1],其中 n 是字串 s 的長度。

val fold_right : (char -> 'acc -> 'acc) -> string -> 'acc -> 'acc

fold_right f s x 計算 f s.[0] (f s.[1] ( ... (f s.[n-1] x) ...)),其中 n 是字串 s 的長度。

val for_all : (char -> bool) -> string -> bool

for_all p s 檢查 s 中的所有字元是否滿足述詞 p

val exists : (char -> bool) -> string -> bool

exists p s 檢查 s 中是否至少有一個字元滿足述詞 p

val trim : string -> string

trim ss,不包含開頭和結尾的空白。空白字元包括:' ''\x0C' (換頁)、'\n''\r''\t'

val escaped : string -> string

escaped ss,其中特殊字元由跳脫序列表示,遵循 OCaml 的詞彙約定。

所有不在 US-ASCII 可列印範圍 [0x20;0x7E] 之外的字元,以及反斜線 (0x2F) 和雙引號 (0x22) 都會被跳脫。

函式 Scanf.unescapedescaped 的左逆函數,也就是說,對於任何字串 sScanf.unescaped (escaped s) = s(除非 escaped s 失敗)。

val uppercase_ascii : string -> string

uppercase_ascii ss,使用 US-ASCII 字元集將所有小寫字母轉換為大寫字母。

val lowercase_ascii : string -> string

lowercase_ascii ss,使用 US-ASCII 字元集將所有大寫字母轉換為小寫字母。

val capitalize_ascii : string -> string

capitalize_ascii ss,使用 US-ASCII 字元集將第一個字元設定為大寫。

val uncapitalize_ascii : string -> string

uncapitalize_ascii ss,使用 US-ASCII 字元集將第一個字元設定為小寫。

遍歷

val iter : (char -> unit) -> string -> unit

iter f s 依次將函式 f 應用於 s 的所有字元。它等效於 f s.[0]; f s.[1]; ...; f s.[length s - 1]; ()

val iteri : (int -> char -> unit) -> string -> unit

iteri 類似於 String.iter,但是該函式也會收到對應的字元索引。

搜尋

val index_from : string -> int -> char -> int

index_from s i ccs 中位置 i 之後第一次出現的索引。

val index_from_opt : string -> int -> char -> int option

index_from_opt s i ccs 中位置 i 之後第一次出現的索引(如果有)。

val rindex_from : string -> int -> char -> int

rindex_from s i ccs 中位置 i+1 之前最後一次出現的索引。

val rindex_from_opt : string -> int -> char -> int option

rindex_from_opt s i ccs 中位置 i+1 之前最後一次出現的索引(如果有)。

val index : string -> char -> int

index s cString.index_from s 0 c

val index_opt : string -> char -> int option

index_opt s c 等同於 String.index_from_opt s 0 c

val rindex : string -> char -> int

rindex s c 等同於 String.rindex_from s (length s - 1) c

val rindex_opt : string -> char -> int option

rindex_opt s c 等同於 String.rindex_from_opt s (length s - 1) c

字串與序列

val to_seq : t -> char Seq.t

to_seq s 會產生一個序列,包含字串中的字元,並依照字元在字串中遞增的順序排列。在 "unsafe-string" 模式下,若在迭代期間修改字串,這些變更會反映在序列中。

val to_seqi : t -> (int * char) Seq.t

to_seqi s 的功能類似 String.to_seq,但也會將對應的索引值放入元組中。

val of_seq : char Seq.t -> t

of_seq s 會產生一個字串,由序列中的字元組成。

UTF 解碼與驗證

UTF-8

val get_utf_8_uchar : t -> int -> Uchar.utf_decode

get_utf_8_uchar b i 會解碼 b 中索引 i 位置的 UTF-8 字元。

val is_valid_utf_8 : t -> bool

is_valid_utf_8 b 只有在 b 包含有效的 UTF-8 資料時才會是 true

UTF-16BE

val get_utf_16be_uchar : t -> int -> Uchar.utf_decode

get_utf_16be_uchar b i 會解碼 b 中索引 i 位置的 UTF-16BE 字元。

val is_valid_utf_16be : t -> bool

is_valid_utf_16be b 只有在 b 包含有效的 UTF-16BE 資料時才會是 true

UTF-16LE

val get_utf_16le_uchar : t -> int -> Uchar.utf_decode

get_utf_16le_uchar b i 會解碼 b 中索引 i 位置的 UTF-16LE 字元。

val is_valid_utf_16le : t -> bool

is_valid_utf_16le b 只有在 b 包含有效的 UTF-16LE 資料時才會是 true

整數的二進制解碼

本節中的函式會從字串中以二進制方式解碼整數。

如果解碼整數所需的字元在索引 i 處不可用,以下所有函式都會引發 Invalid_argument 異常。

小端 (little-endian) (或大端 (big-endian)) 編碼是指將最低 (或最高) 位元組儲存在最前面。大端位元組序也稱為網路位元組序。本機位元組序 (Native-endian) 編碼是小端位元組序或是大端位元組序,取決於 Sys.big_endian 的設定。

32 位元和 64 位元整數以 int32int64 類型表示,這些類型可以解釋為有號或無號數字。

8 位元和 16 位元整數以 int 類型表示,其位元數多於二進制編碼。這些額外的位元會針對解碼 8 位元或 16 位元整數的函式進行符號擴展 (或零擴展),並以 int 值表示。

val get_uint8 : string -> int -> int

get_uint8 b i 會取得從字元索引 i 開始的 b 的無號 8 位元整數。

val get_int8 : string -> int -> int

get_int8 b i 會取得從字元索引 i 開始的 b 的有號 8 位元整數。

val get_uint16_ne : string -> int -> int

get_uint16_ne b i 會取得從字元索引 i 開始的 b 的本機位元組序無號 16 位元整數。

val get_uint16_be : string -> int -> int

get_uint16_be b i 會取得從字元索引 i 開始的 b 的大端位元組序無號 16 位元整數。

val get_uint16_le : string -> int -> int

get_uint16_le b i 會取得從字元索引 i 開始的 b 的小端位元組序無號 16 位元整數。

val get_int16_ne : string -> int -> int

get_int16_ne b i 會取得從字元索引 i 開始的 b 的本機位元組序有號 16 位元整數。

val get_int16_be : string -> int -> int

get_int16_be b i 會取得從字元索引 i 開始的 b 的大端位元組序有號 16 位元整數。

val get_int16_le : string -> int -> int

get_int16_le b i 會取得從字元索引 i 開始的 b 的小端位元組序有號 16 位元整數。

val get_int32_ne : string -> int -> int32

get_int32_ne b i 會取得從字元索引 i 開始的 b 的本機位元組序 32 位元整數。

val hash : t -> int

字串的未設定種子的雜湊函數,其輸出值與 Hashtbl.hash 相同。此函式允許將此模組作為函子 Hashtbl.Make 的引數傳遞。

val seeded_hash : int -> t -> int

字串的已設定種子的雜湊函數,其輸出值與 Hashtbl.seeded_hash 相同。此函式允許將此模組作為函子 Hashtbl.MakeSeeded 的引數傳遞。

val get_int32_be : string -> int -> int32

get_int32_be b i 會取得從字元索引 i 開始的 b 的大端位元組序 32 位元整數。

val get_int32_le : string -> int -> int32

get_int32_le b i 會取得從字元索引 i 開始的 b 的小端位元組序 32 位元整數。

val get_int64_ne : string -> int -> int64

get_int64_ne b i 會取得從字元索引 i 開始的 b 的本機位元組序 64 位元整數。

val get_int64_be : string -> int -> int64

get_int64_be b i 會取得從字元索引 i 開始的 b 的大端位元組序 64 位元整數。

val get_int64_le : string -> int -> int64

get_int64_le b i 會取得從字元索引 i 開始的 b 的小端位元組序 64 位元整數。