summaryrefslogtreecommitdiffstats
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/string.ml20
-rw-r--r--stdlib/string.mli18
2 files changed, 38 insertions, 0 deletions
diff --git a/stdlib/string.ml b/stdlib/string.ml
index fda40b527..9e4412b3b 100644
--- a/stdlib/string.ml
+++ b/stdlib/string.ml
@@ -203,3 +203,23 @@ let rcontains_from s i c =
type t = string
let compare (x: t) (y: t) = Pervasives.compare x y
+
+(* split a string [s] at every char [c], and return the list of sub-strings *)
+let split s c =
+ let len = length s in
+ let rec iter pos to_rev =
+ if pos = len then List.rev ("" :: to_rev) else
+ match try
+ Some ( index_from s pos c )
+ with Not_found -> None
+ with
+ Some pos2 ->
+ if pos2 = pos then iter (pos+1) ("" :: to_rev) else
+ iter (pos2+1) ((sub s pos (pos2-pos)) :: to_rev)
+ | None -> List.rev ( sub s pos (len-pos) :: to_rev )
+ in
+ iter 0 []
+
+let cut_at s c =
+ let pos = index s c in
+ sub s 0 pos, sub s (pos+1) (length s - pos - 1)
diff --git a/stdlib/string.mli b/stdlib/string.mli
index 14f2c82db..563dba714 100644
--- a/stdlib/string.mli
+++ b/stdlib/string.mli
@@ -219,6 +219,24 @@ val compare: t -> t -> int
allows the module [String] to be passed as argument to the functors
{!Set.Make} and {!Map.Make}. *)
+val split : string -> char -> string list
+(** [String.split string char] splits the string [string] at every char
+ [char], and returns the list of sub-strings between the chars.
+ [String.concat (String.make 1 c) (String.split s c)] is the identity.
+ @since 4.01
+ *)
+
+val cut_at : string -> char -> string * string
+(** [String.cut_at s c] returns a pair containing the sub-string before
+ the first occurrence of [c] in [s], and the sub-string after the
+ first occurrence of [c] in [s].
+ [let (before, after) = String.cut_at s c in
+ before ^ String.make 1 c ^ after] is the identity if [s] contains [c].
+
+ Raise [Not_found] if the character does not appear in the string
+ @since 4.01
+*)
+
(**/**)
(* The following is for system use only. Do not call directly. *)