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
与传递给匹配或搜索函数的字符串相同。
n
个组未匹配,则引发 Not_found
。这可能发生在备选方案 \|
、选项 ?
或重复 *
内部的组中。例如,空字符串将匹配 \(a\)*
,但 matched_group 1 ""
将引发 Not_found
,因为第一个组本身未匹配。val group_beginning : int -> int
group_beginning n
返回由对匹配或搜索函数的最后一次调用匹配的正则表达式的第 n
个组匹配的子字符串的第一个字符的位置(有关详细信息,请参阅 Str.matched_string
)。
n
个组未匹配,则引发 Not_found
。n
,则引发 Invalid_argument
。val group_end : int -> int
group_end n
返回由对匹配或搜索函数的最后一次调用匹配的正则表达式的第 n
个组匹配的子字符串的最后一个字符之后的字符的位置(有关详细信息,请参阅 Str.matched_string
)。
n
个组未匹配,则引发 Not_found
。n
,则引发 Invalid_argument
。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 的 |
| |
Delim 的 |
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
个字符。