Regexp matching on character streams.
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Regexp matching on character streams. The main idea is to provide a simple regular expressions library which takes characters not from string but from function "get":

val get: unit -> char Lwt.t

Primitives supported:
  "c" Matches character "c"
  "[abc]" Matches any of listed characters
  "[^abc]" Matches any of NOT listed characters
  "[\\^\\]]" Matches "^" or "]"
  "[^\\^\\]]" Matches NOT "^" and NOT "]"
  "(grp)" Grouping. Matched group can be extracted from result using function "nth".
  "." Matches any character. Be careful, Rex regexps have no looking-forward algorithms. Regexps such as ".+a" will not ever stop.

Repetition primitives:
  "c" Matches exactly one character "c"
  "c?" Matches zero or one "c"
  "c*" Matches zero or more of "c"'s
  "c+" Matches one or more of "c"'s
  "c{2,5}" Matches 2..5 of "c"'s

Usage example:

let regexp = Rex.regexp "GET ([^ ]+) HTTP"

let get =
   let s = "GET /some/uri HTTP/1.1\n" in
   let pos = ref 0 in
   fun () ->
      let r = s.[pos] in
      incr pos;
      Lwt.return r

let match =
   lwt r = Rex.apply ~get regexp in
   let result =
      match r with
         | None ->
            "no match"
         | Some r ->
            let uri = Rex.nth r 0 in
            "URI=" ^ uri
   Printf.printf "result is: %s\n" result

let _ = match