Files
re-flex/src/re_flex/R.kiss

70 lines
2.3 KiB
Plaintext

(var anyChar ".")
(var start "^")
(var end "\$")
// TODO these are very anglocentric:
(var capitalLetter "[A-Z]")
(var smallLetter "[a-z]")
(var anyLetter "[A-Za-z]")
(function :String _group [:Array<Dynamic> exprs]
(+ "(" (apply + (assert exprs)) ")"))
(var :Function group (Reflect.makeVarArgs _group))
(#when hxnodejs
(function :String _namedGroup [:Array<Dynamic> exprs]
(let [groupName (assert (exprs.shift))]
(_group (concat ["?<${groupName}>"] exprs))))
(var :Function namedGroup (Reflect.makeVarArgs _namedGroup)))
(function :String escape [:String str]
(group (EReg.escape str)))
(function :String _oneOf [:Array<Dynamic> exprs]
(group (exprs.join "|")))
(var :Function oneOf (Reflect.makeVarArgs _oneOf))
(function :String repeat [:String expr &opt :Int min :Int max]
(apply group
(concat
(for _ (range min) expr)
(cond
// unlimited repetitions after minimum if max is null:
(!max
[(group expr) "*"])
((= max min)
[])
(true
(for _ (range (- max min)) (oneOf expr "")))))))
// TODO could memoize compiled regexes
(function :Null<RMatch> match [:String regex :String textToSearch &opt :String flags]
(#if hxnodejs
(ifLet [match (the RegExpMatch (.exec (new RegExp regex /* TODO use or for this once it's fixed */ (if flags flags "")) textToSearch))]
(object
left
(textToSearch.substr 0 match.index)
match
(first match)
right
(textToSearch.substr (+ match.index .length (first match)))
group
->idx (nth match idx)
groups
match
namedGroups
match.groups))
(let [r (new EReg regex /*TODO use or for this once fixed */(if flags flags ""))]
(if (r.match textToSearch)
(object
left
(r.matchedLeft)
match
(r.matched 0)
right
(r.matchedRight)
group
->idx (r.matched idx))))))