模块 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_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 开始,并继续到字符串的末尾。返回匹配子字符串的第一个字符的位置。

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]+") ss 分割成空格分隔的单词。字符串开头或结尾处出现的分隔符将被忽略。

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 string 类型
| Delim 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 个字符。