let rec is_match s i p j = if j = String.length p then i = String.length s else let first = i < String.length s && (p.[j] = '.' || p.[j] = s.[i]) in if j + 1 < String.length p && p.[j + 1] = '*' then is_match s i p (j + 2) || (first && is_match s (i + 1) p j) else first && is_match s (i + 1) p (j + 1) let count_match pats texts = let count = ref 0 in List.iter (fun p -> List.iter (fun t -> if is_match t 0 p 0 then count := !count + 1 ) texts ) pats; !count ;; let pats = [".a.b"; "a.*b"; "x*"; "a*b*c"] in let texts = ["aabb"; "axb"; ""; "abcd"; "abc"; "aaabbbc"; "x"] in count_match pats texts