模組 Str

module Str: sig .. end

正規表達式與高階字串處理


正規表達式

Str 函式庫提供位元組序列的正規表達式。一般來說,它不適合比對 Unicode 字元。

type regexp 

已編譯的正規表達式類型。

val regexp : string -> regexp

編譯正規表達式。以下結構會被識別

  • .      比對除了換行符號以外的任何字元。
  • *      (後綴) 比對前面的表達式零次、一次或多次。
  • +      (後綴) 比對前面的表達式一次或多次。
  • ?      (後綴) 比對前面的表達式一次或零次。
  • [..]   字元集。範圍以 - 表示,例如 [a-z]。開頭的 ^,例如 [^0-9],表示此集合的補集。若要在集合中包含 ] 字元,請將其設為集合的第一個字元。若要在集合中包含 - 字元,請將其設為集合的第一個或最後一個字元。
  • ^      比對行首:在比對字串的開頭,或在 '\n' 字元之後。
  • $      比對行尾:在比對字串的結尾,或在 '\n' 字元之前。
  • \| (中綴) 兩個表達式之間的選擇。
  • \(..\) 將括號中的表達式分組與命名。
  • \1 第一個 \(...\) 表達式比對到的文字(\2 表示第二個表達式,依此類推,最多到 \9)。
  • \b 比對單字邊界。
  • \ 引號特殊字元。特殊字元為 $^\.*+?[]

在正規表達式中,您通常會使用反斜線字元;使用帶引號的字串字面值 {|...|} 會比較容易,避免必須跳脫反斜線。

例如,以下表達式

 let r = Str.regexp {|hello \([A-Za-z]+\)|} in
      Str.replace_first r {|\1|} "hello world" 

會傳回字串 "world"

如果您想要使用正規表達式比對文字反斜線字元,您需要將其加倍:Str.regexp {|\\|}

您也可以使用一般的字串字面值 "...",但是您必須跳脫反斜線。上面的範例可以用一般的字串字面值改寫為

 let r = Str.regexp "hello \\([A-Za-z]+\\)" in
      Str.replace_first r "\\1" "hello world" 

而比對反斜線的正規表達式會變成四個反斜線:Str.regexp "\\\\"

val regexp_case_fold : string -> regexp

regexp 相同,但編譯後的表達式會以不區分大小寫的方式比對文字:大寫和小寫字母會被視為相等。

val quote : string -> string

Str.quote s 傳回一個正規表達式字串,該字串完全比對 s,且不比對其他任何內容。

val regexp_string : string -> regexp

Str.regexp_string s 傳回一個正規表達式,該正規表達式完全比對 s,且不比對其他任何內容。

val regexp_string_case_fold : string -> regexp

Str.regexp_string_case_foldStr.regexp_string 類似,但是正規表達式會以不區分大小寫的方式比對。

字串比對與搜尋

val string_match : regexp -> string -> int -> bool

string_match r s start 測試 s 中從位置 start 開始的子字串是否符合正規表達式 r。字串的第一個字元的位置通常為 0

val search_forward : regexp -> string -> int -> int

search_forward r s start 在字串 s 中搜尋符合正規表達式 r 的子字串。搜尋從位置 start 開始,並朝字串的結尾進行。傳回符合的子字串的第一個字元的位置。

val search_backward : regexp -> string -> int -> int

search_backward r s last 在字串 s 中搜尋符合正規表達式 r 的子字串。搜尋會先考慮從位置 last 開始的子字串,並朝字串的開頭進行。傳回符合的子字串的第一個字元的位置。

val string_partial_match : regexp -> string -> int -> bool

Str.string_match 類似,但如果引數字串是符合字串的字首,也會傳回 true。這包括真正完整比對的情況。

val matched_string : string -> string

matched_string s 傳回 s 的子字串,該子字串是由上次呼叫以下其中一個比對或搜尋函式所比對到的

前提是,沒有在之間呼叫過以下任何函式

注意:在 global_substitutesubstitute_first 的情況下,呼叫 matched_string 只有在 subst 引數中才有效,在 global_substitutesubstitute_first 傳回之後無效。

使用者必須確保參數 s 與傳遞給比對或搜尋函式的字串相同。

val match_beginning : unit -> int

match_beginning() 傳回由上次呼叫比對或搜尋函式所比對到的子字串的第一個字元的位置(請參閱 Str.matched_string 以了解詳細資訊)。

val match_end : unit -> int

match_end() 傳回由上次呼叫比對或搜尋函式所比對到的子字串的最後一個字元之後的字元位置(請參閱 Str.matched_string 以了解詳細資訊)。

val matched_group : int -> string -> string

matched_group n s 傳回 s 的子字串,該子字串是由上次呼叫比對或搜尋函式所比對到的正規表達式的第 n 個群組 \(...\) 所比對到的(請參閱 Str.matched_string 以了解詳細資訊)。當 n0 時,它會傳回整個正規表達式所比對到的子字串。使用者必須確保參數 s 與傳遞給比對或搜尋函式的字串相同。

val group_beginning : int -> int

group_beginning n 傳回由上次呼叫比對或搜尋函式所比對到的正規表達式的第 n 個群組所比對到的子字串的第一個字元的位置(請參閱 Str.matched_string 以了解詳細資訊)。

val group_end : int -> int

group_end n 傳回由上次呼叫比對或搜尋函式所比對到的正規表達式的第 n 個群組所比對到的子字串的最後一個字元之後的字元位置(請參閱 Str.matched_string 以了解詳細資訊)。

取代

val global_replace : regexp -> string -> string -> string

global_replace regexp templ s 傳回與 s 相同的字串,但 s 中所有符合 regexp 的子字串都已被 templ 取代。templ 取代範本可以包含 \1\2 等;這些序列會被正規表達式中對應群組所比對到的文字取代。\0 代表整個正規表達式所比對到的文字。

val replace_first : regexp -> string -> string -> string

Str.global_replace 相同,但只會取代第一個符合正規表達式的子字串。

val global_substitute : regexp -> (string -> string) -> string -> string

global_substitute regexp subst s 傳回與 s 相同的字串,但 s 中所有符合 regexp 的子字串都已被函式 subst 的結果取代。函式 subst 會針對每個符合的子字串呼叫一次,並接收 s(整個文字)作為引數。

val substitute_first : regexp -> (string -> string) -> string -> string

Str.global_substitute 相同,但只會取代第一個符合正規表達式的子字串。

val replace_matched : string -> string -> string

replace_matched repl s 傳回取代文字 repl,其中 \1\2 等已被上次呼叫比對或搜尋函式所比對到的正規表達式中對應群組所比對到的文字取代(請參閱 Str.matched_string 以了解詳細資訊)。s 必須與傳遞給比對或搜尋函式的字串相同。

分割

val split : regexp -> string -> string list

split r ss 分割成子字串,以符合 r 的子字串作為分隔符號,並傳回子字串的清單。例如,split (regexp "[ \t]+") s 會將 s 分割成以空白分隔的單字。忽略字串開頭或結尾的分隔符號。

val bounded_split : regexp -> string -> int -> string list

Str.split 相同,但最多分割成 n 個子字串,其中 n 是額外的整數參數。

val split_delim : regexp -> string -> string list

Str.split 相同,但會識別並將字串開頭和結尾的分隔符號出現的情況,作為空字串回傳。 例如, split_delim (regexp " "" abc " 會回傳 ["""abc"""],而使用相同參數的 split 則會回傳 ["abc"]

val bounded_split_delim : regexp -> string -> int -> string list

Str.bounded_split 相同,但會識別並將字串開頭和結尾的分隔符號出現的情況,作為空字串回傳。

type split_result = 
| Text of string
| Delim of string
val full_split : regexp -> string -> split_result list

Str.split_delim 相同,但除了回傳分隔符號之間的子字串之外,也會回傳分隔符號本身。前者在結果列表中會標記為 Delim;後者則會標記為 Text。 例如, full_split (regexp "[{}]""{ab}" 會回傳 [Delim "{"Text "ab"Delim "}"]

val bounded_full_split : regexp -> string -> int -> split_result list

Str.bounded_split_delim 相同,但除了回傳分隔符號之間的子字串之外,也會回傳分隔符號本身。前者在結果列表中會標記為 Delim;後者則會標記為 Text

擷取子字串

val string_before : string -> int -> string

string_before s n 回傳 s 中位置 n 之前的所有字元所組成的子字串 (不包含位置 n 的字元)。

val string_after : string -> int -> string

string_after s n 回傳 s 中位置 n 之後的所有字元所組成的子字串 (包含位置 n 的字元)。

val first_chars : string -> int -> string

first_chars s n 回傳 s 的前 n 個字元。這與 Str.string_before 函式相同。

val last_chars : string -> int -> string

last_chars s n 回傳 s 的最後 n 個字元。