123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119moduleRe=Coretyperegexp=Re.retypeflag=[`CASELESS|`MULTILINE|`ANCHORED]typesplit_result=|Textofstring|Delimofstring|Groupofint*string|NoGrouptypegroups=Core.Group.tletre?(flags=[])pat=letopts=List.map(function|`CASELESS->`Caseless|`MULTILINE->`Multiline|`ANCHORED->`Anchored)flagsinPerl.re~optspatletregexp?flagspat=Re.compile(re?flagspat)letextract~rexs=Re.Group.all(Re.execrexs)letexec~rex?poss=Re.execrex?possletget_substringsi=Re.Group.getsiletget_substring_ofssi=Re.Group.offsetsiletpmatch~rexs=Re.execprexsletsubstitute~rex~subststr=letb=Buffer.create1024inletreclooppos=ifpos>=String.lengthstrthenBuffer.contentsbelseifRe.execp~posrexstrthen(letss=Re.exec~posrexstrinletstart,fin=Re.Group.offsetss0inletpat=Re.Group.getss0inBuffer.add_substringbstrpos(start-pos);Buffer.add_stringb(substpat);loopfin)else(Buffer.add_substringbstrpos(String.lengthstr-pos);loop(String.lengthstr))inloop0letsplit~rexstr=letrecloopaccupos=ifpos>=String.lengthstrthenList.revaccuelseifRe.execp~posrexstrthen(letss=Re.exec~posrexstrinletstart,fin=Re.Group.offsetss0inlets=String.substrpos(start-pos)inloop(s::accu)fin)else(lets=String.substrpos(String.lengthstr-pos)inloop(s::accu)(String.lengthstr))inloop[]0(* From PCRE *)letstring_unsafe_subsofslen=letr=Bytes.createleninBytes.unsafe_blitsofsr0len;Bytes.unsafe_to_stringrletquotes=letlen=String.lengthsinletbuf=Bytes.create(lenlsl1)inletpos=ref0infori=0tolen-1domatchString.unsafe_getsiwith|'\\'|'^'|'$'|'.'|'['|'|'|'('|')'|'?'|'*'|'+'|'{'asc->Bytes.unsafe_setbuf!pos'\\';incrpos;Bytes.unsafe_setbuf!posc;incrpos|c->Bytes.unsafe_setbuf!posc;incrposdone;string_unsafe_subbuf0!posletfull_split?(max=0)~rexs=ifString.lengths=0then[]elseifmax=1then[Texts]elseletresults=Re.split_fullrexsinletmatches=List.map(function|`Texts->[Texts]|`Delimd->letmatches=Re.Group.all_offsetdinletdelim=Re.Group.getd0in(Delimdelim)::(letl=ref[]infori=1toArray.lengthmatches-1dol:=(ifmatches.(i)=(-1,-1)thenNoGroupelseGroup(i,Re.Group.getdi))::(!l)done;List.rev!l))resultsinList.concatmatchestypesubstrings=Group.t