70 lines
2.3 KiB
Plaintext
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)))))) |