val exec : ?pos:int ->?len:int ->re->string ->Group.t
exec re str searches str for a match of the compiled expression re, and returns the matched groups if any.
More specifically, when a match exists, exec returns a match that starts at the earliest position possible. If multiple such matches are possible, the one specified by the match semantics described below is returned.
Examples:
# let regex = Re.compile Re.(seq [str "//"; rep print ]);;
val regex : re = <abstr>
# Re.exec regex "// a C comment";;
- : Re.Group.t = <abstr>
# Re.exec regex "# a C comment?";;
Exception: Not_found
# Re.exec ~pos:1 regex "// a C comment";;
Exception: Not_found
parameterpos
optional beginning of the string (default 0)
parameterlen
length of the substring of str that can be matched (default -1, meaning to the end of the string)
raisesNot_found
if the regular expression can't be found in str
val exec_opt : ?pos:int ->?len:int ->re->string ->Group.t option
Similar to exec, but returns an option instead of using an exception.
Examples:
# let regex = Re.compile Re.(seq [str "//"; rep print ]);;
val regex : re = <abstr>
# Re.exec_opt regex "// a C comment";;
- : Re.Group.t option = Some <abstr>
# Re.exec_opt regex "# a C comment?";;
- : Re.Group.t option = None
# Re.exec_opt ~pos:1 regex "// a C comment";;
- : Re.Group.t option = None
val execp : ?pos:int ->?len:int ->re->string -> bool
Similar to exec, but returns true if the expression matches, and false if it doesn't. This function is more efficient than calling exec or exec_opt and ignoring the returned group.
Examples:
# let regex = Re.compile Re.(seq [str "//"; rep print ]);;
val regex : re = <abstr>
# Re.execp regex "// a C comment";;
- : bool = true
# Re.execp ~pos:1 regex "// a C comment";;
- : bool = false
More detailed version of execp. `Full is equivalent to true, while `Mismatch and `Partial are equivalent to false, but `Partial indicates the input string could be extended to create a match.
Examples:
# let regex = Re.compile Re.(seq [bos; str "// a C comment"]);;
val regex : re = <abstr>
# Re.exec_partial regex "// a C comment here.";;
- : [ `Full | `Mismatch | `Partial ] = `Full
# Re.exec_partial regex "// a C comment";;
- : [ `Full | `Mismatch | `Partial ] = `Partial
# Re.exec_partial regex "//";;
- : [ `Full | `Mismatch | `Partial ] = `Partial
# Re.exec_partial regex "# a C comment?";;
- : [ `Full | `Mismatch | `Partial ] = `Mismatch
val exec_partial_detailed :
?pos:int ->?len:int ->re->string ->[ `Full of Group.t| `Partial of int| `Mismatch ]
More detailed version of exec_opt. `Full group is equivalent to Some group, while `Mismatch and `Partial _ are equivalent to None, but `Partial position indicates that the input string could be extended to create a match, and no match could start in the input string before the given position. This could be used to not have to search the entirety of the input if more becomes available, and use the given position as the ?pos argument.
val all : ?pos:int ->?len:int ->re->string ->Group.t list
Repeatedly calls exec on the given string, starting at given position and length.
Examples:
# let regex = Re.compile Re.(seq [str "my"; blank; word(rep alpha)]);;
val regex : re = <abstr>
# Re.all regex "my head, my shoulders, my knees, my toes ...";;
- : Re.Group.t list = [<abstr>; <abstr>; <abstr>; <abstr>]
# Re.all regex "My head, My shoulders, My knees, My toes ...";;
- : Re.Group.t list = []
type'a gen = unit ->'a option
val all_gen : ?pos:int ->?len:int ->re->string ->Group.tgen
val matches : ?pos:int ->?len:int ->re->string ->string list
Same as all, but extracts the matched substring rather than returning the whole group. This basically iterates over matched strings.
Examples:
# let regex = Re.compile Re.(seq [str "my"; blank; word(rep alpha)]);;
val regex : re = <abstr>
# Re.matches regex "my head, my shoulders, my knees, my toes ...";;
- : string list = ["my head"; "my shoulders"; "my knees"; "my toes"]
# Re.matches regex "My head, My shoulders, My knees, My toes ...";;
- : string list = []
# Re.matches regex "my my my my head my 1 toe my ...";;
- : string list = ["my my"; "my my"]
# Re.matches ~pos:2 regex "my my my my head my +1 toe my ...";;
- : string list = ["my my"; "my head"]
val matches_gen : ?pos:int ->?len:int ->re->string ->string gen
val split : ?pos:int ->?len:int ->re->string ->string list
split re s splits s into chunks separated by re. It yields the chunks themselves, not the separator. An occurence of the separator at the beginning or the end of the string is ignoring.
Examples:
# let regex = Re.compile (Re.char ',');;
val regex : re = <abstr>
# Re.split regex "Re,Ocaml,Jerome Vouillon";;
- : string list = ["Re"; "Ocaml"; "Jerome Vouillon"]
# Re.split regex "No commas in this sentence.";;
- : string list = ["No commas in this sentence."]
# Re.split regex ",1,2,";;
- : string list = ["1"; "2"]
# Re.split ~pos:3 regex "1,2,3,4. Commas go brrr.";;
- : string list = ["3"; "4. Commas go brrr."]
Zero-length patterns:
Be careful when using split with zero-length patterns like eol, bow, and eow. Because they don't have any width, they will still be present in the result. (Note the position of the \n and space characters in the output.)
# Re.split (Re.compile Re.eol) "a\nb";;
- : string list = ["a"; "\nb"]
# Re.split (Re.compile Re.bow) "a b";;
- : string list = ["a "; "b"]
# Re.split (Re.compile Re.eow) "a b";;
- : string list = ["a"; " b"]
Compare this to the behavior of splitting on the char itself. (Note that the delimiters are not present in the output.)
# Re.split (Re.compile (Re.char '\n')) "a\nb";;
- : string list = ["a"; "b"]
# Re.split (Re.compile (Re.char ' ')) "a b";;
- : string list = ["a"; "b"]
val split_delim : ?pos:int ->?len:int ->re->string ->string list
split_delim re s splits s into chunks separated by re. It yields the chunks themselves, not the separator. Occurences of the separator at the beginning or the end of the string will produce empty chunks.
Examples:
# let regex = Re.compile (Re.char ',');;
val regex : re = <abstr>
# Re.split regex "Re,Ocaml,Jerome Vouillon";;
- : string list = ["Re"; "Ocaml"; "Jerome Vouillon"]
# Re.split regex "No commas in this sentence.";;
- : string list = ["No commas in this sentence."]
# Re.split regex ",1,2,";;
- : string list = [""; "1"; "2"; ""]
# Re.split ~pos:3 regex "1,2,3,4. Commas go brrr.";;
- : string list = ["3"; "4. Commas go brrr."]
Zero-length patterns:
Be careful when using split_delim with zero-length patterns like eol, bow, and eow. Because they don't have any width, they will still be present in the result. (Note the position of the \n and space characters in the output.)
# Re.split_delim (Re.compile Re.eol) "a\nb";;
- : string list = ["a"; "\nb"; ""]
# Re.split_delim (Re.compile Re.bow) "a b";;
- : string list = [""; "a "; "b"]
# Re.split_delim (Re.compile Re.eow) "a b";;
- : string list = ["a"; " b"; ""]
Compare this to the behavior of splitting on the char itself. (Note that the delimiters are not present in the output.)
# Re.split_delim (Re.compile (Re.char '\n')) "a\nb";;
- : string list = ["a"; "b"]
# Re.split_delim (Re.compile (Re.char ' ')) "a b";;
- : string list = ["a"; "b"]
val split_gen : ?pos:int ->?len:int ->re->string ->string gen
val split_full : ?pos:int ->?len:int ->re->string ->split_token list
split re s splits s into chunks separated by re. It yields the chunks along with the separators. For instance this can be used with a whitespace-matching re such as "[\t ]+".
Examples:
# let regex = Re.compile (Re.char ',');;
val regex : re = <abstr>
# Re.split_full regex "Re,Ocaml,Jerome Vouillon";;
- : Re.split_token list =
[`Text "Re"; `Delim <abstr>; `Text "Ocaml"; `Delim <abstr>;
`Text "Jerome Vouillon"]
# Re.split_full regex "No commas in this sentence.";;
- : Re.split_token list = [`Text "No commas in this sentence."]
# Re.split_full ~pos:3 regex "1,2,3,4. Commas go brrr.";;
- : Re.split_token list =
[`Delim <abstr>; `Text "3"; `Delim <abstr>; `Text "4. Commas go brrr."]
val split_full_gen : ?pos:int ->?len:int ->re->string ->split_tokengen
Only matches the whole string, i.e. fun t -> seq [ bos; t; eos ].
Match semantics
A regular expression frequently matches a string in multiple ways. For instance exec (compile (opt (str "a"))) "ab" can match "" or "a". Match semantic can be modified with the functions below, allowing one to choose which of these is preferable.
By default, the leftmost branch of alternations is preferred, and repetitions are greedy.
Note that the existence of matches cannot be changed by specifying match semantics. seq [ bos; str "a"; non_greedy (opt (str "b")); eos ] will match when applied to "ab". However if seq [ bos; str "a"; non_greedy (opt
(str "b")) ] is applied to "ab", it will match "a" rather than "ab".
Also note that multiple match semantics can conflict. In this case, the one executed earlier takes precedence. For instance, any match of shortest (seq
[ bos; group (rep (str "a")); group (rep (str "a")); eos ]) will always have an empty first group. Conversely, if we use longest instead of shortest, the second group will always be empty.
Longest match semantics. That is, matches will match as many bytes as possible. If multiple choices match the maximum amount of bytes, the one respecting the inner match semantics is preferred.
Delimit a group. The group is considered as matching if it is used at least once (it may be used multiple times if is nested inside rep for instance). If it is used multiple times, the last match is what gets captured.
When matching against nest e, only the group matching in the last match of e will be considered as matching.
For instance:
let re = compile (rep1 (nest (alt [ group (str "a"); str "b" ]))) in
let group = Re.exec re "ab" in
assert (Group.get_opt group 1 = None);
(* same thing but without [nest] *)
let re = compile (rep1 (alt [ group (str "a"); str "b" ])) in
let group = Re.exec re "ab" in
assert (Group.get_opt group 1 = Some "a")
val replace :
?pos:int ->?len:int ->?all:bool ->Re__.Compile.re->f:(Group.t-> string)->string ->
string
replace ~all re ~f s iterates on s, and replaces every occurrence of re with f substring where substring is the current match. If all = false, then only the first occurrence of re is replaced.
val replace_string :
?pos:int ->?len:int ->?all:bool ->Re__.Compile.re->by:string ->string ->
string
replace_string ~all re ~by s iterates on s, and replaces every occurrence of re with by. If all = false, then only the first occurrence of re is replaced.