CL-PPCRE is fast. Really fast. When compiled with a good native code compiler, benchmarks suggest that for most regular expressions CL-PPCRE is roughly twice as fast as Perl, often much faster. And Perl has one of the fastest non-lisp regular expression engines around: a highly optimised engine written in C.
And cl-ppcre gives you much more, for example, look to following python expression:
>>> re.findall(r'[(].*[)]', "abc(de(fgi)jk(lm)no)pq(rst)x") ['(de(fgi)jk(lm)no)pq(rst)']
You could achieve this with cl-ppcre as follows:
CL-USER> (ppcre:all-matches-as-strings "[(].*[)]" "abc(de(fgi)jk(lm)no)pq(rst)x") ("(de(fgi)jk(lm)no)pq(rst)")
But you can also use the much more powerfull and better readable lisp syntax:
CL-USER> (ppcre:all-matches-as-strings `(:sequence #\( (:greedy-repetition 0 nil :everything) #\)) "abc(de(fgi)jk(lm)no)pq(rst)x") ("(de(fgi)jk(lm)no)pq(rst)")
It's very simple, but assume we have following function in Lisp:
(defun make-balscan (begin end &optional (deep 0)) (lambda (pos &optional (chr (aref ppcre::*string* pos))) (unless (and (eql chr end) (= deep 0)) (cond ((eql chr begin) (incf deep)) ((eql chr end) (decf deep))) (1+ pos))))
Then you could write following regular expression:
CL-USER> (ppcre:all-matches-as-strings `(:sequence #\( (:greedy-repetition 0 nil (:filter ,(make-balscan #\( #\)))) #\)) "abc(de(fgi)jk(lm)no)pq(rst)x") ("(de(fgi)jk(lm)no)" "(rst)")
Congratulations! You have got a regular expression which takes care about balanced parenthesis!
Try to do that in Python, Perl, AWK, JAVA, C/C++, or what ever language you want :-)
Keine Kommentare:
Kommentar veröffentlichen