[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