[cl-ppcre-devel] Buffered multi-line question
Edi Weitz
edi at agharta.de
Thu Oct 14 15:32:13 UTC 2004
On Thu, 14 Oct 2004 17:01:39 +0200, Sébastien Saint-Sevin <seb-cl-mailist at matchix.com> wrote:
> How can I then abort the scan quickly, while avoiding funcalling the
> filter with the rest of the string ? Something like (setf
> *start-pos* end-of-string-value) ?
No, never change these internal values unless you're looking for
trouble - see docs. Just return NIL from the filter. (I suppose you're
talking about the 0.9.0 filters here.)
Something like
(defvar *max-start-pos* 0)
(defun my-filter (pos)
(and (< pos *max-start-pos*) pos))
(scan '(:sequence ... (:filter my-filter 0) ...) target)
should assure that there's only a match if the position between the
first ... and the second ... is below *MAX-START-POS*.
The zero is optional but it'll potentially help the regex engine to
optimize the scanner depending on the rest of the parse tree.
Here's an example for optimization:
* (defun my-filter (pos)
(print "I was called")
pos)
MY-FILTER
* (cl-ppcre:scan '(:sequence "fo" (:filter my-filter) "bar") "xyzfoobar")
"I was called"
NIL
* (cl-ppcre:scan '(:sequence "fo" (:filter my-filter 0) "bar") "xyzfoobar")
NIL
Note that in the second example the filter wasn't called at all
because due to the zero-length declaration the regex engine was able
to determine that the target string must end with "fobar" - which it
didn't. In the first example this couldn't be done because there
wasn't enough information available.
You shouldn't lie to the regex engine, though... :)
> Thanks a lot, you're so good ;-)
Nah... :)
Cheers,
Edi.
More information about the Cl-ppcre-devel
mailing list