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_fold
與 Str.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
開始,並朝字串的結尾進行。傳回符合的子字串的第一個字元的位置。
Not_found
若沒有子字串符合。val search_backward : regexp -> string -> int -> int
search_backward r s last
在字串 s
中搜尋符合正規表達式 r
的子字串。搜尋會先考慮從位置 last
開始的子字串,並朝字串的開頭進行。傳回符合的子字串的第一個字元的位置。
Not_found
若沒有子字串符合。val string_partial_match : regexp -> string -> int -> bool
與 Str.string_match
類似,但如果引數字串是符合字串的字首,也會傳回 true。這包括真正完整比對的情況。
val matched_string : string -> string
matched_string s
傳回 s
的子字串,該子字串是由上次呼叫以下其中一個比對或搜尋函式所比對到的
Str.string_match
Str.search_forward
Str.search_backward
Str.string_partial_match
Str.global_substitute
Str.substitute_first
前提是,沒有在之間呼叫過以下任何函式
Str.global_replace
Str.replace_first
Str.split
Str.bounded_split
Str.split_delim
Str.bounded_split_delim
Str.full_split
Str.bounded_full_split
注意:在 global_substitute
和 substitute_first
的情況下,呼叫 matched_string
只有在 subst
引數中才有效,在 global_substitute
或 substitute_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
以了解詳細資訊)。當 n
為 0
時,它會傳回整個正規表達式所比對到的子字串。使用者必須確保參數 s
與傳遞給比對或搜尋函式的字串相同。
Not_found
若正規表達式的第 n
個群組未比對到。這可能會發生在選項 ?
或重複 *
內部具有群組的替代 \|
中。例如,空字串會比對 \(a\)*
,但 matched_group 1 ""
會引發 Not_found
,因為第一個群組本身並未比對到。val group_beginning : int -> int
group_beginning n
傳回由上次呼叫比對或搜尋函式所比對到的正規表達式的第 n
個群組所比對到的子字串的第一個字元的位置(請參閱 Str.matched_string
以了解詳細資訊)。
Not_found
若正規表達式的第 n
個群組未比對到。Invalid_argument
若正規表達式中的群組少於 n
個。val group_end : int -> int
group_end n
傳回由上次呼叫比對或搜尋函式所比對到的正規表達式的第 n
個群組所比對到的子字串的最後一個字元之後的字元位置(請參閱 Str.matched_string
以了解詳細資訊)。
Not_found
若正規表達式的第 n
個群組未比對到。Invalid_argument
若正規表達式中的群組少於 n
個。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 s
將 s
分割成子字串,以符合 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 |
| |
Delim of |
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
個字元。