diff --git a/CHANGELOG b/CHANGELOG index a2f14e8..1091b19 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,15 @@ +Version 2.0.0 +2008-07-23 +Added named properties (\p{foo}) +Added Unicode support +Introduced test functions for character classes +Added optional test function optimization +Cleaned up test suite, removed performance cruft +Removed the various alternative system definitions (too much maintenance work) +Exported PARSE-STRING +General cleanup +Lots of documentation additions + Version 1.4.1 2008-07-03 Skip non-characters in CREATE-RANGES-FROM-SET diff --git a/README b/README deleted file mode 100644 index 1b92efd..0000000 --- a/README +++ /dev/null @@ -1,62 +0,0 @@ -Complete documentation for CL-PPCRE can be found in the 'doc' -directory. - -CL-PPCRE also supports Nikodemus Siivola's HYPERDOC, see - and -. - -1. Installation - -1.1. Probably the easiest way is - - (load "/path/to/cl-ppcre/load.lisp") - - This should compile and load CL-PPCRE on most Common Lisp - implementations. - -1.2. With MK:DEFSYSTEM you can make a symbolic link from - 'cl-ppcre.system' and 'cl-ppcre-test.system' to your central registry - (which by default is in '/usr/local/lisp/Registry/') and then issue - the command - - (mk:compile-system "cl-ppcre") - - Note that this relies on TRUENAME returning the original file a - symbolic link is pointing to. This will only work with AllegroCL - 6.2 if you've applied all patches with (SYS:UPDATE-ALLEGRO). - -1.3. You can also use ASDF instead of MK:DEFSYSTEM in a similar way - (use the .asd files instead of the .system files). - -1.4. For LispWorks there's a file 'lispworks-defsystem.lisp' which includes - a system definition for LispWork's Common Defsystem. - -2. Test - -CL-PPCRE comes with a test suite that can be used to check its -compatibility with Perl's regex syntax. See the documentation on how -to use this test suite for benchmarks and on how to write your own -tests. - -2.1. If you've used 'load.lisp' to load CL-PPCRE you already have the - test suite loaded and can start the default tests with - - (cl-ppcre-test:test) - -2.2. With MK:DEFSYSTEM you need to compile the 'cl-ppcre-test' system - as well before you can proceed as in 2.1. - -2.3. Same for ASDF. - -Depending on your machine and your CL implementation the default test -will take between a few seconds and a couple of minutes. (It will -print a dot for every tenth test case while it proceeds to give some -visual feedback.) It should exactly report three 'errors' (662, 790, -and 1439) which are explained in the documentation. - -MCL might report an error for the ninth test case which is also -explained in the docs. - -Genera notes (thanks to Patrick O'Donnell): Some more tests will fail -because characters like #\Return, #\Linefeed, or #\Tab have encodings -which differ from Perl's (and thus CL-PPCRE's) expectations. diff --git a/api.lisp b/api.lisp index e3523c3..b0aba9a 100644 --- a/api.lisp +++ b/api.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/api.lisp,v 1.79 2008/07/03 08:39:10 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/api.lisp,v 1.84 2008/07/06 18:12:04 edi Exp $ ;;; The external API for creating and using scanners. @@ -29,7 +29,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (defgeneric create-scanner (regex &key case-insensitive-mode multi-line-mode @@ -39,10 +39,10 @@ (:documentation "Accepts a regular expression - either as a parse-tree or as a string - and returns a scan closure which will scan strings for this regular expression and a list mapping registers to -their names \(NIL stands for unnamed ones). The \"mode\" keyboard -arguments are equivalent to the imsx modifiers in Perl. If DESTRUCTIVE -is not NIL the function is allowed to destructively modify its first -argument \(but only if it's a parse tree).")) +their names \(NIL stands for unnamed ones). The \"mode\" keyboard +arguments are equivalent to the imsx modifiers in Perl. If +DESTRUCTIVE is not NIL, the function is allowed to destructively +modify its first argument \(but only if it's a parse tree).")) #-:use-acl-regexp2-engine (defmethod create-scanner ((regex-string string) &key case-insensitive-mode @@ -76,8 +76,7 @@ argument \(but only if it's a parse tree).")) (declare #.*standard-optimize-settings*) (declare (ignore destructive)) (when (or case-insensitive-mode multi-line-mode single-line-mode extended-mode) - (signal-ppcre-invocation-error - "You can't use the keyword arguments to modify an existing scanner.")) + (signal-invocation-error "You can't use the keyword arguments to modify an existing scanner.")) scanner) #-:use-acl-regexp2-engine @@ -88,8 +87,7 @@ argument \(but only if it's a parse tree).")) destructive) (declare #.*standard-optimize-settings*) (when extended-mode - (signal-ppcre-invocation-error - "Extended mode doesn't make sense in parse trees.")) + (signal-invocation-error "Extended mode doesn't make sense in parse trees.")) ;; convert parse-tree into internal representation REGEX and at the ;; same time compute the number of registers and the constant string ;; (or anchor) the regex starts with (if any) @@ -180,7 +178,6 @@ argument \(but only if it's a parse tree).")) #+:use-acl-regexp2-engine (declaim (inline create-scanner)) - #+:use-acl-regexp2-engine (defmethod create-scanner ((scanner regexp::regular-expression) &key case-insensitive-mode multi-line-mode @@ -190,8 +187,7 @@ argument \(but only if it's a parse tree).")) (declare #.*standard-optimize-settings*) (declare (ignore destructive)) (when (or case-insensitive-mode multi-line-mode single-line-mode extended-mode) - (signal-ppcre-invocation-error - "You can't use the keyword arguments to modify an existing scanner.")) + (signal-invocation-error "You can't use the keyword arguments to modify an existing scanner.")) scanner) #+:use-acl-regexp2-engine @@ -254,7 +250,6 @@ internal purposes.")) #+:use-acl-regexp2-engine (declaim (inline scan)) - #+:use-acl-regexp2-engine (defmethod scan ((parse-tree t) target-string &key (start 0) @@ -292,12 +287,12 @@ internal purposes.")) (defun scan-to-strings (regex target-string &key (start 0) (end (length target-string)) sharedp) - (declare #.*standard-optimize-settings*) "Like SCAN but returns substrings of TARGET-STRING instead of positions, i.e. this function returns two values on success: the whole match as a string plus an array of substrings (or NILs) corresponding -to the matched registers. If SHAREDP is true, the substrings may share -structure with TARGET-STRING." +to the matched registers. If SHAREDP is true, the substrings may +share structure with TARGET-STRING." + (declare #.*standard-optimize-settings*) (multiple-value-bind (match-start match-end reg-starts reg-ends) (scan regex target-string :start start :end end) (unless match-start @@ -329,11 +324,11 @@ structure with TARGET-STRING." "Executes BODY with the variables in VAR-LIST bound to the corresponding register groups after TARGET-STRING has been matched against REGEX, i.e. each variable is either bound to a string or to -NIL. If there is no match, BODY is _not_ executed. For each element of -VAR-LIST which is NIL there's no binding to the corresponding register -group. The number of variables in VAR-LIST must not be greater than -the number of register groups. If SHAREDP is true, the substrings may -share structure with TARGET-STRING." +NIL. If there is no match, BODY is _not_ executed. For each element +of VAR-LIST which is NIL there's no binding to the corresponding +register group. The number of variables in VAR-LIST must not be +greater than the number of register groups. If SHAREDP is true, the +substrings may share structure with TARGET-STRING." (with-rebinding (target-string) (with-unique-names (match-start match-end reg-starts reg-ends start-index substr-fn) @@ -368,10 +363,10 @@ share structure with TARGET-STRING." &environment env) "Iterates over TARGET-STRING and tries to match REGEX as often as possible evaluating BODY with MATCH-START, MATCH-END, REG-STARTS, and -REG-ENDS bound to the four return values of each match in turn. After +REG-ENDS bound to the four return values of each match in turn. After the last match, returns RESULT-FORM if provided or NIL otherwise. An implicit block named NIL surrounds DO-SCANS; RETURN may be used to -terminate the loop immediately. If REGEX matches an empty string the +terminate the loop immediately. If REGEX matches an empty string the scan is continued one position behind this match. BODY may start with declarations." (with-rebinding (target-string) @@ -427,11 +422,11 @@ declarations." &body body) "Iterates over TARGET-STRING and tries to match REGEX as often as possible evaluating BODY with MATCH-START and MATCH-END bound to the -start/end positions of each match in turn. After the last match, -returns RESULT-FORM if provided or NIL otherwise. An implicit block +start/end positions of each match in turn. After the last match, +returns RESULT-FORM if provided or NIL otherwise. An implicit block named NIL surrounds DO-MATCHES; RETURN may be used to terminate the -loop immediately. If REGEX matches an empty string the scan is -continued one position behind this match. BODY may start with +loop immediately. If REGEX matches an empty string the scan is +continued one position behind this match. BODY may start with declarations." ;; this is a simplified form of DO-SCANS - we just provide two dummy ;; vars and ignore them @@ -450,12 +445,12 @@ declarations." &body body) "Iterates over TARGET-STRING and tries to match REGEX as often as possible evaluating BODY with MATCH-VAR bound to the substring of -TARGET-STRING corresponding to each match in turn. After the last -match, returns RESULT-FORM if provided or NIL otherwise. An implicit +TARGET-STRING corresponding to each match in turn. After the last +match, returns RESULT-FORM if provided or NIL otherwise. An implicit block named NIL surrounds DO-MATCHES-AS-STRINGS; RETURN may be used to -terminate the loop immediately. If REGEX matches an empty string the -scan is continued one position behind this match. If SHAREDP is true, -the substrings may share structure with TARGET-STRING. BODY may start +terminate the loop immediately. If REGEX matches an empty string the +scan is continued one position behind this match. If SHAREDP is true, +the substrings may share structure with TARGET-STRING. BODY may start with declarations." (with-rebinding (target-string) (with-unique-names (match-start match-end substr-fn) @@ -475,15 +470,16 @@ with declarations." "Iterates over TARGET-STRING and tries to match REGEX as often as possible evaluating BODY with the variables in VAR-LIST bound to the corresponding register groups for each match in turn, i.e. each -variable is either bound to a string or to NIL. For each element of +variable is either bound to a string or to NIL. For each element of VAR-LIST which is NIL there's no binding to the corresponding register group. The number of variables in VAR-LIST must not be greater than -the number of register groups. After the last match, returns -RESULT-FORM if provided or NIL otherwise. An implicit block named NIL +the number of register groups. After the last match, returns +RESULT-FORM if provided or NIL otherwise. An implicit block named NIL surrounds DO-REGISTER-GROUPS; RETURN may be used to terminate the loop immediately. If REGEX matches an empty string the scan is continued -one position behind this match. If SHAREDP is true, the substrings may -share structure with TARGET-STRING. BODY may start with declarations." +one position behind this match. If SHAREDP is true, the substrings +may share structure with TARGET-STRING. BODY may start with +declarations." (with-rebinding (target-string) (with-unique-names (substr-fn match-start match-end reg-starts reg-ends start-index) @@ -510,11 +506,11 @@ share structure with TARGET-STRING. BODY may start with declarations." (defun all-matches (regex target-string &key (start 0) (end (length target-string))) - (declare #.*standard-optimize-settings*) "Returns a list containing the start and end positions of all matches of REGEX against TARGET-STRING, i.e. if there are N matches -the list contains (* 2 N) elements. If REGEX matches an empty string +the list contains (* 2 N) elements. If REGEX matches an empty string the scan is continued one position behind this match." + (declare #.*standard-optimize-settings*) (let (result-list) (do-matches (match-start match-end regex target-string @@ -536,11 +532,11 @@ compile time." &key (start 0) (end (length target-string)) sharedp) - (declare #.*standard-optimize-settings*) "Returns a list containing all substrings of TARGET-STRING which match REGEX. If REGEX matches an empty string the scan is continued one position behind this match. If SHAREDP is true, the substrings may share structure with TARGET-STRING." + (declare #.*standard-optimize-settings*) (let (result-list) (do-matches-as-strings (match regex target-string (nreverse result-list) :start start :end end :sharedp sharedp) @@ -563,18 +559,18 @@ compile time." with-registers-p omit-unmatched-p sharedp) - (declare #.*standard-optimize-settings*) "Matches REGEX against TARGET-STRING as often as possible and -returns a list of the substrings between the matches. If +returns a list of the substrings between the matches. If WITH-REGISTERS-P is true, substrings corresponding to matched -registers are inserted into the list as well. If OMIT-UNMATCHED-P is +registers are inserted into the list as well. If OMIT-UNMATCHED-P is true, unmatched registers will simply be left out, otherwise they will -show up as NIL. LIMIT limits the number of elements returned - -registers aren't counted. If LIMIT is NIL (or 0 which is equivalent), -trailing empty strings are removed from the result list. If REGEX -matches an empty string the scan is continued one position behind this -match. If SHAREDP is true, the substrings may share structure with -TARGET-STRING." +show up as NIL. LIMIT limits the number of elements returned - +registers aren't counted. If LIMIT is NIL \(or 0 which is +equivalent), trailing empty strings are removed from the result list. +If REGEX matches an empty string the scan is continued one position +behind this match. If SHAREDP is true, the substrings may share +structure with TARGET-STRING." + (declare #.*standard-optimize-settings*) ;; initialize list of positions POS-LIST to extract substrings with ;; START so that the start of the next match will mark the end of ;; the first substring @@ -637,13 +633,13 @@ TARGET-STRING." (defun string-case-modifier (str from to start end) (declare #.*standard-optimize-settings*) - (declare (type fixnum from to start end)) + (declare (fixnum from to start end)) "Checks whether all words in STR between FROM and TO are upcased, downcased or capitalized and returns a function which applies a -corresponding case modification to strings. Returns #'IDENTITY +corresponding case modification to strings. Returns #'IDENTITY otherwise, especially if words in the target area extend beyond FROM -or TO. STR is supposed to be bounded by START and END. It is assumed -that (<= START FROM TO END)." +or TO. STR is supposed to be bounded by START and END. It is assumed +that \(<= START FROM TO END)." (case (if (or (<= to from) (and (< start from) @@ -740,9 +736,8 @@ S-expression.")) ((#\\) :backslash))))) (when (and (numberp token) (< token 0)) ;; make sure we don't accept something like "\\0" - (signal-ppcre-invocation-error - "Illegal substring ~S in replacement string" - (subseq replacement-string match-start match-end))) + (signal-invocation-error "Illegal substring ~S in replacement string." + (subseq replacement-string match-start match-end))) (push token collector)) ;; remember where the match ended (setq from match-end)) @@ -801,9 +796,8 @@ S-expression.")) ((#\\) :backslash))))) (when (and (numberp token) (< token 0)) ;; make sure we don't accept something like "\\0" - (signal-ppcre-invocation-error - "Illegal substring ~S in replacement string" - (subseq replacement match-start match-end))) + (signal-invocation-error "Illegal substring ~S in replacement string." + (subseq replacement match-start match-end))) (push token collector)) ;; remember where the match ended (setq from match-end)) @@ -843,9 +837,8 @@ corresponding string." (when (>= token reg-bound) ;; but only if the register was referenced in the ;; regular expression - (signal-ppcre-invocation-error - "Reference to non-existent register ~A in replacement string" - (1+ token))) + (signal-invocation-error "Reference to non-existent register ~A in replacement string." + (1+ token))) (when (svref reg-starts token) ;; and only if it matched, i.e. no match results ;; in an empty string @@ -909,11 +902,11 @@ corresponding string." (defun replace-aux (target-string replacement pos-list reg-list start end preserve-case simple-calls element-type) + "Auxiliary function used by REGEX-REPLACE and REGEX-REPLACE-ALL. +POS-LIST contains a list with the start and end positions of all +matches while REG-LIST contains a list of arrays representing the +corresponding register start and end positions." (declare #.*standard-optimize-settings*) - "Auxiliary function used by REGEX-REPLACE and -REGEX-REPLACE-ALL. POS-LIST contains a list with the start and end -positions of all matches while REG-LIST contains a list of arrays -representing the corresponding register start and end positions." ;; build the template once before we start the loop (let ((replacement-template (build-replacement-template replacement))) (with-output-to-string (s nil :element-type element-type) @@ -955,7 +948,6 @@ representing the corresponding register start and end positions." preserve-case simple-calls (element-type #+:lispworks 'lw:simple-char #-:lispworks 'character)) - (declare #.*standard-optimize-settings*) "Try to match TARGET-STRING between START and END against REGEX and replace the first match with REPLACEMENT. Two values are returned; the modified string, and T if REGEX matched or NIL otherwise. @@ -985,6 +977,7 @@ match. The result will always be a fresh string, even if REGEX doesn't match. ELEMENT-TYPE is the element type of the resulting string." + (declare #.*standard-optimize-settings*) (multiple-value-bind (match-start match-end reg-starts reg-ends) (scan regex target-string :start start :end end) (if match-start @@ -1012,7 +1005,6 @@ match. preserve-case simple-calls (element-type #+:lispworks 'lw:simple-char #-:lispworks 'character)) - (declare #.*standard-optimize-settings*) "Try to match TARGET-STRING between START and END against REGEX and replace all matches with REPLACEMENT. Two values are returned; the modified string, and T if REGEX matched or NIL otherwise. @@ -1042,6 +1034,7 @@ match. The result will always be a fresh string, even if REGEX doesn't match. ELEMENT-TYPE is the element type of the resulting string." + (declare #.*standard-optimize-settings*) (let ((pos-list '()) (reg-list '())) (do-scans (match-start match-end reg-starts reg-ends regex target-string @@ -1102,6 +1095,9 @@ scanner, a case-insensitive scanner is used." #+:cormanlisp (defmacro do-with-all-symbols ((variable package-or-packagelist) &body body) + "Executes BODY with VARIABLE bound to each symbol in +PACKAGE-OR-PACKAGELIST \(a designator for a list of packages) in +turn." (with-unique-names (pack-var) `(if (listp ,package-or-packagelist) (dolist (,pack-var ,package-or-packagelist) @@ -1113,11 +1109,11 @@ scanner, a case-insensitive scanner is used." #+:cormanlisp (defmacro regex-apropos-aux ((regex packages case-insensitive &optional return-form) &body body) - "Auxiliary macro used by REGEX-APROPOS and REGEX-APROPOS-LIST. Loops -through PACKAGES and executes BODY with SYMBOL bound to each symbol -which matches REGEX. Optionally evaluates and returns RETURN-FORM at -the end. If CASE-INSENSITIVE is true and REGEX isn't already a -scanner, a case-insensitive scanner is used." + "Auxiliary macro used by REGEX-APROPOS and REGEX-APROPOS-LIST. +Loops through PACKAGES and executes BODY with SYMBOL bound to each +symbol which matches REGEX. Optionally evaluates and returns +RETURN-FORM at the end. If CASE-INSENSITIVE is true and REGEX isn't +already a scanner, a case-insensitive scanner is used." (with-rebinding (regex) (with-unique-names (scanner %packages hash) `(let* ((,scanner (create-scanner ,regex @@ -1137,7 +1133,7 @@ scanner, a case-insensitive scanner is used." (defun regex-apropos-list (regex &optional packages &key (case-insensitive t)) (declare #.*standard-optimize-settings*) "Similar to the standard function APROPOS-LIST but returns a list of -all symbols which match the regular expression REGEX. If +all symbols which match the regular expression REGEX. If CASE-INSENSITIVE is true and REGEX isn't already a scanner, a case-insensitive scanner is used." (let ((collector '())) @@ -1189,7 +1185,7 @@ meaningful information about a symbol." (defun regex-apropos (regex &optional packages &key (case-insensitive t)) "Similar to the standard function APROPOS but returns a list of all -symbols which match the regular expression REGEX. If CASE-INSENSITIVE +symbols which match the regular expression REGEX. If CASE-INSENSITIVE is true and REGEX isn't already a scanner, a case-insensitive scanner is used." (declare #.*standard-optimize-settings*) @@ -1232,7 +1228,7 @@ sections. These sections may nest." (quote-token-replace-scanner "\\\\([QE])")) (defun clean-comments (string &optional extended-mode) "Clean \(?#...) comments within STRING for quoting, i.e. convert -\\Q to Q and \\E to E. If EXTENDED-MODE is true, also clean +\\Q to Q and \\E to E. If EXTENDED-MODE is true, also clean end-of-line comments, i.e. those starting with #\\# and ending with #\\Newline." (flet ((remove-tokens (target-string start end match-start @@ -1251,7 +1247,7 @@ end-of-line comments, i.e. those starting with #\\# and ending with #'remove-tokens)))) (defun parse-tree-synonym (symbol) - "Returns the parse tree the SYMBOL symbol is a synonym for. Returns + "Returns the parse tree the SYMBOL symbol is a synonym for. Returns NIL is SYMBOL wasn't yet defined to be a synonym." (get symbol 'parse-tree-synonym)) @@ -1261,6 +1257,6 @@ NIL is SYMBOL wasn't yet defined to be a synonym." (defmacro define-parse-tree-synonym (name parse-tree) "Defines the symbol NAME to be a synonym for the parse tree -PARSE-TREE. Both arguments are quoted." +PARSE-TREE. Both arguments are quoted." `(eval-when (:compile-toplevel :load-toplevel :execute) (setf (parse-tree-synonym ',name) ',parse-tree))) diff --git a/charmap.lisp b/charmap.lisp new file mode 100644 index 0000000..b5f4085 --- /dev/null +++ b/charmap.lisp @@ -0,0 +1,152 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/charmap.lisp,v 1.18 2008/07/22 23:54:59 edi Exp $ + +;;; An optimized representation of sets of characters. + +;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-ppcre) + +(defstruct (charmap (:constructor make-charmap%)) + ;; a bit vector mapping char codes to "booleans" (1 for set members, + ;; 0 for others) + (vector #*0 :type simple-bit-vector) + ;; the smallest character code of all characters in the set + (start 0 :type fixnum) + ;; the upper (exclusive) bound of all character codes in the set + (end 0 :type fixnum) + ;; the number of characters in the set, or NIL if this is unknown + (count nil :type (or fixnum null)) + ;; whether the charmap actually represents the complement of the set + (complementp nil :type boolean)) + +;; seems to be necessary for some Lisps like ClozureCL +(defmethod make-load-form ((map charmap) &optional environment) + (make-load-form-saving-slots map :environment environment)) + +(declaim (inline in-charmap-p)) +(defun in-charmap-p (char charmap) + "Tests whether the character CHAR belongs to the set represented by CHARMAP." + (declare #.*standard-optimize-settings*) + (declare (character char) (charmap charmap)) + (let* ((char-code (char-code char)) + (char-in-vector-p + (let ((charmap-start (charmap-start charmap))) + (declare (fixnum charmap-start)) + (and (<= charmap-start char-code) + (< char-code (the fixnum (charmap-end charmap))) + (= 1 (sbit (the simple-bit-vector (charmap-vector charmap)) + (- char-code charmap-start))))))) + (cond ((charmap-complementp charmap) (not char-in-vector-p)) + (t char-in-vector-p)))) + +(defun charmap-contents (charmap) + "Returns a list of all characters belonging to a character map. +Only works for non-complement charmaps." + (declare #.*standard-optimize-settings*) + (declare (charmap charmap)) + (and (not (charmap-complementp charmap)) + (loop for code of-type fixnum from (charmap-start charmap) to (charmap-end charmap) + for i across (the simple-bit-vector (charmap-vector charmap)) + when (= i 1) + collect (code-char code)))) + +(defun make-charmap (start end test-function &optional complementp) + "Creates and returns a charmap representing all characters with +character codes in the interval [start end) that satisfy +TEST-FUNCTION. The COMPLEMENTP slot of the charmap is set to the +value of the optional argument, but this argument doesn't have an +effect on how TEST-FUNCTION is used." + (declare #.*standard-optimize-settings*) + (declare (fixnum start end)) + (let ((vector (make-array (- end start) :element-type 'bit)) + (count 0)) + (declare (fixnum count)) + (loop for code from start below end + for char = (code-char code) + for index from 0 + when char do + (incf count) + (setf (sbit vector index) (if (funcall test-function char) 1 0))) + (make-charmap% :vector vector + :start start + :end end + ;; we don't know for sure if COMPLEMENTP is true as + ;; there isn't a necessary a character for each + ;; integer below *REGEX-CHAR-CODE-LIMIT* + :count (and (not complementp) count) + ;; make sure it's boolean + :complementp (not (not complementp))))) + +(defun create-charmap-from-test-function (test-function start end) + "Creates and returns a charmap representing all characters with +character codes between START and END which satisfy TEST-FUNCTION. +Tries to find the smallest interval which is necessary to represent +the character set and uses the complement representation if that +helps." + (declare #.*standard-optimize-settings*) + (let (start-in end-in start-out end-out) + ;; determine the smallest intervals containing the set and its + ;; complement, [start-in, end-in) and [start-out, end-out) - first + ;; the lower bound + (loop for code from start below end + for char = (code-char code) + until (and start-in start-out) + when (and char + (not start-in) + (funcall test-function char)) + do (setq start-in code) + when (and char + (not start-out) + (not (funcall test-function char))) + do (setq start-out code)) + (unless start-in + ;; no character satisfied the test, so return a "pseudo" charmap + ;; where IN-CHARMAP-P is always false + (return-from create-charmap-from-test-function + (make-charmap% :count 0))) + (unless start-out + ;; no character failed the test, so return a "pseudo" charmap + ;; where IN-CHARMAP-P is always true + (return-from create-charmap-from-test-function + (make-charmap% :complementp t))) + ;; now determine upper bound + (loop for code from (1- end) downto start + for char = (code-char code) + until (and end-in end-out) + when (and char + (not end-in) + (funcall test-function char)) + do (setq end-in (1+ code)) + when (and char + (not end-out) + (not (funcall test-function char))) + do (setq end-out (1+ code))) + ;; use the smaller interval + (cond ((<= (- end-in start-in) (- end-out start-out)) + (make-charmap start-in end-in test-function)) + (t (make-charmap start-out end-out (complement* test-function) t))))) diff --git a/charset.lisp b/charset.lisp index 11ccb0a..f852071 100755 --- a/charset.lisp +++ b/charset.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/charset.lisp,v 1.4 2008/07/03 08:39:10 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/charset.lisp,v 1.9 2008/07/23 00:47:58 edi Exp $ ;;; A specialized set implementation for characters by Nikodemus Siivola. @@ -30,7 +30,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (defconstant +probe-depth+ 3 "Maximum number of collisions \(for any element) we accept before we @@ -45,7 +45,7 @@ initialized to #\Null except for the first one which is initialized to #\?." (declare #.*standard-optimize-settings*) (declare (type (integer 2 #.(1- array-total-size-limit)) size)) - ;; Since #\Null always hashes to 0, store something else there + ;; since #\Null always hashes to 0, store something else there ;; initially, and #\Null everywhere else (let ((result (make-array size :element-type #-:lispworks 'character #+:lispworks 'lw:simple-char @@ -53,7 +53,7 @@ initialized to #\Null except for the first one which is initialized to (setf (char result 0) #\?) result)) -(defstruct (charset (:constructor make-charset)) +(defstruct (charset (:constructor make-charset ())) ;; this is set to 0 when we stop hashing and just use a CHAR-CODE ;; indexed vector (depth +probe-depth+ :type fixnum) @@ -92,7 +92,7 @@ to the hash code HASH." (depth (charset-depth set)) (code (char-code char))) (declare (fixnum depth)) - ;; As long as the set remains reasonably small, we use non-linear + ;; as long as the set remains reasonably small, we use non-linear ;; hashing - the first hash of any character is its CHAR-CODE, and ;; subsequent hashes are computed by MIX above (cond ((or @@ -129,14 +129,15 @@ to the hash code HASH." "Adds the character CHAR to the charset SET, extending SET if necessary. Returns CHAR." (declare #.*standard-optimize-settings*) - (or (%add-to-charset char set) + (or (%add-to-charset char set t) (%add-to-charset/expand char set) (error "Oops, this should not happen...")) char) -(defun %add-to-charset (char set) +(defun %add-to-charset (char set count) "Tries to add the character CHAR to the charset SET without -extending it. Returns NIL if this fails." +extending it. Returns NIL if this fails. Counts CHAR as new +if COUNT is true and it is added to SET." (declare #.*standard-optimize-settings*) (declare (character char) (charset set)) (let ((vector (charset-vector set)) @@ -144,8 +145,12 @@ extending it. Returns NIL if this fails." (code (char-code char))) (declare (fixnum depth)) ;; see comments in IN-CHARSET-P for algorithm - (cond ((or (zerop depth) (zerop code)) - (setf (char vector code) char)) + (cond ((or (zerop depth) (zerop code)) + (unless (eq char (char vector code)) + (setf (char vector code) char) + (when count + (incf (charset-count set)))) + char) (t (let ((hash code)) (tagbody @@ -154,7 +159,8 @@ extending it. Returns NIL if this fails." (x (char vector index))) (cond ((eq x (code-char 0)) (setf (char vector index) char) - (incf (charset-count set)) + (when count + (incf (charset-count set))) (return-from %add-to-charset char)) ((eq x char) (return-from %add-to-charset char)) @@ -184,7 +190,10 @@ extending it. Returns NIL if this fails." (setf (charset-depth set) new-depth (charset-vector set) new-vector) (flet ((try-add (x) - (unless (%add-to-charset x set) + ;; don't count - old characters are already accounted + ;; for, and might count the new one multiple times as + ;; well + (unless (%add-to-charset x set nil) (assert (not (zerop new-depth))) (setf new-size (* 2 new-size)) (go :retry)))) @@ -196,32 +205,38 @@ extending it. Returns NIL if this fails." (try-add x)) (unless (zerop i) (try-add x)))))))) + ;; added and expanded, /now/ count the new character. + (incf (charset-count set)) t)) -(defun all-characters (set) - "Returns a list of all characters in the charset SET." +(defun map-charset (function charset) + "Calls FUNCTION with all characters in SET. Returns NIL." (declare #.*standard-optimize-settings*) - (loop with count = (charset-count set) - with counter = 0 - for code below char-code-limit - for char = (code-char code) - while (< counter count) - when (and char (in-charset-p char set)) - do (incf counter) - and collect char)) + (declare (function function)) + (let* ((n (charset-count charset)) + (vector (charset-vector charset)) + (size (length vector))) + ;; see comments in IN-CHARSET-P for algorithm + (when (eq (code-char 0) (char vector 0)) + (funcall function (code-char 0)) + (decf n)) + (loop for i from 1 below size + for char = (char vector i) + unless (eq (code-char 0) char) do + (funcall function char) + ;; this early termination test should be worth it when + ;; mapping across depth 0 charsets. + (when (zerop (decf n)) + (return-from map-charset nil)))) + nil) -(defun merge-set (set1 set2 &optional invertedp) - "Returns the \"sum\" of two charsets. This is a destructive -operation on SET1. If INVERTEDP is true, merges the \"inverse\" of -SET2 into SET1 instead." +(defun create-charset-from-test-function (test-function start end) + "Creates and returns a charset representing all characters with +character codes between START and END which satisfy TEST-FUNCTION." (declare #.*standard-optimize-settings*) - ;; we only consider values with character codes below - ;; *REGEX-CHAR-CODE-LIMIT* - (loop for code of-type fixnum from 0 below *regex-char-code-limit* + (loop with charset = (make-charset) + for code from start below end for char = (code-char code) - when (and char (if invertedp - (not (in-charset-p char set2)) - (in-charset-p char set2))) - do (add-to-charset char set1)) - set1) - + when (and char (funcall test-function char)) + do (add-to-charset char charset) + finally (return charset))) diff --git a/chartest.lisp b/chartest.lisp new file mode 100644 index 0000000..9455520 --- /dev/null +++ b/chartest.lisp @@ -0,0 +1,98 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/chartest.lisp,v 1.3 2008/07/23 00:47:58 edi Exp $ + +;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-ppcre) + +(defun create-hash-table-from-test-function (test-function start end) + "Creates and returns a hash table representing all characters with +character codes between START and END which satisfy TEST-FUNCTION." + (declare #.*standard-optimize-settings*) + (loop with hash-table = (make-hash-table) + for code from start below end + for char = (code-char code) + when (and char (funcall test-function char)) + do (setf (gethash char hash-table) t) + finally (return hash-table))) + +(defun create-optimized-test-function (test-function &key + (start 0) + (end *regex-char-code-limit*) + (kind *optimize-char-classes*)) + "Given a unary test function which is applicable to characters +returns a function which yields the same boolean results for all +characters with character codes from START to \(excluding) END. If +KIND is NIL, TEST-FUNCTION will simply be returned. Otherwise, KIND +should be one of: + +* :HASH-TABLE - builds a hash table representing all characters which + satisfy the test and returns a closure which checks if + a character is in that hash table + +* :CHARSET - instead of a hash table uses a \"charset\" which is a + data structure using non-linear hashing and optimized to + represent \(sparse) sets of characters in a fast and + space-efficient way \(contributed by Nikodemus Siivola) + +* :CHARMAP - instead of a hash table uses a bit vector to represent + the set of characters + +You can also use :HASH-TABLE* or :CHARSET* which are like :HASH-TABLE +and :CHARSET but use the complement of the set if the set contains +more than half of all characters between START and END. This saves +space but needs an additional pass across all characters to create the +data structure. There is no corresponding :CHARMAP* kind as the bit +vectors are already created to cover the smallest possible interval +which contains either the set or its complement." + (declare #.*standard-optimize-settings*) + (ecase kind + ((nil) test-function) + (:charmap + (let ((charmap (create-charmap-from-test-function test-function start end))) + (lambda (char) + (in-charmap-p char charmap)))) + ((:charset :charset*) + (let ((charset (create-charset-from-test-function test-function start end))) + (cond ((or (eq kind :charset) + (<= (charset-count charset) (ceiling (- end start) 2))) + (lambda (char) + (in-charset-p char charset))) + (t (setq charset (create-charset-from-test-function (complement* test-function) + start end)) + (lambda (char) + (not (in-charset-p char charset))))))) + ((:hash-table :hash-table*) + (let ((hash-table (create-hash-table-from-test-function test-function start end))) + (cond ((or (eq kind :charset) + (<= (hash-table-count hash-table) (ceiling (- end start) 2))) + (lambda (char) + (gethash char hash-table))) + (t (setq hash-table (create-hash-table-from-test-function (complement* test-function) + start end)) + (lambda (char) + (not (gethash char hash-table))))))))) diff --git a/cl-ppcre-unicode.asd b/cl-ppcre-unicode.asd new file mode 100644 index 0000000..ff9d898 --- /dev/null +++ b/cl-ppcre-unicode.asd @@ -0,0 +1,58 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-unicode.asd,v 1.14 2008/07/22 14:19:44 edi Exp $ + +;;; This ASDF system definition was kindly provided by Marco Baringer. + +;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-user) + +(defpackage :cl-ppcre-unicode-asd + (:use :cl :asdf)) + +(in-package :cl-ppcre-unicode-asd) + +(defsystem :cl-ppcre-unicode + :components ((:module "cl-ppcre-unicode" + :serial t + :components ((:file "packages") + (:file "resolver")))) + :depends-on (:cl-ppcre :cl-unicode)) + +(defsystem :cl-ppcre-unicode-test + :depends-on (:cl-ppcre-unicode :cl-ppcre-test) + :components ((:module "test" + :serial t + :components ((:file "unicode-tests"))))) + +(defmethod perform ((o test-op) (c (eql (find-system :cl-ppcre-unicode)))) + ;; we must load CL-PPCRE explicitly so that the CL-PPCRE-TEST system + ;; will be found + (operate 'load-op :cl-ppcre) + (operate 'load-op :cl-ppcre-unicode-test) + (funcall (intern (symbol-name :run-all-tests) (find-package :cl-ppcre-test)) + :more-tests (intern (symbol-name :unicode-test) (find-package :cl-ppcre-test)))) \ No newline at end of file diff --git a/cl-ppcre-test.system b/cl-ppcre-unicode/packages.lisp similarity index 71% rename from cl-ppcre-test.system rename to cl-ppcre-unicode/packages.lisp index f521ff5..22b797c 100644 --- a/cl-ppcre-test.system +++ b/cl-ppcre-unicode/packages.lisp @@ -1,7 +1,7 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-test.system,v 1.11 2007/01/01 23:43:10 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-unicode/packages.lisp,v 1.2 2008/07/22 13:58:13 edi Exp $ -;;; Copyright (c) 2002-2007, Dr. Edmund Weitz. All rights reserved. +;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. ;;; Redistribution and use in source and binary forms, with or without ;;; modification, are permitted provided that the following conditions @@ -27,14 +27,12 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-user) +(in-package :cl-user) -(defparameter *cl-ppcre-test-base-directory* - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - -(mk:defsystem #:cl-ppcre-test - :source-pathname *cl-ppcre-test-base-directory* - :source-extension "lisp" - :depends-on (#:cl-ppcre) - :components ((:file "ppcre-tests"))) +(defpackage :cl-ppcre-unicode + #+:genera + (:shadowing-import-from :common-lisp :lambda :string) + (:use #-:genera :cl #+:genera :future-common-lisp + :cl-ppcre :cl-unicode) + (:import-from :cl-ppcre :signal-syntax-error) + (:export :unicode-property-resolver)) diff --git a/cl-ppcre-unicode/resolver.lisp b/cl-ppcre-unicode/resolver.lisp new file mode 100644 index 0000000..5c73628 --- /dev/null +++ b/cl-ppcre-unicode/resolver.lisp @@ -0,0 +1,61 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-unicode/resolver.lisp,v 1.5 2008/07/23 02:14:08 edi Exp $ + +;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-ppcre-unicode) + +(defun unicode-property-resolver (property-name) + "A property resolver which understands Unicode properties using +CL-UNICODE's PROPERTY-TEST function. This resolver is automatically +installed in *PROPERTY-RESOLVER* when the CL-PPCRE-UNICODE system is +loaded." + (or (property-test property-name :errorp nil) + (signal-syntax-error "There is no property named ~S." property-name))) + +(setq *property-resolver* 'unicode-property-resolver) + +(pushnew :cl-ppcre-unicode *features*) + +;; stuff for Nikodemus Siivola's HYPERDOC +;; see +;; and +;; also used by LW-ADD-ONS + +(defvar *hyperdoc-base-uri* "http://weitz.de/cl-ppcre/") + +(let ((exported-symbols-alist + (loop for symbol being the external-symbols of :cl-ppcre-unicode + collect (cons symbol + (concatenate 'string + "#" + (string-downcase symbol)))))) + (defun hyperdoc-lookup (symbol type) + (declare (ignore type)) + (cdr (assoc symbol + exported-symbols-alist + :test #'eq)))) diff --git a/cl-ppcre.asd b/cl-ppcre.asd index 40dd700..0b4cb17 100644 --- a/cl-ppcre.asd +++ b/cl-ppcre.asd @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.asd,v 1.30 2008/07/03 10:06:15 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.asd,v 1.45 2008/07/23 02:14:06 edi Exp $ ;;; This ASDF system definition was kindly provided by Marco Baringer. @@ -29,14 +29,23 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(asdf:defsystem :cl-ppcre - :version "1.4.1" +(in-package :cl-user) + +(defpackage :cl-ppcre-asd + (:use :cl :asdf)) + +(in-package :cl-ppcre-asd) + +(defsystem :cl-ppcre + :version "2.0.0" :serial t :components ((:file "packages") (:file "specials") - (:file "charset") (:file "util") (:file "errors") + (:file "charset") + (:file "charmap") + (:file "chartest") #-:use-acl-regexp2-engine (:file "lexer") #-:use-acl-regexp2-engine @@ -44,6 +53,8 @@ #-:use-acl-regexp2-engine (:file "regex-class") #-:use-acl-regexp2-engine + (:file "regex-class-util") + #-:use-acl-regexp2-engine (:file "convert") #-:use-acl-regexp2-engine (:file "optimize") @@ -54,3 +65,15 @@ #-:use-acl-regexp2-engine (:file "scanner") (:file "api"))) + +(defsystem :cl-ppcre-test + :depends-on (:cl-ppcre :flexi-streams) + :components ((:module "test" + :serial t + :components ((:file "packages") + (:file "tests") + (:file "perl-tests"))))) + +(defmethod perform ((o test-op) (c (eql (find-system :cl-ppcre)))) + (operate 'load-op :cl-ppcre-test) + (funcall (intern (symbol-name :run-all-tests) (find-package :cl-ppcre-test)))) diff --git a/cl-ppcre.system b/cl-ppcre.system deleted file mode 100644 index 5f01431..0000000 --- a/cl-ppcre.system +++ /dev/null @@ -1,59 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.system,v 1.13 2007/01/01 23:43:10 edi Exp $ - -;;; Copyright (c) 2002-2007, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-user) - -(defparameter *cl-ppcre-base-directory* - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - -(mk:defsystem #:cl-ppcre - :source-pathname *cl-ppcre-base-directory* - :source-extension "lisp" - :components ((:file "packages") - (:file "specials" :depends-on ("packages")) - (:file "util" :depends-on ("packages")) - (:file "errors" :depends-on ("util")) - #-:use-acl-regexp2-engine - (:file "lexer" :depends-on ("errors" "specials")) - #-:use-acl-regexp2-engine - (:file "parser" :depends-on ("lexer")) - #-:use-acl-regexp2-engine - (:file "regex-class" :depends-on ("parser")) - #-:use-acl-regexp2-engine - (:file "convert" :depends-on ("regex-class")) - #-:use-acl-regexp2-engine - (:file "optimize" :depends-on ("convert")) - #-:use-acl-regexp2-engine - (:file "closures" :depends-on ("optimize" "specials")) - #-:use-acl-regexp2-engine - (:file "repetition-closures" :depends-on ("closures")) - #-:use-acl-regexp2-engine - (:file "scanner" :depends-on ("repetition-closures")) - (:file "api" :depends-on ("scanner")))) diff --git a/closures.lisp b/closures.lisp index 7606197..73d8976 100644 --- a/closures.lisp +++ b/closures.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/closures.lisp,v 1.36 2008/07/03 07:44:06 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/closures.lisp,v 1.44 2008/07/22 22:38:05 edi Exp $ ;;; Here we create the closures which together build the final ;;; scanner. @@ -30,16 +30,15 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (declaim (inline *string*= *string*-equal)) - (defun *string*= (string2 start1 end1 start2 end2) "Like STRING=, i.e. compares the special string *STRING* from START1 to END1 with STRING2 from START2 to END2. Note that there's no boundary check - this has to be implemented by the caller." (declare #.*standard-optimize-settings*) - (declare (type fixnum start1 end1 start2 end2)) + (declare (fixnum start1 end1 start2 end2)) (loop for string1-idx of-type fixnum from start1 below end1 for string2-idx of-type fixnum from start2 below end2 always (char= (schar *string* string1-idx) @@ -50,7 +49,7 @@ boundary check - this has to be implemented by the caller." START1 to END1 with STRING2 from START2 to END2. Note that there's no boundary check - this has to be implemented by the caller." (declare #.*standard-optimize-settings*) - (declare (type fixnum start1 end1 start2 end2)) + (declare (fixnum start1 end1 start2 end2)) (loop for string1-idx of-type fixnum from start1 below end1 for string2-idx of-type fixnum from start2 below end2 always (char-equal (schar *string* string1-idx) @@ -81,7 +80,7 @@ such that the call to NEXT-FN after the match would succeed.")) ;; now create a closure which checks if one of the closures ;; created above can succeed (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (loop for matcher in all-matchers thereis (funcall (the function matcher) start-pos))))) @@ -90,13 +89,13 @@ such that the call to NEXT-FN after the match would succeed.")) ;; the position of this REGISTER within the whole regex; we start to ;; count at 0 (let ((num (num register))) - (declare (type fixnum num)) + (declare (fixnum num)) ;; STORE-END-OF-REG is a thin wrapper around NEXT-FN which will ;; update the corresponding values of *REGS-START* and *REGS-END* ;; after the inner matcher has succeeded (flet ((store-end-of-reg (start-pos) - (declare (type fixnum start-pos) - (type function next-fn)) + (declare (fixnum start-pos) + (function next-fn)) (setf (svref *reg-starts* num) (svref *regs-maybe-start* num) (svref *reg-ends* num) start-pos) (funcall next-fn start-pos))) @@ -104,10 +103,10 @@ such that the call to NEXT-FN after the match would succeed.")) ;; wrapped by this REGISTER (let ((inner-matcher (create-matcher-aux (regex register) #'store-end-of-reg))) - (declare (type function inner-matcher)) + (declare (function inner-matcher)) ;; here comes the actual closure for REGISTER (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) ;; remember the old values of *REGS-START* and friends in ;; case we cannot match (let ((old-*reg-starts* (svref *reg-starts* num)) @@ -129,7 +128,7 @@ such that the call to NEXT-FN after the match would succeed.")) ;; create a closure which just checks for the inner regex and ;; doesn't care about NEXT-FN (let ((test-matcher (create-matcher-aux (regex lookahead) #'identity))) - (declare (type function next-fn test-matcher)) + (declare (function next-fn test-matcher)) (if (positivep lookahead) ;; positive look-ahead: check success of inner regex, then call ;; NEXT-FN @@ -148,152 +147,52 @@ such that the call to NEXT-FN after the match would succeed.")) ;; create a closure which just checks for the inner regex and ;; doesn't care about NEXT-FN (test-matcher (create-matcher-aux (regex lookbehind) #'identity))) - (declare (type function next-fn test-matcher) - (type fixnum len)) + (declare (function next-fn test-matcher) + (fixnum len)) (if (positivep lookbehind) ;; positive look-behind: check success of inner regex (if we're ;; far enough from the start of *STRING*), then call NEXT-FN (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (>= (- start-pos (or *real-start-pos* *start-pos*)) len) (funcall test-matcher (- start-pos len)) (funcall next-fn start-pos))) ;; negative look-behind: check failure of inner regex (if we're ;; far enough from the start of *STRING*), then call NEXT-FN (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (or (< (- start-pos (or *real-start-pos* *start-pos*)) len) (not (funcall test-matcher (- start-pos len)))) (funcall next-fn start-pos)))))) (defmacro insert-char-class-tester ((char-class chr-expr) &body body) - "Utility macro to replace each occurence of '(CHAR-CLASS-TEST) + "Utility macro to replace each occurence of '\(CHAR-CLASS-TEST) within BODY with the correct test (corresponding to CHAR-CLASS) against CHR-EXPR." - (with-unique-names (%char-class) - ;; the actual substitution is done here: replace - ;; '(CHAR-CLASS-TEST) with NEW - (flet ((substitute-char-class-tester (new) + (with-rebinding (char-class) + (with-unique-names (test-function) + (flet ((substitute-char-class-tester (new) (subst new '(char-class-test) body :test #'equalp))) - `(let* ((,%char-class ,char-class) - (set (charset ,%char-class)) - (count (if set - (charset-count set) - most-positive-fixnum)) - ;; collect a list of "all" characters in the set if - ;; there aren't more than two - (all-chars (if (<= count 2) - (all-characters set) - nil)) - downcasedp) - (declare (type fixnum count)) - ;; check if we can partition the charset into three ranges (or - ;; less) - (multiple-value-bind (min1 max1 min2 max2 min3 max3) - (create-ranges-from-set set) - ;; if that didn't work and CHAR-CLASS is case-insensitive we - ;; try it again with every character downcased - (when (and (not min1) - (case-insensitive-p ,%char-class)) - (multiple-value-setq (min1 max1 min2 max2 min3 max3) - (create-ranges-from-set set :downcasep t)) - (setq downcasedp t)) - (cond ((= count 1) - ;; charset contains exactly one character so we just - ;; check for this single character; (note that this - ;; actually can't happen because this case is - ;; optimized away in CONVERT already...) - (let ((chr1 (first all-chars))) - ,@(substitute-char-class-tester - `(char= ,chr-expr chr1)))) - ((= count 2) - ;; set contains exactly two characters - (let ((chr1 (first all-chars)) - (chr2 (second all-chars))) - ,@(substitute-char-class-tester - `(let ((chr ,chr-expr)) - (or (char= chr chr1) - (char= chr chr2)))))) - ((word-char-class-p ,%char-class) - ;; special-case: set is \w, \W, [\w], [\W] or - ;; something equivalent - ,@(substitute-char-class-tester - `(word-char-p ,chr-expr))) - ((= count *regex-char-code-limit*) - ;; according to the ANSI standard we might have all - ;; possible characters in the set even if it doesn't - ;; contain CHAR-CODE-LIMIT characters but this - ;; doesn't seem to be the case for current - ;; implementations (also note that this optimization - ;; implies that you must not have characters with - ;; character codes beyond *REGEX-CHAR-CODE-LIMIT* in - ;; your regexes if you've changed this limit); we - ;; expect the compiler to optimize this T "test" - ;; away - ,@(substitute-char-class-tester t)) - ((and downcasedp min1 min2 min3) - ;; three different ranges, downcased - ,@(substitute-char-class-tester - `(let ((chr ,chr-expr)) - (or (char-not-greaterp min1 chr max1) - (char-not-greaterp min2 chr max2) - (char-not-greaterp min3 chr max3))))) - ((and downcasedp min1 min2) - ;; two ranges, downcased - ,@(substitute-char-class-tester - `(let ((chr ,chr-expr)) - (or (char-not-greaterp min1 chr max1) - (char-not-greaterp min2 chr max2))))) - ((and downcasedp min1) - ;; one downcased range - ,@(substitute-char-class-tester - `(char-not-greaterp min1 ,chr-expr max1))) - ((and min1 min2 min3) - ;; three ranges - ,@(substitute-char-class-tester - `(let ((chr ,chr-expr)) - (or (char<= min1 chr max1) - (char<= min2 chr max2) - (char<= min3 chr max3))))) - ((and min1 min2) - ;; two ranges - ,@(substitute-char-class-tester - `(let ((chr ,chr-expr)) - (or (char<= min1 chr max1) - (char<= min2 chr max2))))) - (min1 - ;; one range - ,@(substitute-char-class-tester - `(char<= min1 ,chr-expr max1))) - (t - ;; the general case; note that most of the above - ;; "optimizations" are based on early (2002) - ;; experiences and benchmarks with CMUCL - ,@(substitute-char-class-tester - `(in-charset-p ,chr-expr set))))))))) + `(let ((,test-function (test-function ,char-class))) + ,@(substitute-char-class-tester + `(funcall ,test-function ,chr-expr))))))) (defmethod create-matcher-aux ((char-class char-class) next-fn) (declare #.*standard-optimize-settings*) - (declare (type function next-fn)) + (declare (function next-fn)) ;; insert a test against the current character within *STRING* (insert-char-class-tester (char-class (schar *string* start-pos)) - (if (invertedp char-class) - (lambda (start-pos) - (declare (type fixnum start-pos)) - (and (< start-pos *end-pos*) - (not (char-class-test)) - (funcall next-fn (1+ start-pos)))) - (lambda (start-pos) - (declare (type fixnum start-pos)) - (and (< start-pos *end-pos*) - (char-class-test) - (funcall next-fn (1+ start-pos))))))) + (lambda (start-pos) + (declare (fixnum start-pos)) + (and (< start-pos *end-pos*) + (char-class-test) + (funcall next-fn (1+ start-pos)))))) (defmethod create-matcher-aux ((str str) next-fn) (declare #.*standard-optimize-settings*) - (declare (type fixnum *end-string-pos*) - (type function next-fn) + (declare (fixnum *end-string-pos*) + (function next-fn) ;; this special value is set by CREATE-SCANNER when the ;; closures are built (special end-string)) @@ -307,15 +206,15 @@ against CHR-EXPR." (end-string-len (if end-string (length end-string) nil))) - (declare (type fixnum len)) + (declare (fixnum len)) (cond ((and start-of-end-string-p case-insensitive-p) ;; closure for the first STR which belongs to the constant ;; string at the end of the regular expression; ;; case-insensitive version (lambda (start-pos) - (declare (type fixnum start-pos end-string-len)) + (declare (fixnum start-pos end-string-len)) (let ((test-end-pos (+ start-pos end-string-len))) - (declare (type fixnum test-end-pos)) + (declare (fixnum test-end-pos)) ;; either we're at *END-STRING-POS* (which means that ;; it has already been confirmed that end-string ;; starts here) or we really have to test @@ -329,9 +228,9 @@ against CHR-EXPR." ;; string at the end of the regular expression; ;; case-sensitive version (lambda (start-pos) - (declare (type fixnum start-pos end-string-len)) + (declare (fixnum start-pos end-string-len)) (let ((test-end-pos (+ start-pos end-string-len))) - (declare (type fixnum test-end-pos)) + (declare (fixnum test-end-pos)) ;; either we're at *END-STRING-POS* (which means that ;; it has already been confirmed that end-string ;; starts here) or we really have to test @@ -344,13 +243,13 @@ against CHR-EXPR." ;; a STR which can be skipped because some other function ;; has already confirmed that it matches (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (funcall next-fn (+ start-pos len)))) ((and (= len 1) case-insensitive-p) ;; STR represent exactly one character; case-insensitive ;; version (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (< start-pos *end-pos*) (char-equal (schar *string* start-pos) chr) (funcall next-fn (1+ start-pos))))) @@ -358,35 +257,34 @@ against CHR-EXPR." ;; STR represent exactly one character; case-sensitive ;; version (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (< start-pos *end-pos*) (char= (schar *string* start-pos) chr) (funcall next-fn (1+ start-pos))))) (case-insensitive-p ;; general case, case-insensitive version (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((next-pos (+ start-pos len))) - (declare (type fixnum next-pos)) + (declare (fixnum next-pos)) (and (<= next-pos *end-pos*) (*string*-equal str start-pos next-pos 0 len) (funcall next-fn next-pos))))) (t ;; general case, case-sensitive version (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((next-pos (+ start-pos len))) - (declare (type fixnum next-pos)) + (declare (fixnum next-pos)) (and (<= next-pos *end-pos*) (*string*= str start-pos next-pos 0 len) (funcall next-fn next-pos)))))))) (declaim (inline word-boundary-p)) - (defun word-boundary-p (start-pos) "Check whether START-POS is a word-boundary within *STRING*." (declare #.*standard-optimize-settings*) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((1-start-pos (1- start-pos)) (*start-pos* (or *real-start-pos* *start-pos*))) ;; either the character before START-POS is a word-constituent and @@ -407,7 +305,7 @@ against CHR-EXPR." (defmethod create-matcher-aux ((word-boundary word-boundary) next-fn) (declare #.*standard-optimize-settings*) - (declare (type function next-fn)) + (declare (function next-fn)) (if (negatedp word-boundary) (lambda (start-pos) (and (not (word-boundary-p start-pos)) @@ -418,25 +316,25 @@ against CHR-EXPR." (defmethod create-matcher-aux ((everything everything) next-fn) (declare #.*standard-optimize-settings*) - (declare (type function next-fn)) + (declare (function next-fn)) (if (single-line-p everything) ;; closure for single-line-mode: we really match everything, so we ;; just advance the index into *STRING* by one and carry on (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (< start-pos *end-pos*) (funcall next-fn (1+ start-pos)))) ;; not single-line-mode, so we have to make sure we don't match ;; #\Newline (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (< start-pos *end-pos*) (char/= (schar *string* start-pos) #\Newline) (funcall next-fn (1+ start-pos)))))) (defmethod create-matcher-aux ((anchor anchor) next-fn) (declare #.*standard-optimize-settings*) - (declare (type function next-fn)) + (declare (function next-fn)) (let ((startp (startp anchor)) (multi-line-p (multi-line-p anchor))) (cond ((no-newline-p anchor) @@ -444,14 +342,14 @@ against CHR-EXPR." ;; we just have to check whether START-POS equals ;; *END-POS* (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (= start-pos *end-pos*) (funcall next-fn start-pos)))) ((and startp multi-line-p) ;; a start-anchor in multi-line-mode: check if we're at ;; *START-POS* or if the last character was #\Newline (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((*start-pos* (or *real-start-pos* *start-pos*))) (and (or (= start-pos *start-pos*) (and (<= start-pos *end-pos*) @@ -463,7 +361,7 @@ against CHR-EXPR." ;; a start-anchor which is not in multi-line-mode, so just ;; check whether we're at *START-POS* (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (= start-pos (or *real-start-pos* *start-pos*)) (funcall next-fn start-pos)))) (multi-line-p @@ -471,7 +369,7 @@ against CHR-EXPR." ;; *END-POS* or if the character we're looking at is ;; #\Newline (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (or (= start-pos *end-pos*) (and (< start-pos *end-pos*) (char= #\Newline @@ -482,7 +380,7 @@ against CHR-EXPR." ;; check if we're at *END-POS* or if we're looking at ;; #\Newline and there's nothing behind it (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (or (= start-pos *end-pos*) (and (= start-pos (1- *end-pos*)) (char= #\Newline @@ -491,14 +389,14 @@ against CHR-EXPR." (defmethod create-matcher-aux ((back-reference back-reference) next-fn) (declare #.*standard-optimize-settings*) - (declare (type function next-fn)) + (declare (function next-fn)) ;; the position of the corresponding REGISTER within the whole ;; regex; we start to count at 0 (let ((num (num back-reference))) (if (case-insensitive-p back-reference) ;; the case-insensitive version (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((reg-start (svref *reg-starts* num)) (reg-end (svref *reg-ends* num))) ;; only bother to check if the corresponding REGISTER as @@ -506,7 +404,7 @@ against CHR-EXPR." (and reg-start (let ((next-pos (+ start-pos (- (the fixnum reg-end) (the fixnum reg-start))))) - (declare (type fixnum next-pos)) + (declare (fixnum next-pos)) (and (<= next-pos *end-pos*) (*string*-equal *string* start-pos next-pos @@ -514,7 +412,7 @@ against CHR-EXPR." (funcall next-fn next-pos)))))) ;; the case-sensitive version (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((reg-start (svref *reg-starts* num)) (reg-end (svref *reg-ends* num))) ;; only bother to check if the corresponding REGISTER as @@ -522,7 +420,7 @@ against CHR-EXPR." (and reg-start (let ((next-pos (+ start-pos (- (the fixnum reg-end) (the fixnum reg-start))))) - (declare (type fixnum next-pos)) + (declare (fixnum next-pos)) (and (<= next-pos *end-pos*) (*string*= *string* start-pos next-pos @@ -534,17 +432,17 @@ against CHR-EXPR." (let* ((test (test branch)) (then-matcher (create-matcher-aux (then-regex branch) next-fn)) (else-matcher (create-matcher-aux (else-regex branch) next-fn))) - (declare (type function then-matcher else-matcher)) + (declare (function then-matcher else-matcher)) (cond ((numberp test) (lambda (start-pos) - (declare (type fixnum test)) + (declare (fixnum test)) (if (and (< test (length *reg-starts*)) (svref *reg-starts* test)) (funcall then-matcher start-pos) (funcall else-matcher start-pos)))) (t (let ((test-matcher (create-matcher-aux test #'identity))) - (declare (type function test-matcher)) + (declare (function test-matcher)) (lambda (start-pos) (if (funcall test-matcher start-pos) (funcall then-matcher start-pos) @@ -553,7 +451,7 @@ against CHR-EXPR." (defmethod create-matcher-aux ((standalone standalone) next-fn) (declare #.*standard-optimize-settings*) (let ((inner-matcher (create-matcher-aux (regex standalone) #'identity))) - (declare (type function next-fn inner-matcher)) + (declare (function next-fn inner-matcher)) (lambda (start-pos) (let ((next-pos (funcall inner-matcher start-pos))) (and next-pos diff --git a/convert.lisp b/convert.lisp index bf41f13..e64d318 100644 --- a/convert.lisp +++ b/convert.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/convert.lisp,v 1.29 2008/07/03 07:44:06 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/convert.lisp,v 1.54 2008/07/23 02:14:06 edi Exp $ ;;; Here the parse tree is converted into its internal representation ;;; using REGEX objects. At the same time some optimizations are @@ -31,7 +31,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) ;;; The flags that represent the "ism" modifiers are always kept ;;; together in a three-element list. We use the following macros to @@ -50,10 +50,10 @@ `(third ,flags)) (defun set-flag (token) - (declare #.*standard-optimize-settings*) - (declare (special flags)) "Reads a flag token and sets or unsets the corresponding entry in the special FLAGS list." + (declare #.*standard-optimize-settings*) + (declare (special flags)) (case token ((:case-insensitive-p) (setf (case-insensitive-mode-p flags) t)) @@ -68,70 +68,107 @@ the special FLAGS list." ((:not-single-line-mode-p) (setf (single-line-mode-p flags) nil)) (otherwise - (signal-ppcre-syntax-error "Unknown flag token ~A" token)))) + (signal-syntax-error "Unknown flag token ~A." token)))) -(defun add-range-to-set (set from to) +(defgeneric resolve-property (property) + (:documentation "Resolves PROPERTY to a unary character test +function. PROPERTY can either be a function designator or it can be a +string which is resolved using *PROPERTY-RESOLVER*.") + (:method ((property-name string)) + (funcall *property-resolver* property-name)) + (:method ((function-name symbol)) + function-name) + (:method ((test-function function)) + test-function)) + +(defun convert-char-class-to-test-function (list invertedp case-insensitive-p) + "Combines all items in LIST into test function and returns a +logical-OR combination of these functions. Items can be single +characters, character ranges like \(:RANGE #\\A #\\E), or special +character classes like :DIGIT-CLASS. Does the right thing with +respect to case-\(in)sensitivity as specified by the special variable +FLAGS." (declare #.*standard-optimize-settings*) (declare (special flags)) - "Adds all characters from character FROM to character TO -\(inclusive) to the charset SET. Does the right thing with respect to -case-\(in)sensitivity as specified by the special variable FLAGS." - (let ((from-code (char-code from)) - (to-code (char-code to))) - (when (> from-code to-code) - (signal-ppcre-syntax-error "Invalid range from ~A to ~A in char-class" - from to)) - (cond ((case-insensitive-mode-p flags) - (loop for code from from-code to to-code - for char = (code-char code) - do (add-to-charset (char-upcase char) set) - (add-to-charset (char-downcase char) set))) - (t - (loop for code from from-code to to-code - do (add-to-charset (code-char code) set)))) - set)) - -(defun convert-char-class-to-charset (list) - (declare #.*standard-optimize-settings*) - "Combines all items in LIST into one charset and returns it. Items -can be single characters, character ranges like \(:RANGE #\\A #\\E), -or special character classes like :DIGIT-CLASS. Does the right thing -with respect to case-\(in)sensitivity as specified by the special -variable FLAGS." - (loop with set = (make-charset) - for item in list - if (characterp item) - ;; treat a single character C like a range (:RANGE C C) - do (add-range-to-set set item item) - else if (symbolp item) - ;; special character classes - do (setq set - (case item - ((:digit-class) - (merge-set set +digit-set+)) - ((:non-digit-class) - (merge-set set +digit-set+ t)) - ((:whitespace-char-class) - (merge-set set +whitespace-char-set+)) - ((:non-whitespace-char-class) - (merge-set set +whitespace-char-set+ t)) - ((:word-char-class) - (merge-set set +word-char-set+)) - ((:non-word-char-class) - (merge-set set +word-char-set+ t)) - (otherwise - (signal-ppcre-syntax-error - "Unknown symbol ~A in character class" - item)))) - else if (and (consp item) - (eq (car item) :range)) - ;; proper ranges - do (add-range-to-set set - (second item) - (third item)) - else do (signal-ppcre-syntax-error "Unknown item ~A in char-class list" - item) - finally (return set))) + (let ((test-functions + (loop for item in list + collect (cond ((characterp item) + ;; rebind so closure captures the right one + (let ((this-char item)) + (lambda (char) + (declare (character char this-char)) + (char= char this-char)))) + ((symbolp item) + (case item + ((:digit-class) #'digit-char-p) + ((:non-digit-class) (complement* #'digit-char-p)) + ((:whitespace-char-class) #'whitespacep) + ((:non-whitespace-char-class) (complement* #'whitespacep)) + ((:word-char-class) #'word-char-p) + ((:non-word-char-class) (complement* #'word-char-p)) + (otherwise + (signal-syntax-error "Unknown symbol ~A in character class." item)))) + ((and (consp item) + (eq (first item) :property)) + (resolve-property (second item))) + ((and (consp item) + (eq (first item) :inverted-property)) + (complement* (resolve-property (second item)))) + ((and (consp item) + (eq (first item) :range)) + (let ((from (second item)) + (to (third item))) + (when (char> from to) + (signal-syntax-error "Invalid range from ~S to ~S in char-class." from to)) + (lambda (char) + (declare (character char from to)) + (char<= from char to)))) + (t (signal-syntax-error "Unknown item ~A in char-class list." item)))))) + (unless test-functions + (signal-syntax-error "Empty character class.")) + (cond ((cdr test-functions) + (cond ((and invertedp case-insensitive-p) + (lambda (char) + (declare (character char)) + (loop with both-case-p = (both-case-p char) + with char-down = (if both-case-p (char-downcase char) char) + with char-up = (if both-case-p (char-upcase char) nil) + for test-function in test-functions + never (or (funcall test-function char-down) + (and char-up (funcall test-function char-up)))))) + (case-insensitive-p + (lambda (char) + (declare (character char)) + (loop with both-case-p = (both-case-p char) + with char-down = (if both-case-p (char-downcase char) char) + with char-up = (if both-case-p (char-upcase char) nil) + for test-function in test-functions + thereis (or (funcall test-function char-down) + (and char-up (funcall test-function char-up)))))) + (invertedp + (lambda (char) + (loop for test-function in test-functions + never (funcall test-function char)))) + (t + (lambda (char) + (loop for test-function in test-functions + thereis (funcall test-function char)))))) + ;; there's only one test-function + (t (let ((test-function (first test-functions))) + (cond ((and invertedp case-insensitive-p) + (lambda (char) + (declare (character char)) + (not (or (funcall test-function (char-downcase char)) + (and (both-case-p char) + (funcall test-function (char-upcase char))))))) + (case-insensitive-p + (lambda (char) + (declare (character char)) + (or (funcall test-function (char-downcase char)) + (and (both-case-p char) + (funcall test-function (char-upcase char)))))) + (invertedp (complement* test-function)) + (t test-function))))))) (defun maybe-split-repetition (regex greedyp @@ -140,14 +177,14 @@ variable FLAGS." min-len length reg-seen) - (declare #.*standard-optimize-settings*) - (declare (type fixnum minimum) - (type (or fixnum null) maximum)) "Splits a REPETITION object into a constant and a varying part if applicable, i.e. something like a{3,} -> a{3}a* The arguments to this function correspond to the REPETITION slots of the same name." + (declare #.*standard-optimize-settings*) + (declare (fixnum minimum) + ((or fixnum null) maximum)) ;; note the usage of COPY-REGEX here; we can't use the same REGEX ;; object in both REPETITIONS because they will have different ;; offsets @@ -209,12 +246,12 @@ the same name." ;; regex at the start (perhaps modulo #\Newline). (defun maybe-accumulate (str) - (declare #.*standard-optimize-settings*) - (declare (special accumulate-start-p starts-with)) - (declare (ftype (function (t) fixnum) len)) "Accumulate STR into the special variable STARTS-WITH if ACCUMULATE-START-P (also special) is true and STARTS-WITH is either NIL or a STR object of the same case mode. Always returns NIL." + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p starts-with)) + (declare (ftype (function (t) fixnum) len)) (when accumulate-start-p (etypecase starts-with (str @@ -263,12 +300,11 @@ NIL or a STR object of the same case mode. Always returns NIL." (setq accumulate-start-p nil)))) nil) +(declaim (inline convert-aux)) (defun convert-aux (parse-tree) - (declare #.*standard-optimize-settings*) - (declare (special flags reg-num reg-names accumulate-start-p starts-with max-back-ref)) - "Converts the parse tree PARSE-TREE into a REGEX object and returns it. + "Converts the parse tree PARSE-TREE into a REGEX object and returns +it. Will also -Will also - split and optimize repetitions, - accumulate strings or EVERYTHING objects into the special variable STARTS-WITH, @@ -279,502 +315,538 @@ Will also - maintain and adher to the currently applicable modifiers in the special variable FLAGS, and - maybe even wash your car..." - (cond ((consp parse-tree) - (case (first parse-tree) - ;; (:SEQUENCE {}*) - ((:sequence) - (cond ((cddr parse-tree) - ;; this is essentially like - ;; (MAPCAR 'CONVERT-AUX (REST PARSE-TREE)) - ;; but we don't cons a new list - (loop for parse-tree-rest on (rest parse-tree) - while parse-tree-rest - do (setf (car parse-tree-rest) - (convert-aux (car parse-tree-rest)))) - (make-instance 'seq - :elements (rest parse-tree))) - (t (convert-aux (second parse-tree))))) - ;; (:GROUP {}*) - ;; this is a syntactical construct equivalent to :SEQUENCE - ;; intended to keep the effect of modifiers local - ((:group) - ;; make a local copy of FLAGS and shadow the global - ;; value while we descend into the enclosed regexes - (let ((flags (copy-list flags))) - (declare (special flags)) - (cond ((cddr parse-tree) - (loop for parse-tree-rest on (rest parse-tree) - while parse-tree-rest - do (setf (car parse-tree-rest) - (convert-aux (car parse-tree-rest)))) - (make-instance 'seq - :elements (rest parse-tree))) - (t (convert-aux (second parse-tree)))))) - ;; (:ALTERNATION {}*) - ((:alternation) - ;; we must stop accumulating objects into STARTS-WITH - ;; once we reach an alternation - (setq accumulate-start-p nil) - (loop for parse-tree-rest on (rest parse-tree) - while parse-tree-rest - do (setf (car parse-tree-rest) - (convert-aux (car parse-tree-rest)))) - (make-instance 'alternation - :choices (rest parse-tree))) - ;; (:BRANCH ) - ;; must be look-ahead, look-behind or number; - ;; if is an alternation it must have one or two - ;; choices - ((:branch) - (setq accumulate-start-p nil) - (let* ((test-candidate (second parse-tree)) - (test (cond ((numberp test-candidate) - (when (zerop (the fixnum test-candidate)) - (signal-ppcre-syntax-error - "Register 0 doesn't exist: ~S" - parse-tree)) - (1- (the fixnum test-candidate))) - (t (convert-aux test-candidate)))) - (alternations (convert-aux (third parse-tree)))) - (when (and (not (numberp test)) - (not (typep test 'lookahead)) - (not (typep test 'lookbehind))) - (signal-ppcre-syntax-error - "Branch test must be look-ahead, look-behind or number: ~S" - parse-tree)) - (typecase alternations - (alternation - (case (length (choices alternations)) - ((0) - (signal-ppcre-syntax-error "No choices in branch: ~S" - parse-tree)) - ((1) - (make-instance 'branch - :test test - :then-regex (first - (choices alternations)))) - ((2) - (make-instance 'branch - :test test - :then-regex (first - (choices alternations)) - :else-regex (second - (choices alternations)))) - (otherwise - (signal-ppcre-syntax-error - "Too much choices in branch: ~S" - parse-tree)))) - (t - (make-instance 'branch - :test test - :then-regex alternations))))) - ;; (:POSITIVE-LOOKAHEAD|:NEGATIVE-LOOKAHEAD ) - ((:positive-lookahead :negative-lookahead) - ;; keep the effect of modifiers local to the enclosed - ;; regex and stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (let ((flags (copy-list flags))) - (declare (special flags)) - (make-instance 'lookahead - :regex (convert-aux (second parse-tree)) - :positivep (eq (first parse-tree) - :positive-lookahead)))) - ;; (:POSITIVE-LOOKBEHIND|:NEGATIVE-LOOKBEHIND ) - ((:positive-lookbehind :negative-lookbehind) - ;; keep the effect of modifiers local to the enclosed - ;; regex and stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (let* ((flags (copy-list flags)) - (regex (convert-aux (second parse-tree))) - (len (regex-length regex))) - (declare (special flags)) - ;; lookbehind assertions must be of fixed length - (unless len - (signal-ppcre-syntax-error - "Variable length look-behind not implemented (yet): ~S" - parse-tree)) - (make-instance 'lookbehind - :regex regex - :positivep (eq (first parse-tree) - :positive-lookbehind) - :len len))) - ;; (:GREEDY-REPETITION|:NON-GREEDY-REPETITION ) - ((:greedy-repetition :non-greedy-repetition) - ;; remember the value of ACCUMULATE-START-P upon entering - (let ((local-accumulate-start-p accumulate-start-p)) - (let ((minimum (second parse-tree)) - (maximum (third parse-tree))) - (declare (type fixnum minimum)) - (declare (type (or null fixnum) maximum)) - (unless (and maximum - (= 1 minimum maximum)) - ;; set ACCUMULATE-START-P to NIL for the rest of - ;; the conversion because we can't continue to - ;; accumulate inside as well as after a proper - ;; repetition - (setq accumulate-start-p nil)) - (let* (reg-seen - (regex (convert-aux (fourth parse-tree))) - (min-len (regex-min-length regex)) - (greedyp (eq (first parse-tree) :greedy-repetition)) - (length (regex-length regex))) - ;; note that this declaration already applies to - ;; the call to CONVERT-AUX above - (declare (special reg-seen)) - (when (and local-accumulate-start-p - (not starts-with) - (zerop minimum) - (not maximum)) - ;; if this repetition is (equivalent to) ".*" - ;; and if we're at the start of the regex we - ;; remember it for ADVANCE-FN (see the SCAN - ;; function) - (setq starts-with (everythingp regex))) - (if (or (not reg-seen) - (not greedyp) - (not length) - (zerop length) - (and maximum (= minimum maximum))) - ;; the repetition doesn't enclose a register, or - ;; it's not greedy, or we can't determine it's - ;; (inner) length, or the length is zero, or the - ;; number of repetitions is fixed; in all of - ;; these cases we don't bother to optimize - (maybe-split-repetition regex - greedyp - minimum - maximum - min-len - length - reg-seen) - ;; otherwise we make a transformation that looks - ;; roughly like one of - ;; * -> (?:*)? - ;; + -> * - ;; where the trick is that as much as possible - ;; registers from are removed in - ;; - (let* (reg-seen ; new instance for REMOVE-REGISTERS - (remove-registers-p t) - (inner-regex (remove-registers regex)) - (inner-repetition - ;; this is the "" part - (maybe-split-repetition inner-regex - ;; always greedy - t - ;; reduce minimum by 1 - ;; unless it's already 0 - (if (zerop minimum) - 0 - (1- minimum)) - ;; reduce maximum by 1 - ;; unless it's NIL - (and maximum - (1- maximum)) - min-len - length - reg-seen)) - (inner-seq - ;; this is the "*" part - (make-instance 'seq - :elements (list inner-repetition - regex)))) - ;; note that this declaration already applies - ;; to the call to REMOVE-REGISTERS above - (declare (special remove-registers-p reg-seen)) - ;; wrap INNER-SEQ with a greedy - ;; {0,1}-repetition (i.e. "?") if necessary - (if (plusp minimum) - inner-seq - (maybe-split-repetition inner-seq - t - 0 - 1 - min-len - nil - t)))))))) - ;; (:REGISTER ) - ;; (:NAMED-REGISTER ) - ((:register :named-register) - ;; keep the effect of modifiers local to the enclosed - ;; regex; also, assign the current value of REG-NUM to - ;; the corresponding slot of the REGISTER object and - ;; increase this counter afterwards; for named register - ;; update REG-NAMES and set the corresponding name slot - ;; of the REGISTER object too - (let ((flags (copy-list flags)) - (stored-reg-num reg-num) - (reg-name (when (eq (first parse-tree) :named-register) - (copy-seq (second parse-tree))))) - (declare (special flags reg-seen named-reg-seen)) - (setq reg-seen t) - (when reg-name - (setq named-reg-seen t)) - (incf (the fixnum reg-num)) - (push reg-name - reg-names) - (make-instance 'register - :regex (convert-aux (if (eq (first parse-tree) :named-register) - (third parse-tree) - (second parse-tree))) - :num stored-reg-num - :name reg-name))) - ;; (:FILTER &optional ) - ((:filter) - ;; stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (make-instance 'filter - :fn (second parse-tree) - :len (third parse-tree))) - ;; (:STANDALONE ) - ((:standalone) - ;; stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - ;; keep the effect of modifiers local to the enclosed - ;; regex - (let ((flags (copy-list flags))) - (declare (special flags)) - (make-instance 'standalone - :regex (convert-aux (second parse-tree))))) - ;; (:BACK-REFERENCE ) - ;; (:BACK-REFERENCE ) - ((:back-reference) - (locally (declare (special reg-names reg-num)) - (let* ((backref-name (and (stringp (second parse-tree)) - (second parse-tree))) - (referred-regs - (when backref-name - ;; find which register corresponds to the given name - ;; we have to deal with case where several registers share - ;; the same name and collect their respective numbers - (loop - for name in reg-names - for reg-index from 0 - when (string= name backref-name) - ;; NOTE: REG-NAMES stores register names in reversed order - ;; REG-NUM contains number of (any) registers seen so far - ;; 1- will be done later - collect (- reg-num reg-index)))) - ;; store the register number for the simple case - (backref-number (or (first referred-regs) - (second parse-tree)))) - (declare (type (or fixnum null) backref-number)) - (when (or (not (typep backref-number 'fixnum)) - (<= backref-number 0)) - (signal-ppcre-syntax-error - "Illegal back-reference: ~S" - parse-tree)) - ;; stop accumulating into STARTS-WITH and increase - ;; MAX-BACK-REF if necessary - (setq accumulate-start-p nil - max-back-ref (max (the fixnum max-back-ref) - backref-number)) - (flet ((make-back-ref (backref-number) - (make-instance 'back-reference - ;; we start counting from 0 internally - :num (1- backref-number) - :case-insensitive-p (case-insensitive-mode-p flags) - ;; backref-name is NIL or string, safe to copy - :name (copy-seq backref-name)))) - (cond - ((cdr referred-regs) - ;; several registers share the same name - ;; we will try to match any of them, starting - ;; with the most recent first - ;; alternation is used to accomplish matching - (make-instance 'alternation - :choices (loop - for reg-index in referred-regs - collect (make-back-ref reg-index)))) - ;; simple case - backref corresponds to only one register - (t - (make-back-ref backref-number))))))) - ;; (:REGEX ) - ((:regex) - (let ((regex (second parse-tree))) - (convert-aux (parse-string regex)))) - ;; (:CHAR-CLASS|:INVERTED-CHAR-CLASS {}*) - ;; where item is one of - ;; - a character - ;; - a character range: (:RANGE ) - ;; - a special char class symbol like :DIGIT-CHAR-CLASS - ((:char-class :inverted-char-class) - ;; first create the charset and some auxiliary values - (let* (set set-contents - (count most-positive-fixnum) - (item-list (rest parse-tree)) - (invertedp (eq (first parse-tree) :inverted-char-class)) - word-char-class-p) - (cond ((every (lambda (item) (eq item :word-char-class)) - item-list) - ;; treat "[\\w]" like "\\w" - (setq word-char-class-p t)) - ((every (lambda (item) (eq item :non-word-char-class)) - item-list) - ;; treat "[\\W]" like "\\W" - (setq word-char-class-p t) - (setq invertedp (not invertedp))) - (t - (setq set (convert-char-class-to-charset item-list) - count (charset-count set)) - (when (<= count 2) - ;; collect the contents of SET into a list if - ;; COUNT is smaller than 3 - (setq set-contents (all-characters set))))) - (cond ((and (not invertedp) - (= count 1)) - ;; convert one-element charset into a STR object - ;; and try to accumulate into STARTS-WITH - (let ((str (make-instance 'str - :str (string (first set-contents)) - :case-insensitive-p nil))) - (maybe-accumulate str) - str)) - ((and (not invertedp) - (= count 2) - (char-equal (first set-contents) (second set-contents))) - ;; convert two-element charset into a - ;; case-insensitive STR object and try to - ;; accumulate into STARTS-WITH if the two - ;; characters are CHAR-EQUAL - (let ((str (make-instance 'str - :str (string (first set-contents)) - :case-insensitive-p t))) - (maybe-accumulate str) - str)) - (t - ;; the general case; stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (make-instance 'char-class - :charset set - :case-insensitive-p - (case-insensitive-mode-p flags) - :invertedp invertedp - :word-char-class-p word-char-class-p))))) - ;; (:FLAGS {}*) - ;; where flag is a modifier symbol like :CASE-INSENSITIVE-P - ((:flags) - ;; set/unset the flags corresponding to the symbols - ;; following :FLAGS - (mapc #'set-flag (rest parse-tree)) - ;; we're only interested in the side effect of - ;; setting/unsetting the flags and turn this syntactical - ;; construct into a VOID object which'll be optimized - ;; away when creating the matcher - (make-instance 'void)) - (otherwise - (signal-ppcre-syntax-error - "Unknown token ~A in parse-tree" - (first parse-tree))))) - ((or (characterp parse-tree) (stringp parse-tree)) - ;; turn characters or strings into STR objects and try to - ;; accumulate into STARTS-WITH - (let ((str (make-instance 'str - :str (string parse-tree) - :case-insensitive-p - (case-insensitive-mode-p flags)))) - (maybe-accumulate str) - str)) - (t - ;; and now for the tokens which are symbols - (case parse-tree - ((:void) - (make-instance 'void)) - ((:word-boundary) - (make-instance 'word-boundary :negatedp nil)) - ((:non-word-boundary) - (make-instance 'word-boundary :negatedp t)) - ;; the special character classes - ((:digit-class - :non-digit-class - :word-char-class - :non-word-char-class - :whitespace-char-class - :non-whitespace-char-class) - ;; stop accumulating into STARTS-WITH - (setq accumulate-start-p nil) - (make-instance 'char-class - ;; use the constants defined in util.lisp - :charset (case parse-tree - ((:digit-class - :non-digit-class) - +digit-set+) - ((:word-char-class - :non-word-char-class) - nil) - ((:whitespace-char-class - :non-whitespace-char-class) - +whitespace-char-set+)) - ;; this value doesn't really matter but - ;; NIL should result in slightly faster - ;; matchers - :case-insensitive-p nil - :invertedp (member parse-tree - '(:non-digit-class - :non-word-char-class - :non-whitespace-char-class) - :test #'eq) - :word-char-class-p (member parse-tree - '(:word-char-class - :non-word-char-class) - :test #'eq))) - ((:start-anchor ; Perl's "^" - :end-anchor ; Perl's "$" - :modeless-end-anchor-no-newline - ; Perl's "\z" - :modeless-start-anchor ; Perl's "\A" - :modeless-end-anchor) ; Perl's "\Z" - (make-instance 'anchor - :startp (member parse-tree - '(:start-anchor - :modeless-start-anchor) - :test #'eq) - ;; set this value according to the - ;; current settings of FLAGS (unless it's - ;; a modeless anchor) - :multi-line-p - (and (multi-line-mode-p flags) - (not (member parse-tree - '(:modeless-start-anchor - :modeless-end-anchor - :modeless-end-anchor-no-newline) - :test #'eq))) - :no-newline-p - (eq parse-tree - :modeless-end-anchor-no-newline))) - ((:everything) - ;; stop accumulating into STARTS-WITHS - (setq accumulate-start-p nil) - (make-instance 'everything - :single-line-p (single-line-mode-p flags))) - ;; special tokens corresponding to Perl's "ism" modifiers - ((:case-insensitive-p - :case-sensitive-p - :multi-line-mode-p - :not-multi-line-mode-p - :single-line-mode-p - :not-single-line-mode-p) - ;; we're only interested in the side effect of - ;; setting/unsetting the flags and turn these tokens - ;; into VOID objects which'll be optimized away when - ;; creating the matcher - (set-flag parse-tree) - (make-instance 'void)) - (otherwise - (let ((translation (and (symbolp parse-tree) - (parse-tree-synonym parse-tree)))) - (if translation - (convert-aux (copy-tree translation)) - (signal-ppcre-syntax-error "Unknown token ~A in parse-tree" - parse-tree)))))))) + (declare #.*standard-optimize-settings*) + (if (consp parse-tree) + (convert-compound-parse-tree (first parse-tree) parse-tree) + (convert-simple-parse-tree parse-tree))) + +(defgeneric convert-compound-parse-tree (token parse-tree &key) + (declare #.*standard-optimize-settings*) + (:documentation "Helper function for CONVERT-AUX which converts +parse trees which are conses and dispatches on TOKEN which is the +first element of the parse tree.") + (:method (token parse-tree &key) + (signal-syntax-error "Unknown token ~A in parse-tree." token))) + +(defmethod convert-compound-parse-tree ((token (eql :sequence)) parse-tree &key) + "The case for parse trees like \(:SEQUENCE {}*)." + (declare #.*standard-optimize-settings*) + (cond ((cddr parse-tree) + ;; this is essentially like + ;; (MAPCAR 'CONVERT-AUX (REST PARSE-TREE)) + ;; but we don't cons a new list + (loop for parse-tree-rest on (rest parse-tree) + while parse-tree-rest + do (setf (car parse-tree-rest) + (convert-aux (car parse-tree-rest)))) + (make-instance 'seq :elements (rest parse-tree))) + (t (convert-aux (second parse-tree))))) + +(defmethod convert-compound-parse-tree ((token (eql :group)) parse-tree &key) + "The case for parse trees like \(:GROUP {}*). + +This is a syntactical construct equivalent to :SEQUENCE intended to +keep the effect of modifiers local." + (declare #.*standard-optimize-settings*) + (declare (special flags)) + ;; make a local copy of FLAGS and shadow the global value while we + ;; descend into the enclosed regexes + (let ((flags (copy-list flags))) + (declare (special flags)) + (cond ((cddr parse-tree) + (loop for parse-tree-rest on (rest parse-tree) + while parse-tree-rest + do (setf (car parse-tree-rest) + (convert-aux (car parse-tree-rest)))) + (make-instance 'seq :elements (rest parse-tree))) + (t (convert-aux (second parse-tree)))))) + +(defmethod convert-compound-parse-tree ((token (eql :alternation)) parse-tree &key) + "The case for \(:ALTERNATION {}*)." + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + ;; we must stop accumulating objects into STARTS-WITH once we reach + ;; an alternation + (setq accumulate-start-p nil) + (loop for parse-tree-rest on (rest parse-tree) + while parse-tree-rest + do (setf (car parse-tree-rest) + (convert-aux (car parse-tree-rest)))) + (make-instance 'alternation :choices (rest parse-tree))) + +(defmethod convert-compound-parse-tree ((token (eql :branch)) parse-tree &key) + "The case for \(:BRANCH ). + +Here, must be look-ahead, look-behind or number; if is +an alternation it must have one or two choices." + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + (setq accumulate-start-p nil) + (let* ((test-candidate (second parse-tree)) + (test (cond ((numberp test-candidate) + (when (zerop (the fixnum test-candidate)) + (signal-syntax-error "Register 0 doesn't exist: ~S." parse-tree)) + (1- (the fixnum test-candidate))) + (t (convert-aux test-candidate)))) + (alternations (convert-aux (third parse-tree)))) + (when (and (not (numberp test)) + (not (typep test 'lookahead)) + (not (typep test 'lookbehind))) + (signal-syntax-error "Branch test must be look-ahead, look-behind or number: ~S." parse-tree)) + (typecase alternations + (alternation + (case (length (choices alternations)) + ((0) + (signal-syntax-error "No choices in branch: ~S." parse-tree)) + ((1) + (make-instance 'branch + :test test + :then-regex (first + (choices alternations)))) + ((2) + (make-instance 'branch + :test test + :then-regex (first + (choices alternations)) + :else-regex (second + (choices alternations)))) + (otherwise + (signal-syntax-error "Too much choices in branch: ~S." parse-tree)))) + (t + (make-instance 'branch + :test test + :then-regex alternations))))) + +(defmethod convert-compound-parse-tree ((token (eql :positive-lookahead)) parse-tree &key) + "The case for \(:POSITIVE-LOOKAHEAD )." + (declare #.*standard-optimize-settings*) + (declare (special flags accumulate-start-p)) + ;; keep the effect of modifiers local to the enclosed regex and stop + ;; accumulating into STARTS-WITH + (setq accumulate-start-p nil) + (let ((flags (copy-list flags))) + (declare (special flags)) + (make-instance 'lookahead + :regex (convert-aux (second parse-tree)) + :positivep t))) + +(defmethod convert-compound-parse-tree ((token (eql :negative-lookahead)) parse-tree &key) + "The case for \(:NEGATIVE-LOOKAHEAD )." + (declare #.*standard-optimize-settings*) + ;; do the same as for positive look-aheads and just switch afterwards + (let ((regex (convert-compound-parse-tree :positive-lookahead parse-tree))) + (setf (slot-value regex 'positivep) nil) + regex)) + +(defmethod convert-compound-parse-tree ((token (eql :positive-lookbehind)) parse-tree &key) + "The case for \(:POSITIVE-LOOKBEHIND )." + (declare #.*standard-optimize-settings*) + (declare (special flags accumulate-start-p)) + ;; keep the effect of modifiers local to the enclosed regex and stop + ;; accumulating into STARTS-WITH + (setq accumulate-start-p nil) + (let* ((flags (copy-list flags)) + (regex (convert-aux (second parse-tree))) + (len (regex-length regex))) + (declare (special flags)) + ;; lookbehind assertions must be of fixed length + (unless len + (signal-syntax-error "Variable length look-behind not implemented \(yet): ~S." parse-tree)) + (make-instance 'lookbehind + :regex regex + :positivep t + :len len))) + +(defmethod convert-compound-parse-tree ((token (eql :negative-lookbehind)) parse-tree &key) + "The case for \(:NEGATIVE-LOOKBEHIND )." + (declare #.*standard-optimize-settings*) + ;; do the same as for positive look-behinds and just switch afterwards + (let ((regex (convert-compound-parse-tree :positive-lookbehind parse-tree))) + (setf (slot-value regex 'positivep) nil) + regex)) + +(defmethod convert-compound-parse-tree ((token (eql :greedy-repetition)) parse-tree &key (greedyp t)) + "The case for \(:GREEDY-REPETITION|:NON-GREEDY-REPETITION ). + +This function is also used for the non-greedy case in which case it is +called with GREEDYP set to NIL as you would expect." + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p starts-with)) + ;; remember the value of ACCUMULATE-START-P upon entering + (let ((local-accumulate-start-p accumulate-start-p)) + (let ((minimum (second parse-tree)) + (maximum (third parse-tree))) + (declare (fixnum minimum)) + (declare (type (or null fixnum) maximum)) + (unless (and maximum + (= 1 minimum maximum)) + ;; set ACCUMULATE-START-P to NIL for the rest of + ;; the conversion because we can't continue to + ;; accumulate inside as well as after a proper + ;; repetition + (setq accumulate-start-p nil)) + (let* (reg-seen + (regex (convert-aux (fourth parse-tree))) + (min-len (regex-min-length regex)) + (length (regex-length regex))) + ;; note that this declaration already applies to + ;; the call to CONVERT-AUX above + (declare (special reg-seen)) + (when (and local-accumulate-start-p + (not starts-with) + (zerop minimum) + (not maximum)) + ;; if this repetition is (equivalent to) ".*" + ;; and if we're at the start of the regex we + ;; remember it for ADVANCE-FN (see the SCAN + ;; function) + (setq starts-with (everythingp regex))) + (if (or (not reg-seen) + (not greedyp) + (not length) + (zerop length) + (and maximum (= minimum maximum))) + ;; the repetition doesn't enclose a register, or + ;; it's not greedy, or we can't determine it's + ;; (inner) length, or the length is zero, or the + ;; number of repetitions is fixed; in all of + ;; these cases we don't bother to optimize + (maybe-split-repetition regex + greedyp + minimum + maximum + min-len + length + reg-seen) + ;; otherwise we make a transformation that looks + ;; roughly like one of + ;; * -> (?:*)? + ;; + -> * + ;; where the trick is that as much as possible + ;; registers from are removed in + ;; + (let* (reg-seen ; new instance for REMOVE-REGISTERS + (remove-registers-p t) + (inner-regex (remove-registers regex)) + (inner-repetition + ;; this is the "" part + (maybe-split-repetition inner-regex + ;; always greedy + t + ;; reduce minimum by 1 + ;; unless it's already 0 + (if (zerop minimum) + 0 + (1- minimum)) + ;; reduce maximum by 1 + ;; unless it's NIL + (and maximum + (1- maximum)) + min-len + length + reg-seen)) + (inner-seq + ;; this is the "*" part + (make-instance 'seq + :elements (list inner-repetition + regex)))) + ;; note that this declaration already applies + ;; to the call to REMOVE-REGISTERS above + (declare (special remove-registers-p reg-seen)) + ;; wrap INNER-SEQ with a greedy + ;; {0,1}-repetition (i.e. "?") if necessary + (if (plusp minimum) + inner-seq + (maybe-split-repetition inner-seq + t + 0 + 1 + min-len + nil + t)))))))) + +(defmethod convert-compound-parse-tree ((token (eql :non-greedy-repetition)) parse-tree &key) + "The case for \(:NON-GREEDY-REPETITION )." + (declare #.*standard-optimize-settings*) + ;; just dispatch to the method above with GREEDYP explicitly set to NIL + (convert-compound-parse-tree :greedy-repetition parse-tree :greedyp nil)) + +(defmethod convert-compound-parse-tree ((token (eql :register)) parse-tree &key name) + "The case for \(:REGISTER ). Also used for named registers +when NAME is not NIL." + (declare #.*standard-optimize-settings*) + (declare (special flags reg-num reg-names)) + ;; keep the effect of modifiers local to the enclosed regex; also, + ;; assign the current value of REG-NUM to the corresponding slot of + ;; the REGISTER object and increase this counter afterwards; for + ;; named register update REG-NAMES and set the corresponding name + ;; slot of the REGISTER object too + (let ((flags (copy-list flags)) + (stored-reg-num reg-num)) + (declare (special flags reg-seen named-reg-seen)) + (setq reg-seen t) + (when name (setq named-reg-seen t)) + (incf (the fixnum reg-num)) + (push name reg-names) + (make-instance 'register + :regex (convert-aux (if name (third parse-tree) (second parse-tree))) + :num stored-reg-num + :name name))) + +(defmethod convert-compound-parse-tree ((token (eql :named-register)) parse-tree &key) + "The case for \(:NAMED-REGISTER )." + (declare #.*standard-optimize-settings*) + ;; call the method above and use the :NAME keyword argument + (convert-compound-parse-tree :register parse-tree :name (copy-seq (second parse-tree)))) + +(defmethod convert-compound-parse-tree ((token (eql :filter)) parse-tree &key) + "The case for \(:FILTER &optional )." + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + ;; stop accumulating into STARTS-WITH + (setq accumulate-start-p nil) + (make-instance 'filter + :fn (second parse-tree) + :len (third parse-tree))) + +(defmethod convert-compound-parse-tree ((token (eql :standalone)) parse-tree &key) + "The case for \(:STANDALONE )." + (declare #.*standard-optimize-settings*) + (declare (special flags accumulate-start-p)) + ;; stop accumulating into STARTS-WITH + (setq accumulate-start-p nil) + ;; keep the effect of modifiers local to the enclosed regex + (let ((flags (copy-list flags))) + (declare (special flags)) + (make-instance 'standalone :regex (convert-aux (second parse-tree))))) + +(defmethod convert-compound-parse-tree ((token (eql :back-reference)) parse-tree &key) + "The case for \(:BACK-REFERENCE |)." + (declare #.*standard-optimize-settings*) + (declare (special flags accumulate-start-p reg-num reg-names max-back-ref)) + (let* ((backref-name (and (stringp (second parse-tree)) + (second parse-tree))) + (referred-regs + (when backref-name + ;; find which register corresponds to the given name + ;; we have to deal with case where several registers share + ;; the same name and collect their respective numbers + (loop for name in reg-names + for reg-index from 0 + when (string= name backref-name) + ;; NOTE: REG-NAMES stores register names in reversed + ;; order REG-NUM contains number of (any) registers + ;; seen so far; 1- will be done later + collect (- reg-num reg-index)))) + ;; store the register number for the simple case + (backref-number (or (first referred-regs) (second parse-tree)))) + (declare (type (or fixnum null) backref-number)) + (when (or (not (typep backref-number 'fixnum)) + (<= backref-number 0)) + (signal-syntax-error "Illegal back-reference: ~S." parse-tree)) + ;; stop accumulating into STARTS-WITH and increase MAX-BACK-REF if + ;; necessary + (setq accumulate-start-p nil + max-back-ref (max (the fixnum max-back-ref) + backref-number)) + (flet ((make-back-ref (backref-number) + (make-instance 'back-reference + ;; we start counting from 0 internally + :num (1- backref-number) + :case-insensitive-p (case-insensitive-mode-p flags) + ;; backref-name is NIL or string, safe to copy + :name (copy-seq backref-name)))) + (cond + ((cdr referred-regs) + ;; several registers share the same name we will try to match + ;; any of them, starting with the most recent first + ;; alternation is used to accomplish matching + (make-instance 'alternation + :choices (loop + for reg-index in referred-regs + collect (make-back-ref reg-index)))) + ;; simple case - backref corresponds to only one register + (t + (make-back-ref backref-number)))))) + +(defmethod convert-compound-parse-tree ((token (eql :regex)) parse-tree &key) + "The case for \(:REGEX )." + (declare #.*standard-optimize-settings*) + (convert-aux (parse-string (second parse-tree)))) + +(defmethod convert-compound-parse-tree ((token (eql :char-class)) parse-tree &key invertedp) + "The case for \(:CHAR-CLASS {}*) where item is one of + +- a character, +- a character range: \(:RANGE ), or +- a special char class symbol like :DIGIT-CHAR-CLASS. + +Also used for inverted char classes when INVERTEDP is true." + (declare #.*standard-optimize-settings*) + (declare (special flags accumulate-start-p)) + (let ((test-function + (create-optimized-test-function + (convert-char-class-to-test-function (rest parse-tree) + invertedp + (case-insensitive-mode-p flags))))) + (setq accumulate-start-p nil) + (make-instance 'char-class :test-function test-function))) + +(defmethod convert-compound-parse-tree ((token (eql :inverted-char-class)) parse-tree &key) + "The case for \(:INVERTED-CHAR-CLASS {}*)." + (declare #.*standard-optimize-settings*) + ;; just dispatch to the "real" method + (convert-compound-parse-tree :char-class parse-tree :invertedp t)) + +(defmethod convert-compound-parse-tree ((token (eql :property)) parse-tree &key) + "The case for \(:PROPERTY ) where is a string." + (declare #.*standard-optimize-settings*) + (make-instance 'char-class :test-function (resolve-property (second parse-tree)))) + +(defmethod convert-compound-parse-tree ((token (eql :inverted-property)) parse-tree &key) + "The case for \(:INVERTED-PROPERTY ) where is a string." + (declare #.*standard-optimize-settings*) + (make-instance 'char-class :test-function (complement* (resolve-property (second parse-tree))))) + +(defmethod convert-compound-parse-tree ((token (eql :flags)) parse-tree &key) + "The case for \(:FLAGS {}*) where flag is a modifier symbol +like :CASE-INSENSITIVE-P." + (declare #.*standard-optimize-settings*) + ;; set/unset the flags corresponding to the symbols + ;; following :FLAGS + (mapc #'set-flag (rest parse-tree)) + ;; we're only interested in the side effect of + ;; setting/unsetting the flags and turn this syntactical + ;; construct into a VOID object which'll be optimized + ;; away when creating the matcher + (make-instance 'void)) + +(defgeneric convert-simple-parse-tree (parse-tree) + (declare #.*standard-optimize-settings*) + (:documentation "Helper function for CONVERT-AUX which converts +parse trees which are atoms.") + (:method ((parse-tree (eql :void))) + (declare #.*standard-optimize-settings*) + (make-instance 'void)) + (:method ((parse-tree (eql :word-boundary))) + (declare #.*standard-optimize-settings*) + (make-instance 'word-boundary :negatedp nil)) + (:method ((parse-tree (eql :non-word-boundary))) + (declare #.*standard-optimize-settings*) + (make-instance 'word-boundary :negatedp t)) + (:method ((parse-tree (eql :everything))) + (declare #.*standard-optimize-settings*) + (declare (special flags accumulate-start-p)) + (setq accumulate-start-p nil) + (make-instance 'everything :single-line-p (single-line-mode-p flags))) + (:method ((parse-tree (eql :digit-class))) + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + (setq accumulate-start-p nil) + (make-instance 'char-class :test-function #'digit-char-p)) + (:method ((parse-tree (eql :word-char-class))) + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + (setq accumulate-start-p nil) + (make-instance 'char-class :test-function #'word-char-p)) + (:method ((parse-tree (eql :whitespace-char-class))) + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + (setq accumulate-start-p nil) + (make-instance 'char-class :test-function #'whitespacep)) + (:method ((parse-tree (eql :non-digit-class))) + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + (setq accumulate-start-p nil) + (make-instance 'char-class :test-function (complement* #'digit-char-p))) + (:method ((parse-tree (eql :non-word-char-class))) + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + (setq accumulate-start-p nil) + (make-instance 'char-class :test-function (complement* #'word-char-p))) + (:method ((parse-tree (eql :non-whitespace-char-class))) + (declare #.*standard-optimize-settings*) + (declare (special accumulate-start-p)) + (setq accumulate-start-p nil) + (make-instance 'char-class :test-function (complement* #'whitespacep))) + (:method ((parse-tree (eql :start-anchor))) + ;; Perl's "^" + (declare #.*standard-optimize-settings*) + (declare (special flags)) + (make-instance 'anchor :startp t :multi-line-p (multi-line-mode-p flags))) + (:method ((parse-tree (eql :end-anchor))) + ;; Perl's "$" + (declare #.*standard-optimize-settings*) + (declare (special flags)) + (make-instance 'anchor :startp nil :multi-line-p (multi-line-mode-p flags))) + (:method ((parse-tree (eql :modeless-start-anchor))) + ;; Perl's "\A" + (declare #.*standard-optimize-settings*) + (make-instance 'anchor :startp t)) + (:method ((parse-tree (eql :modeless-end-anchor))) + ;; Perl's "$\Z" + (declare #.*standard-optimize-settings*) + (make-instance 'anchor :startp nil)) + (:method ((parse-tree (eql :modeless-end-anchor-no-newline))) + ;; Perl's "$\z" + (declare #.*standard-optimize-settings*) + (make-instance 'anchor :startp nil :no-newline-p t)) + (:method ((parse-tree (eql :case-insensitive-p))) + (declare #.*standard-optimize-settings*) + (set-flag parse-tree) + (make-instance 'void)) + (:method ((parse-tree (eql :case-sensitive-p))) + (declare #.*standard-optimize-settings*) + (set-flag parse-tree) + (make-instance 'void)) + (:method ((parse-tree (eql :multi-line-mode-p))) + (declare #.*standard-optimize-settings*) + (set-flag parse-tree) + (make-instance 'void)) + (:method ((parse-tree (eql :not-multi-line-mode-p))) + (declare #.*standard-optimize-settings*) + (set-flag parse-tree) + (make-instance 'void)) + (:method ((parse-tree (eql :single-line-mode-p))) + (declare #.*standard-optimize-settings*) + (set-flag parse-tree) + (make-instance 'void)) + (:method ((parse-tree (eql :not-single-line-mode-p))) + (declare #.*standard-optimize-settings*) + (set-flag parse-tree) + (make-instance 'void))) + +(defmethod convert-simple-parse-tree ((parse-tree string)) + (declare #.*standard-optimize-settings*) + (declare (special flags)) + ;; turn strings into STR objects and try to accumulate into + ;; STARTS-WITH + (let ((str (make-instance 'str + :str parse-tree + :case-insensitive-p (case-insensitive-mode-p flags)))) + (maybe-accumulate str) + str)) + +(defmethod convert-simple-parse-tree ((parse-tree character)) + (declare #.*standard-optimize-settings*) + ;; dispatch to the method for strings + (convert-simple-parse-tree (string parse-tree))) + +(defmethod convert-simple-parse-tree (parse-tree) + "The default method - check if there's a translation." + (declare #.*standard-optimize-settings*) + (let ((translation (and (symbolp parse-tree) (parse-tree-synonym parse-tree)))) + (if translation + (convert-aux (copy-tree translation)) + (signal-syntax-error "Unknown token ~A in parse tree." parse-tree)))) (defun convert (parse-tree) - (declare #.*standard-optimize-settings*) "Converts the parse tree PARSE-TREE into an equivalent REGEX object and returns three values: the REGEX object, the number of registers seen and an object the regex starts with which is either a STR object -or an EVERYTHING object (if the regex starts with something like +or an EVERYTHING object \(if the regex starts with something like \".*\") or NIL." + (declare #.*standard-optimize-settings*) ;; this function basically just initializes the special variables ;; and then calls CONVERT-AUX to do all the work (let* ((flags (list nil nil nil)) @@ -790,12 +862,12 @@ or an EVERYTHING object (if the regex starts with something like ;; make sure we don't reference registers which aren't there (when (> (the fixnum max-back-ref) (the fixnum reg-num)) - (signal-ppcre-syntax-error - "Backreference to register ~A which has not been defined" - max-back-ref)) + (signal-syntax-error "Backreference to register ~A which has not been defined." max-back-ref)) (when (typep starts-with 'str) (setf (slot-value starts-with 'str) - (coerce (slot-value starts-with 'str) 'simple-string))) + (coerce (slot-value starts-with 'str) + #+:lispworks 'lw:simple-text-string + #-:lispworks 'simple-string))) (values converted-parse-tree reg-num starts-with ;; we can't simply use *ALLOW-NAMED-REGISTERS* ;; since parse-tree syntax ignores it diff --git a/doc/benchmarks.2002-12-22.txt b/doc/benchmarks.2002-12-22.txt deleted file mode 100644 index 907dc53..0000000 --- a/doc/benchmarks.2002-12-22.txt +++ /dev/null @@ -1,1546 +0,0 @@ - 1: 0.2862 (100000 repetitions, Perl: 0.2097 seconds, CL-PPCRE: 0.0600 seconds) - 2: 0.4161 (1000000 repetitions, Perl: 0.7690 seconds, CL-PPCRE: 0.3200 seconds) - 3: 0.3939 (100000 repetitions, Perl: 0.2031 seconds, CL-PPCRE: 0.0800 seconds) - 4: 0.4639 (1000000 repetitions, Perl: 0.7976 seconds, CL-PPCRE: 0.3700 seconds) - 5: 0.4400 (100000 repetitions, Perl: 0.1591 seconds, CL-PPCRE: 0.0700 seconds) - 6: 0.5106 (100000 repetitions, Perl: 0.1567 seconds, CL-PPCRE: 0.0800 seconds) - 7: 0.4928 (100000 repetitions, Perl: 0.1826 seconds, CL-PPCRE: 0.0900 seconds) - 8: 0.5934 (100000 repetitions, Perl: 0.1854 seconds, CL-PPCRE: 0.1100 seconds) - 9: 0.3450 (100000 repetitions, Perl: 0.2029 seconds, CL-PPCRE: 0.0700 seconds) - 10: 0.5261 (100000 repetitions, Perl: 0.3231 seconds, CL-PPCRE: 0.1700 seconds) - 11: 0.5556 (100000 repetitions, Perl: 0.3240 seconds, CL-PPCRE: 0.1800 seconds) - 12: 0.5490 (100000 repetitions, Perl: 0.3279 seconds, CL-PPCRE: 0.1800 seconds) - 13: 0.5595 (100000 repetitions, Perl: 0.3217 seconds, CL-PPCRE: 0.1800 seconds) - 14: 0.5917 (100000 repetitions, Perl: 0.3211 seconds, CL-PPCRE: 0.1900 seconds) - 15: 0.5164 (100000 repetitions, Perl: 0.3292 seconds, CL-PPCRE: 0.1700 seconds) - 16: 0.5552 (100000 repetitions, Perl: 0.3242 seconds, CL-PPCRE: 0.1800 seconds) - 17: 0.5273 (100000 repetitions, Perl: 0.3224 seconds, CL-PPCRE: 0.1700 seconds) - 18: 0.5886 (100000 repetitions, Perl: 0.3228 seconds, CL-PPCRE: 0.1900 seconds) - 19: 0.5524 (100000 repetitions, Perl: 0.3259 seconds, CL-PPCRE: 0.1800 seconds) - 20: 0.5860 (100000 repetitions, Perl: 0.3242 seconds, CL-PPCRE: 0.1900 seconds) - 21: 0.5569 (100000 repetitions, Perl: 0.3232 seconds, CL-PPCRE: 0.1800 seconds) - 22: 0.6129 (100000 repetitions, Perl: 0.3263 seconds, CL-PPCRE: 0.2000 seconds) - 23: 0.5789 (100000 repetitions, Perl: 0.3282 seconds, CL-PPCRE: 0.1900 seconds) - 24: 0.5516 (100000 repetitions, Perl: 0.3263 seconds, CL-PPCRE: 0.1800 seconds) - 25: 0.4861 (100000 repetitions, Perl: 0.3291 seconds, CL-PPCRE: 0.1600 seconds) - 26: 0.4879 (100000 repetitions, Perl: 0.3279 seconds, CL-PPCRE: 0.1600 seconds) - 27: 0.4929 (100000 repetitions, Perl: 0.3246 seconds, CL-PPCRE: 0.1600 seconds) - 28: 0.5633 (100000 repetitions, Perl: 0.3195 seconds, CL-PPCRE: 0.1800 seconds) - 29: 0.4901 (100000 repetitions, Perl: 0.3264 seconds, CL-PPCRE: 0.1600 seconds) - 30: 0.5145 (100000 repetitions, Perl: 0.3304 seconds, CL-PPCRE: 0.1700 seconds) - 31: 0.5286 (100000 repetitions, Perl: 0.3216 seconds, CL-PPCRE: 0.1700 seconds) - 32: 0.5306 (100000 repetitions, Perl: 0.3204 seconds, CL-PPCRE: 0.1700 seconds) - 33: 0.5213 (100000 repetitions, Perl: 0.3261 seconds, CL-PPCRE: 0.1700 seconds) - 34: 0.5221 (100000 repetitions, Perl: 0.3256 seconds, CL-PPCRE: 0.1700 seconds) - 35: 0.5858 (100000 repetitions, Perl: 0.3243 seconds, CL-PPCRE: 0.1900 seconds) - 36: 0.5556 (100000 repetitions, Perl: 0.3240 seconds, CL-PPCRE: 0.1800 seconds) - 37: 0.6985 (100000 repetitions, Perl: 0.3293 seconds, CL-PPCRE: 0.2300 seconds) - 38: 0.5760 (100000 repetitions, Perl: 0.3299 seconds, CL-PPCRE: 0.1900 seconds) - 39: 0.6964 (100000 repetitions, Perl: 0.3303 seconds, CL-PPCRE: 0.2300 seconds) - 40: 1.2660 (1000000 repetitions, Perl: 0.7662 seconds, CL-PPCRE: 0.9700 seconds) - 41: 1.5983 (1000000 repetitions, Perl: 0.8509 seconds, CL-PPCRE: 1.3600 seconds) - 42: 1.3381 (1000000 repetitions, Perl: 0.7697 seconds, CL-PPCRE: 1.0300 seconds) - 43: 1.0846 (100000 repetitions, Perl: 0.7284 seconds, CL-PPCRE: 0.7900 seconds) - 44: 0.9248 (100000 repetitions, Perl: 0.7029 seconds, CL-PPCRE: 0.6500 seconds) - 45: 0.9872 (100000 repetitions, Perl: 0.6281 seconds, CL-PPCRE: 0.6200 seconds) - 46: 0.4932 (100000 repetitions, Perl: 0.1622 seconds, CL-PPCRE: 0.0800 seconds) - 47: 0.5567 (100000 repetitions, Perl: 0.1617 seconds, CL-PPCRE: 0.0900 seconds) - 48: 0.7445 (1000000 repetitions, Perl: 0.6179 seconds, CL-PPCRE: 0.4600 seconds) - 49: 1.4152 (1000000 repetitions, Perl: 0.8055 seconds, CL-PPCRE: 1.1400 seconds) - 50: 0.6042 (100000 repetitions, Perl: 0.1324 seconds, CL-PPCRE: 0.0800 seconds) - 51: 0.3376 (100000 repetitions, Perl: 0.2370 seconds, CL-PPCRE: 0.0800 seconds) - 52: 0.3549 (100000 repetitions, Perl: 0.3099 seconds, CL-PPCRE: 0.1100 seconds) - 53: 0.3404 (100000 repetitions, Perl: 0.3525 seconds, CL-PPCRE: 0.1200 seconds) - 54: 0.3398 (100000 repetitions, Perl: 0.3237 seconds, CL-PPCRE: 0.1100 seconds) - 55: 0.3516 (100000 repetitions, Perl: 0.4551 seconds, CL-PPCRE: 0.1600 seconds) - 56: 0.3069 (100000 repetitions, Perl: 0.3258 seconds, CL-PPCRE: 0.1000 seconds) - 57: 0.3032 (100000 repetitions, Perl: 0.6925 seconds, CL-PPCRE: 0.2100 seconds) - 58: 0.3515 (10000 repetitions, Perl: 0.3130 seconds, CL-PPCRE: 0.1100 seconds) - 59: 0.3563 (100000 repetitions, Perl: 0.3088 seconds, CL-PPCRE: 0.1100 seconds) - 60: 0.3429 (100000 repetitions, Perl: 0.6708 seconds, CL-PPCRE: 0.2300 seconds) - 61: 0.3169 (100000 repetitions, Perl: 0.2840 seconds, CL-PPCRE: 0.0900 seconds) - 62: 0.3519 (100000 repetitions, Perl: 0.2842 seconds, CL-PPCRE: 0.1000 seconds) - 63: 0.3443 (100000 repetitions, Perl: 0.2904 seconds, CL-PPCRE: 0.1000 seconds) - 64: 0.3917 (100000 repetitions, Perl: 0.2808 seconds, CL-PPCRE: 0.1100 seconds) - 65: 0.3474 (100000 repetitions, Perl: 0.2878 seconds, CL-PPCRE: 0.1000 seconds) - 66: 0.3473 (100000 repetitions, Perl: 0.2879 seconds, CL-PPCRE: 0.1000 seconds) - 67: 0.4047 (100000 repetitions, Perl: 0.2965 seconds, CL-PPCRE: 0.1200 seconds) - 68: 0.4057 (100000 repetitions, Perl: 0.2958 seconds, CL-PPCRE: 0.1200 seconds) - 69: 0.4091 (100000 repetitions, Perl: 0.2689 seconds, CL-PPCRE: 0.1100 seconds) - 70: 0.4841 (100000 repetitions, Perl: 0.4751 seconds, CL-PPCRE: 0.2300 seconds) - 71: 0.2327 (100000 repetitions, Perl: 0.3438 seconds, CL-PPCRE: 0.0800 seconds) - 72: 0.4767 (100000 repetitions, Perl: 0.3986 seconds, CL-PPCRE: 0.1900 seconds) - 73: 0.3673 (100000 repetitions, Perl: 0.5174 seconds, CL-PPCRE: 0.1900 seconds) - 74: 0.5311 (100000 repetitions, Perl: 0.5460 seconds, CL-PPCRE: 0.2900 seconds) - 75: 0.5722 (100000 repetitions, Perl: 0.5068 seconds, CL-PPCRE: 0.2900 seconds) - 76: 0.5913 (100000 repetitions, Perl: 0.5074 seconds, CL-PPCRE: 0.3000 seconds) - 77: 0.3544 (100000 repetitions, Perl: 0.2257 seconds, CL-PPCRE: 0.0800 seconds) - 78: 0.3919 (100000 repetitions, Perl: 0.4593 seconds, CL-PPCRE: 0.1800 seconds) - 79: 0.4080 (100000 repetitions, Perl: 0.2941 seconds, CL-PPCRE: 0.1200 seconds) - 80: 0.5635 (100000 repetitions, Perl: 0.5147 seconds, CL-PPCRE: 0.2900 seconds) - 81: 0.5616 (100000 repetitions, Perl: 0.5163 seconds, CL-PPCRE: 0.2900 seconds) - 82: 0.4216 (100000 repetitions, Perl: 0.1423 seconds, CL-PPCRE: 0.0600 seconds) - 83: 0.2502 (100000 repetitions, Perl: 0.1199 seconds, CL-PPCRE: 0.0300 seconds) - 84: 0.2546 (100000 repetitions, Perl: 0.1178 seconds, CL-PPCRE: 0.0300 seconds) - 85: 0.2515 (100000 repetitions, Perl: 0.1193 seconds, CL-PPCRE: 0.0300 seconds) - 86: 0.2545 (100000 repetitions, Perl: 0.1179 seconds, CL-PPCRE: 0.0300 seconds) - 87: 0.2535 (100000 repetitions, Perl: 0.1184 seconds, CL-PPCRE: 0.0300 seconds) - 88: 0.2522 (100000 repetitions, Perl: 0.1189 seconds, CL-PPCRE: 0.0300 seconds) - 89: 0.3010 (1000000 repetitions, Perl: 0.8971 seconds, CL-PPCRE: 0.2700 seconds) - 90: 0.2906 (1000000 repetitions, Perl: 0.8947 seconds, CL-PPCRE: 0.2600 seconds) - 91: 0.2800 (1000000 repetitions, Perl: 0.8928 seconds, CL-PPCRE: 0.2500 seconds) - 92: 0.3329 (100000 repetitions, Perl: 0.1202 seconds, CL-PPCRE: 0.0400 seconds) - 93: 0.3394 (100000 repetitions, Perl: 0.1178 seconds, CL-PPCRE: 0.0400 seconds) - 94: 0.2516 (100000 repetitions, Perl: 0.1193 seconds, CL-PPCRE: 0.0300 seconds) - 95: 0.3393 (100000 repetitions, Perl: 0.1179 seconds, CL-PPCRE: 0.0400 seconds) - 96: 0.2891 (1000000 repetitions, Perl: 0.8994 seconds, CL-PPCRE: 0.2600 seconds) - 97: 0.3026 (1000000 repetitions, Perl: 0.8922 seconds, CL-PPCRE: 0.2700 seconds) - 98: 0.2508 (100000 repetitions, Perl: 0.1196 seconds, CL-PPCRE: 0.0300 seconds) - 99: 0.2546 (100000 repetitions, Perl: 0.1178 seconds, CL-PPCRE: 0.0300 seconds) - 100: 0.2493 (100000 repetitions, Perl: 0.1204 seconds, CL-PPCRE: 0.0300 seconds) - 101: 0.3002 (1000000 repetitions, Perl: 0.8994 seconds, CL-PPCRE: 0.2700 seconds) - 102: 0.2904 (1000000 repetitions, Perl: 0.8954 seconds, CL-PPCRE: 0.2600 seconds) - 103: 0.2904 (1000000 repetitions, Perl: 0.8952 seconds, CL-PPCRE: 0.2600 seconds) - 104: 0.2976 (1000000 repetitions, Perl: 0.9073 seconds, CL-PPCRE: 0.2700 seconds) - 105: 0.2999 (1000000 repetitions, Perl: 0.9004 seconds, CL-PPCRE: 0.2700 seconds) - 106: 0.2885 (1000000 repetitions, Perl: 0.9012 seconds, CL-PPCRE: 0.2600 seconds) - 107: 0.2505 (100000 repetitions, Perl: 0.1198 seconds, CL-PPCRE: 0.0300 seconds) - 108: 0.3368 (100000 repetitions, Perl: 0.1188 seconds, CL-PPCRE: 0.0400 seconds) - 109: 0.3018 (1000000 repetitions, Perl: 0.8945 seconds, CL-PPCRE: 0.2700 seconds) - 110: 0.2893 (1000000 repetitions, Perl: 0.8988 seconds, CL-PPCRE: 0.2600 seconds) - 111: 0.3013 (1000000 repetitions, Perl: 0.8963 seconds, CL-PPCRE: 0.2700 seconds) - 112: 0.2876 (1000000 repetitions, Perl: 0.9039 seconds, CL-PPCRE: 0.2600 seconds) - 113: 0.4585 (100000 repetitions, Perl: 0.1309 seconds, CL-PPCRE: 0.0600 seconds) - 114: 0.3816 (100000 repetitions, Perl: 0.1310 seconds, CL-PPCRE: 0.0500 seconds) - 115: 0.2148 (100000 repetitions, Perl: 0.1397 seconds, CL-PPCRE: 0.0300 seconds) - 116: 0.2182 (100000 repetitions, Perl: 0.1375 seconds, CL-PPCRE: 0.0300 seconds) - 117: 0.2147 (100000 repetitions, Perl: 0.1397 seconds, CL-PPCRE: 0.0300 seconds) - 118: 0.2154 (100000 repetitions, Perl: 0.1393 seconds, CL-PPCRE: 0.0300 seconds) - 119: 0.2180 (100000 repetitions, Perl: 0.1376 seconds, CL-PPCRE: 0.0300 seconds) - 120: 0.2171 (100000 repetitions, Perl: 0.1382 seconds, CL-PPCRE: 0.0300 seconds) - 121: 0.2145 (100000 repetitions, Perl: 0.1398 seconds, CL-PPCRE: 0.0300 seconds) - 122: 0.2184 (100000 repetitions, Perl: 0.1374 seconds, CL-PPCRE: 0.0300 seconds) - 123: 0.2172 (100000 repetitions, Perl: 0.1381 seconds, CL-PPCRE: 0.0300 seconds) - 124: 0.2124 (100000 repetitions, Perl: 0.1412 seconds, CL-PPCRE: 0.0300 seconds) - 125: 0.2146 (100000 repetitions, Perl: 0.1398 seconds, CL-PPCRE: 0.0300 seconds) - 126: 0.2834 (100000 repetitions, Perl: 0.1412 seconds, CL-PPCRE: 0.0400 seconds) - 127: 0.2649 (1000000 repetitions, Perl: 0.9439 seconds, CL-PPCRE: 0.2500 seconds) - 128: 0.3613 (100000 repetitions, Perl: 0.1384 seconds, CL-PPCRE: 0.0500 seconds) - 129: 0.2925 (100000 repetitions, Perl: 0.1367 seconds, CL-PPCRE: 0.0400 seconds) - 130: 0.2868 (100000 repetitions, Perl: 0.1394 seconds, CL-PPCRE: 0.0400 seconds) - 131: 0.3982 (100000 repetitions, Perl: 0.1758 seconds, CL-PPCRE: 0.0700 seconds) - 132: 0.3910 (100000 repetitions, Perl: 0.1790 seconds, CL-PPCRE: 0.0700 seconds) - 133: 0.4550 (1000000 repetitions, Perl: 0.6154 seconds, CL-PPCRE: 0.2800 seconds) - 134: 0.2943 (100000 repetitions, Perl: 0.1699 seconds, CL-PPCRE: 0.0500 seconds) - 135: 0.2965 (100000 repetitions, Perl: 0.1686 seconds, CL-PPCRE: 0.0500 seconds) - 136: 0.2959 (100000 repetitions, Perl: 0.1690 seconds, CL-PPCRE: 0.0500 seconds) - 137: 0.3398 (1000000 repetitions, Perl: 0.6180 seconds, CL-PPCRE: 0.2100 seconds) - 138: 0.2963 (100000 repetitions, Perl: 0.1687 seconds, CL-PPCRE: 0.0500 seconds) - 139: 0.3538 (100000 repetitions, Perl: 0.1413 seconds, CL-PPCRE: 0.0500 seconds) - 140: 0.3339 (100000 repetitions, Perl: 0.1498 seconds, CL-PPCRE: 0.0500 seconds) - 141: 0.3863 (100000 repetitions, Perl: 0.1812 seconds, CL-PPCRE: 0.0700 seconds) - 142: 0.3245 (1000000 repetitions, Perl: 0.6163 seconds, CL-PPCRE: 0.2000 seconds) - 143: 0.3688 (100000 repetitions, Perl: 0.1627 seconds, CL-PPCRE: 0.0600 seconds) - 144: 0.3063 (100000 repetitions, Perl: 0.4571 seconds, CL-PPCRE: 0.1400 seconds) - 145: 0.7234 (100000 repetitions, Perl: 0.1244 seconds, CL-PPCRE: 0.0900 seconds) - 146: 0.2700 (100000 repetitions, Perl: 0.4074 seconds, CL-PPCRE: 0.1100 seconds) - 147: 0.8323 (1000000 repetitions, Perl: 0.8771 seconds, CL-PPCRE: 0.7300 seconds) - 148: 0.6980 (1000000 repetitions, Perl: 0.7880 seconds, CL-PPCRE: 0.5500 seconds) - 149: 0.4197 (100000 repetitions, Perl: 0.1668 seconds, CL-PPCRE: 0.0700 seconds) - 150: 0.5716 (1000000 repetitions, Perl: 0.8223 seconds, CL-PPCRE: 0.4700 seconds) - 151: 0.5047 (100000 repetitions, Perl: 0.1585 seconds, CL-PPCRE: 0.0800 seconds) - 152: 0.5141 (100000 repetitions, Perl: 0.1556 seconds, CL-PPCRE: 0.0800 seconds) - 153: 0.5116 (100000 repetitions, Perl: 0.1564 seconds, CL-PPCRE: 0.0800 seconds) - 154: 0.4508 (100000 repetitions, Perl: 0.1553 seconds, CL-PPCRE: 0.0700 seconds) - 155: 0.5214 (100000 repetitions, Perl: 0.1534 seconds, CL-PPCRE: 0.0800 seconds) - 156: 0.6360 (100000 repetitions, Perl: 0.1730 seconds, CL-PPCRE: 0.1100 seconds) - 157: 0.9536 (100000 repetitions, Perl: 0.2202 seconds, CL-PPCRE: 0.2100 seconds) - 158: 1.0349 (100000 repetitions, Perl: 0.2416 seconds, CL-PPCRE: 0.2500 seconds) - 159: 1.0302 (100000 repetitions, Perl: 0.1262 seconds, CL-PPCRE: 0.1300 seconds) - 160: 1.1893 (1000000 repetitions, Perl: 0.8325 seconds, CL-PPCRE: 0.9900 seconds) - 161: 1.2895 (100000 repetitions, Perl: 0.1473 seconds, CL-PPCRE: 0.1900 seconds) - 162: 1.3938 (100000 repetitions, Perl: 0.2152 seconds, CL-PPCRE: 0.3000 seconds) - 163: 0.3708 (100000 repetitions, Perl: 0.3505 seconds, CL-PPCRE: 0.1300 seconds) - 164: 0.4182 (100000 repetitions, Perl: 0.3826 seconds, CL-PPCRE: 0.1600 seconds) - 165: 0.4926 (100000 repetitions, Perl: 0.4060 seconds, CL-PPCRE: 0.2000 seconds) - 166: 0.9852 (1000000 repetitions, Perl: 0.6192 seconds, CL-PPCRE: 0.6100 seconds) - 167: 0.9454 (1000000 repetitions, Perl: 0.8039 seconds, CL-PPCRE: 0.7600 seconds) - 168: 0.7178 (100000 repetitions, Perl: 0.3483 seconds, CL-PPCRE: 0.2500 seconds) - 169: 0.8758 (100000 repetitions, Perl: 0.3426 seconds, CL-PPCRE: 0.3000 seconds) - 170: 1.0131 (1000000 repetitions, Perl: 0.8292 seconds, CL-PPCRE: 0.8400 seconds) - 171: 0.3196 (100000 repetitions, Perl: 0.2503 seconds, CL-PPCRE: 0.0800 seconds) - 172: 0.3538 (100000 repetitions, Perl: 0.2544 seconds, CL-PPCRE: 0.0900 seconds) - 173: 0.3592 (100000 repetitions, Perl: 0.2506 seconds, CL-PPCRE: 0.0900 seconds) - 174: 0.6737 (100000 repetitions, Perl: 0.3117 seconds, CL-PPCRE: 0.2100 seconds) - 175: 0.5639 (100000 repetitions, Perl: 0.4078 seconds, CL-PPCRE: 0.2300 seconds) - 176: 0.5225 (100000 repetitions, Perl: 0.3062 seconds, CL-PPCRE: 0.1600 seconds) - 177: 0.4419 (100000 repetitions, Perl: 0.1131 seconds, CL-PPCRE: 0.0500 seconds) - 178: 0.4992 (100000 repetitions, Perl: 0.2604 seconds, CL-PPCRE: 0.1300 seconds) - 179: 0.4653 (100000 repetitions, Perl: 0.3009 seconds, CL-PPCRE: 0.1400 seconds) - 180: 0.4438 (100000 repetitions, Perl: 0.4056 seconds, CL-PPCRE: 0.1800 seconds) - 181: 0.4672 (100000 repetitions, Perl: 0.4281 seconds, CL-PPCRE: 0.2000 seconds) - 182: 0.7833 (100000 repetitions, Perl: 0.1149 seconds, CL-PPCRE: 0.0900 seconds) - 183: 0.5458 (100000 repetitions, Perl: 0.2382 seconds, CL-PPCRE: 0.1300 seconds) - 184: 0.4734 (100000 repetitions, Perl: 0.4436 seconds, CL-PPCRE: 0.2100 seconds) - 185: 0.5420 (100000 repetitions, Perl: 0.3137 seconds, CL-PPCRE: 0.1700 seconds) - 186: 0.7234 (100000 repetitions, Perl: 0.2074 seconds, CL-PPCRE: 0.1500 seconds) - 187: 0.7521 (100000 repetitions, Perl: 0.2393 seconds, CL-PPCRE: 0.1800 seconds) - 188: 0.6819 (100000 repetitions, Perl: 0.2053 seconds, CL-PPCRE: 0.1400 seconds) - 189: 0.4950 (100000 repetitions, Perl: 0.2020 seconds, CL-PPCRE: 0.1000 seconds) - 190: 0.4918 (100000 repetitions, Perl: 0.2033 seconds, CL-PPCRE: 0.1000 seconds) - 191: 0.5343 (100000 repetitions, Perl: 0.2433 seconds, CL-PPCRE: 0.1300 seconds) - 192: 0.4148 (100000 repetitions, Perl: 0.2411 seconds, CL-PPCRE: 0.1000 seconds) - 193: 0.4709 (100000 repetitions, Perl: 0.2761 seconds, CL-PPCRE: 0.1300 seconds) - 194: 0.5928 (100000 repetitions, Perl: 0.2868 seconds, CL-PPCRE: 0.1700 seconds) - 195: 0.5643 (100000 repetitions, Perl: 0.2835 seconds, CL-PPCRE: 0.1600 seconds) - 196: 0.2465 (100000 repetitions, Perl: 0.1217 seconds, CL-PPCRE: 0.0300 seconds) - 197: 0.4772 (100000 repetitions, Perl: 0.1467 seconds, CL-PPCRE: 0.0700 seconds) - 198: 0.4983 (1000000 repetitions, Perl: 0.6221 seconds, CL-PPCRE: 0.3100 seconds) - 199: 0.2375 (100000 repetitions, Perl: 0.1263 seconds, CL-PPCRE: 0.0300 seconds) - 200: 0.4759 (100000 repetitions, Perl: 0.1471 seconds, CL-PPCRE: 0.0700 seconds) - 201: 0.4963 (1000000 repetitions, Perl: 0.6247 seconds, CL-PPCRE: 0.3100 seconds) - 202: 0.2370 (100000 repetitions, Perl: 0.1266 seconds, CL-PPCRE: 0.0300 seconds) - 203: 0.5375 (100000 repetitions, Perl: 0.1488 seconds, CL-PPCRE: 0.0800 seconds) - 204: 0.4682 (100000 repetitions, Perl: 0.1495 seconds, CL-PPCRE: 0.0700 seconds) - 205: 0.4859 (1000000 repetitions, Perl: 0.6174 seconds, CL-PPCRE: 0.3000 seconds) - 206: 0.5685 (1000000 repetitions, Perl: 0.6156 seconds, CL-PPCRE: 0.3500 seconds) - 207: 1.1822 (100000 repetitions, Perl: 0.2622 seconds, CL-PPCRE: 0.3100 seconds) - 208: 0.8749 (100000 repetitions, Perl: 0.2400 seconds, CL-PPCRE: 0.2100 seconds) - 209: 0.8621 (100000 repetitions, Perl: 0.1392 seconds, CL-PPCRE: 0.1200 seconds) - 210: 2.0520 (100000 repetitions, Perl: 0.1511 seconds, CL-PPCRE: 0.3100 seconds) - 211: 0.2312 (100000 repetitions, Perl: 0.1297 seconds, CL-PPCRE: 0.0300 seconds) - 212: 0.3110 (100000 repetitions, Perl: 0.1286 seconds, CL-PPCRE: 0.0400 seconds) - 213: 0.3096 (100000 repetitions, Perl: 0.1292 seconds, CL-PPCRE: 0.0400 seconds) - 214: 0.2972 (100000 repetitions, Perl: 0.1346 seconds, CL-PPCRE: 0.0400 seconds) - 215: 0.2916 (100000 repetitions, Perl: 0.1372 seconds, CL-PPCRE: 0.0400 seconds) - 216: 0.2908 (100000 repetitions, Perl: 0.1376 seconds, CL-PPCRE: 0.0400 seconds) - 217: 0.3625 (100000 repetitions, Perl: 0.1379 seconds, CL-PPCRE: 0.0500 seconds) - 218: 0.2910 (100000 repetitions, Perl: 0.1374 seconds, CL-PPCRE: 0.0400 seconds) - 219: 0.2351 (100000 repetitions, Perl: 0.1276 seconds, CL-PPCRE: 0.0300 seconds) - 220: 0.3128 (100000 repetitions, Perl: 0.1279 seconds, CL-PPCRE: 0.0400 seconds) - 221: 0.3099 (100000 repetitions, Perl: 0.1291 seconds, CL-PPCRE: 0.0400 seconds) - 222: 0.3134 (100000 repetitions, Perl: 0.1277 seconds, CL-PPCRE: 0.0400 seconds) - 223: 0.3118 (100000 repetitions, Perl: 0.1283 seconds, CL-PPCRE: 0.0400 seconds) - 224: 0.3115 (100000 repetitions, Perl: 0.1284 seconds, CL-PPCRE: 0.0400 seconds) - 225: 0.3098 (100000 repetitions, Perl: 0.1291 seconds, CL-PPCRE: 0.0400 seconds) - 226: 0.3118 (100000 repetitions, Perl: 0.1283 seconds, CL-PPCRE: 0.0400 seconds) - 227: 0.2644 (100000 repetitions, Perl: 0.1513 seconds, CL-PPCRE: 0.0400 seconds) - 228: 0.2621 (100000 repetitions, Perl: 0.1526 seconds, CL-PPCRE: 0.0400 seconds) - 229: 0.1883 (100000 repetitions, Perl: 0.1593 seconds, CL-PPCRE: 0.0300 seconds) - 230: 0.2480 (100000 repetitions, Perl: 0.1613 seconds, CL-PPCRE: 0.0400 seconds) - 231: 0.2458 (100000 repetitions, Perl: 0.1627 seconds, CL-PPCRE: 0.0400 seconds) - 232: 0.1954 (100000 repetitions, Perl: 0.1535 seconds, CL-PPCRE: 0.0300 seconds) - 233: 0.1929 (100000 repetitions, Perl: 0.1555 seconds, CL-PPCRE: 0.0300 seconds) - 234: 0.1934 (100000 repetitions, Perl: 0.1551 seconds, CL-PPCRE: 0.0300 seconds) - 235: 0.2597 (100000 repetitions, Perl: 0.1540 seconds, CL-PPCRE: 0.0400 seconds) - 236: 0.2556 (100000 repetitions, Perl: 0.1565 seconds, CL-PPCRE: 0.0400 seconds) - 237: 0.3496 (100000 repetitions, Perl: 0.1430 seconds, CL-PPCRE: 0.0500 seconds) - 238: 0.3485 (100000 repetitions, Perl: 0.1435 seconds, CL-PPCRE: 0.0500 seconds) - 239: 0.3473 (100000 repetitions, Perl: 0.1440 seconds, CL-PPCRE: 0.0500 seconds) - 240: 0.3362 (1000000 repetitions, Perl: 0.6246 seconds, CL-PPCRE: 0.2100 seconds) - 241: 0.9108 (100000 repetitions, Perl: 0.1427 seconds, CL-PPCRE: 0.1300 seconds) - 242: 0.8320 (100000 repetitions, Perl: 0.1442 seconds, CL-PPCRE: 0.1200 seconds) - 243: 0.9578 (100000 repetitions, Perl: 0.1462 seconds, CL-PPCRE: 0.1400 seconds) - 244: 0.9571 (100000 repetitions, Perl: 0.1463 seconds, CL-PPCRE: 0.1400 seconds) - 245: 1.3241 (100000 repetitions, Perl: 0.1133 seconds, CL-PPCRE: 0.1500 seconds) - 246: 0.8377 (100000 repetitions, Perl: 0.1433 seconds, CL-PPCRE: 0.1200 seconds) - 247: 0.8486 (100000 repetitions, Perl: 0.1414 seconds, CL-PPCRE: 0.1200 seconds) - 248: 0.8450 (100000 repetitions, Perl: 0.1420 seconds, CL-PPCRE: 0.1200 seconds) - 249: 0.8369 (100000 repetitions, Perl: 0.1434 seconds, CL-PPCRE: 0.1200 seconds) - 250: 0.8463 (100000 repetitions, Perl: 0.1418 seconds, CL-PPCRE: 0.1200 seconds) - 251: 0.6517 (100000 repetitions, Perl: 0.2762 seconds, CL-PPCRE: 0.1800 seconds) - 252: 0.6811 (100000 repetitions, Perl: 0.2937 seconds, CL-PPCRE: 0.2000 seconds) - 253: 0.6578 (100000 repetitions, Perl: 0.1824 seconds, CL-PPCRE: 0.1200 seconds) - 254: 0.8682 (100000 repetitions, Perl: 0.3571 seconds, CL-PPCRE: 0.3100 seconds) - 255: 0.7904 (100000 repetitions, Perl: 0.4175 seconds, CL-PPCRE: 0.3300 seconds) - 256: 0.8379 (100000 repetitions, Perl: 0.2745 seconds, CL-PPCRE: 0.2300 seconds) - 257: 0.7974 (100000 repetitions, Perl: 0.3010 seconds, CL-PPCRE: 0.2400 seconds) - 258: 0.8064 (100000 repetitions, Perl: 0.2852 seconds, CL-PPCRE: 0.2300 seconds) - 259: 0.7055 (100000 repetitions, Perl: 0.2977 seconds, CL-PPCRE: 0.2100 seconds) - 260: 0.8818 (100000 repetitions, Perl: 0.3515 seconds, CL-PPCRE: 0.3100 seconds) - 261: 0.8762 (100000 repetitions, Perl: 0.3652 seconds, CL-PPCRE: 0.3200 seconds) - 262: 0.8611 (100000 repetitions, Perl: 0.3020 seconds, CL-PPCRE: 0.2600 seconds) - 263: 0.5267 (100000 repetitions, Perl: 0.1519 seconds, CL-PPCRE: 0.0800 seconds) - 264: 0.5322 (100000 repetitions, Perl: 0.1503 seconds, CL-PPCRE: 0.0800 seconds) - 265: 0.9607 (100000 repetitions, Perl: 0.3123 seconds, CL-PPCRE: 0.3000 seconds) - 266: 0.4526 (100000 repetitions, Perl: 0.2872 seconds, CL-PPCRE: 0.1300 seconds) - 267: 0.6699 (100000 repetitions, Perl: 0.5673 seconds, CL-PPCRE: 0.3800 seconds) - 268: 0.5854 (100000 repetitions, Perl: 0.2221 seconds, CL-PPCRE: 0.1300 seconds) - 269: 0.5397 (100000 repetitions, Perl: 0.2223 seconds, CL-PPCRE: 0.1200 seconds) - 270: 0.5484 (100000 repetitions, Perl: 0.2188 seconds, CL-PPCRE: 0.1200 seconds) - 271: 0.4907 (100000 repetitions, Perl: 0.1834 seconds, CL-PPCRE: 0.0900 seconds) - 272: 0.5724 (100000 repetitions, Perl: 0.1922 seconds, CL-PPCRE: 0.1100 seconds) - 273: 0.4339 (100000 repetitions, Perl: 0.1383 seconds, CL-PPCRE: 0.0600 seconds) - 274: 0.4306 (100000 repetitions, Perl: 0.1394 seconds, CL-PPCRE: 0.0600 seconds) - 275: 0.2869 (100000 repetitions, Perl: 0.1743 seconds, CL-PPCRE: 0.0500 seconds) - 276: 0.4362 (100000 repetitions, Perl: 0.1376 seconds, CL-PPCRE: 0.0600 seconds) - 277: 0.7754 (100000 repetitions, Perl: 0.2321 seconds, CL-PPCRE: 0.1800 seconds) - 278: 0.7791 (100000 repetitions, Perl: 0.2310 seconds, CL-PPCRE: 0.1800 seconds) - 279: 0.7789 (100000 repetitions, Perl: 0.2311 seconds, CL-PPCRE: 0.1800 seconds) - 280: 0.7811 (100000 repetitions, Perl: 0.2305 seconds, CL-PPCRE: 0.1800 seconds) - 281: 0.2450 (100000 repetitions, Perl: 0.2040 seconds, CL-PPCRE: 0.0500 seconds) - 282: 0.2661 (100000 repetitions, Perl: 0.1503 seconds, CL-PPCRE: 0.0400 seconds) - 283: 0.2589 (100000 repetitions, Perl: 0.1931 seconds, CL-PPCRE: 0.0500 seconds) - 284: 0.3521 (100000 repetitions, Perl: 0.1420 seconds, CL-PPCRE: 0.0500 seconds) - 285: 0.3907 (100000 repetitions, Perl: 0.1791 seconds, CL-PPCRE: 0.0700 seconds) - 286: 0.4476 (100000 repetitions, Perl: 0.1787 seconds, CL-PPCRE: 0.0800 seconds) - 287: 0.4616 (100000 repetitions, Perl: 0.1733 seconds, CL-PPCRE: 0.0800 seconds) - 288: 0.4378 (100000 repetitions, Perl: 0.1827 seconds, CL-PPCRE: 0.0800 seconds) - 289: 0.6693 (10000 repetitions, Perl: 0.1643 seconds, CL-PPCRE: 0.1100 seconds) - 290: 0.6433 (100000 repetitions, Perl: 0.9328 seconds, CL-PPCRE: 0.6000 seconds) - 291: 0.5793 (100000 repetitions, Perl: 0.7940 seconds, CL-PPCRE: 0.4600 seconds) - 292: 0.6398 (10000 repetitions, Perl: 0.2657 seconds, CL-PPCRE: 0.1700 seconds) - 293: 0.7511 (10000 repetitions, Perl: 0.3062 seconds, CL-PPCRE: 0.2300 seconds) - 294: 0.7114 (10000 repetitions, Perl: 0.2249 seconds, CL-PPCRE: 0.1600 seconds) - 295: 0.8033 (1000 repetitions, Perl: 0.2739 seconds, CL-PPCRE: 0.2200 seconds) - 296: 0.6041 (1000 repetitions, Perl: 0.1655 seconds, CL-PPCRE: 0.1000 seconds) - 297: 0.8512 (10000 repetitions, Perl: 0.1175 seconds, CL-PPCRE: 0.1000 seconds) - 298: 0.6747 (100000 repetitions, Perl: 0.7707 seconds, CL-PPCRE: 0.5200 seconds) - 299: 0.6291 (100000 repetitions, Perl: 0.6359 seconds, CL-PPCRE: 0.4000 seconds) - 300: 0.7881 (10000 repetitions, Perl: 0.1650 seconds, CL-PPCRE: 0.1300 seconds) - 301: 0.8624 (10000 repetitions, Perl: 0.2087 seconds, CL-PPCRE: 0.1800 seconds) - 302: 1.6513 (100000 repetitions, Perl: 0.7509 seconds, CL-PPCRE: 1.2400 seconds) - 303: 0.8539 (1000 repetitions, Perl: 0.2342 seconds, CL-PPCRE: 0.2000 seconds) - 304: 0.5071 (1000 repetitions, Perl: 0.1578 seconds, CL-PPCRE: 0.0800 seconds) - 305: 0.2994 (100000 repetitions, Perl: 0.2004 seconds, CL-PPCRE: 0.0600 seconds) - 306: 0.3442 (100000 repetitions, Perl: 0.2034 seconds, CL-PPCRE: 0.0700 seconds) - 307: 0.3386 (100000 repetitions, Perl: 0.2067 seconds, CL-PPCRE: 0.0700 seconds) - 308: 0.4439 (100000 repetitions, Perl: 0.2027 seconds, CL-PPCRE: 0.0900 seconds) - 309: 0.2541 (100000 repetitions, Perl: 0.1181 seconds, CL-PPCRE: 0.0300 seconds) - 310: 0.2507 (100000 repetitions, Perl: 0.1197 seconds, CL-PPCRE: 0.0300 seconds) - 311: 0.2546 (100000 repetitions, Perl: 0.1178 seconds, CL-PPCRE: 0.0300 seconds) - 312: 0.3225 (100000 repetitions, Perl: 0.1240 seconds, CL-PPCRE: 0.0400 seconds) - 313: 0.2763 (100000 repetitions, Perl: 0.2171 seconds, CL-PPCRE: 0.0600 seconds) - 314: 0.3364 (100000 repetitions, Perl: 0.2081 seconds, CL-PPCRE: 0.0700 seconds) - 315: 0.5995 (1000000 repetitions, Perl: 0.6171 seconds, CL-PPCRE: 0.3700 seconds) - 316: 0.6933 (100000 repetitions, Perl: 0.1010 seconds, CL-PPCRE: 0.0700 seconds) - 317: 0.7320 (100000 repetitions, Perl: 0.1639 seconds, CL-PPCRE: 0.1200 seconds) - 318: 0.6441 (100000 repetitions, Perl: 0.1708 seconds, CL-PPCRE: 0.1100 seconds) - 319: 0.7726 (100000 repetitions, Perl: 0.1553 seconds, CL-PPCRE: 0.1200 seconds) - 320: 0.2550 (100000 repetitions, Perl: 0.1176 seconds, CL-PPCRE: 0.0300 seconds) - 321: 0.2523 (100000 repetitions, Perl: 0.1189 seconds, CL-PPCRE: 0.0300 seconds) - 322: 0.3355 (100000 repetitions, Perl: 0.1192 seconds, CL-PPCRE: 0.0400 seconds) - 323: 0.2535 (100000 repetitions, Perl: 0.1184 seconds, CL-PPCRE: 0.0300 seconds) - 324: 0.2537 (100000 repetitions, Perl: 0.1182 seconds, CL-PPCRE: 0.0300 seconds) - 325: 0.3130 (1000000 repetitions, Perl: 0.8945 seconds, CL-PPCRE: 0.2800 seconds) - 326: 0.4343 (100000 repetitions, Perl: 0.1381 seconds, CL-PPCRE: 0.0600 seconds) - 327: 0.4595 (100000 repetitions, Perl: 0.1959 seconds, CL-PPCRE: 0.0900 seconds) - 328: 0.5075 (100000 repetitions, Perl: 0.2562 seconds, CL-PPCRE: 0.1300 seconds) - 329: 0.4848 (100000 repetitions, Perl: 0.2063 seconds, CL-PPCRE: 0.1000 seconds) - 330: 0.5754 (100000 repetitions, Perl: 0.2259 seconds, CL-PPCRE: 0.1300 seconds) - 331: 0.4784 (100000 repetitions, Perl: 0.2090 seconds, CL-PPCRE: 0.1000 seconds) - 332: 0.4854 (100000 repetitions, Perl: 0.2472 seconds, CL-PPCRE: 0.1200 seconds) - 333: 0.5108 (100000 repetitions, Perl: 0.1958 seconds, CL-PPCRE: 0.1000 seconds) - 334: 0.5869 (100000 repetitions, Perl: 0.1874 seconds, CL-PPCRE: 0.1100 seconds) - 335: 0.4115 (100000 repetitions, Perl: 0.1944 seconds, CL-PPCRE: 0.0800 seconds) - 336: 0.4591 (100000 repetitions, Perl: 0.1960 seconds, CL-PPCRE: 0.0900 seconds) - 337: 0.4391 (100000 repetitions, Perl: 0.2050 seconds, CL-PPCRE: 0.0900 seconds) - 338: 0.4906 (100000 repetitions, Perl: 0.2242 seconds, CL-PPCRE: 0.1100 seconds) - 339: 0.6043 (100000 repetitions, Perl: 0.1986 seconds, CL-PPCRE: 0.1200 seconds) - 340: 0.6038 (100000 repetitions, Perl: 0.1988 seconds, CL-PPCRE: 0.1200 seconds) - 341: 0.6465 (100000 repetitions, Perl: 0.2011 seconds, CL-PPCRE: 0.1300 seconds) - 342: 0.7695 (100000 repetitions, Perl: 0.2079 seconds, CL-PPCRE: 0.1600 seconds) - 343: 0.7205 (100000 repetitions, Perl: 0.2221 seconds, CL-PPCRE: 0.1600 seconds) - 344: 0.6924 (100000 repetitions, Perl: 0.2166 seconds, CL-PPCRE: 0.1500 seconds) - 345: 0.6438 (100000 repetitions, Perl: 0.2174 seconds, CL-PPCRE: 0.1400 seconds) - 346: 0.7015 (100000 repetitions, Perl: 0.1996 seconds, CL-PPCRE: 0.1400 seconds) - 347: 0.7526 (100000 repetitions, Perl: 0.1993 seconds, CL-PPCRE: 0.1500 seconds) - 348: 0.8079 (100000 repetitions, Perl: 0.2104 seconds, CL-PPCRE: 0.1700 seconds) - 349: 0.7955 (100000 repetitions, Perl: 0.2514 seconds, CL-PPCRE: 0.2000 seconds) - 350: 0.4692 (100000 repetitions, Perl: 0.1492 seconds, CL-PPCRE: 0.0700 seconds) - 351: 0.4673 (100000 repetitions, Perl: 0.1498 seconds, CL-PPCRE: 0.0700 seconds) - 352: 0.4633 (100000 repetitions, Perl: 0.1511 seconds, CL-PPCRE: 0.0700 seconds) - 353: 0.6346 (1000000 repetitions, Perl: 0.6145 seconds, CL-PPCRE: 0.3900 seconds) - 354: 1.1542 (1000000 repetitions, Perl: 0.9097 seconds, CL-PPCRE: 1.0500 seconds) - 355: 0.4759 (100000 repetitions, Perl: 0.2732 seconds, CL-PPCRE: 0.1300 seconds) - 356: 0.6078 (100000 repetitions, Perl: 0.2303 seconds, CL-PPCRE: 0.1400 seconds) - 357: 0.6025 (100000 repetitions, Perl: 0.2324 seconds, CL-PPCRE: 0.1400 seconds) - 358: 0.3389 (100000 repetitions, Perl: 0.1475 seconds, CL-PPCRE: 0.0500 seconds) - 359: 0.2653 (1000000 repetitions, Perl: 0.9424 seconds, CL-PPCRE: 0.2500 seconds) - 360: 0.3383 (100000 repetitions, Perl: 0.1478 seconds, CL-PPCRE: 0.0500 seconds) - 361: 0.4024 (100000 repetitions, Perl: 0.1491 seconds, CL-PPCRE: 0.0600 seconds) - 362: 0.3396 (100000 repetitions, Perl: 0.1472 seconds, CL-PPCRE: 0.0500 seconds) - 363: 0.4028 (100000 repetitions, Perl: 0.1489 seconds, CL-PPCRE: 0.0600 seconds) - 364: 0.2647 (100000 repetitions, Perl: 0.1511 seconds, CL-PPCRE: 0.0400 seconds) - 365: 0.3107 (100000 repetitions, Perl: 0.1609 seconds, CL-PPCRE: 0.0500 seconds) - 366: 0.3260 (100000 repetitions, Perl: 0.1534 seconds, CL-PPCRE: 0.0500 seconds) - 367: 0.3047 (100000 repetitions, Perl: 0.1641 seconds, CL-PPCRE: 0.0500 seconds) - 368: 0.4269 (100000 repetitions, Perl: 0.1405 seconds, CL-PPCRE: 0.0600 seconds) - 369: 0.6208 (1000000 repetitions, Perl: 0.7249 seconds, CL-PPCRE: 0.4500 seconds) - 370: 0.7444 (1000000 repetitions, Perl: 0.7254 seconds, CL-PPCRE: 0.5400 seconds) - 371: 0.6080 (1000000 repetitions, Perl: 0.7237 seconds, CL-PPCRE: 0.4400 seconds) - 372: 0.4148 (100000 repetitions, Perl: 0.1446 seconds, CL-PPCRE: 0.0600 seconds) - 373: 0.3998 (100000 repetitions, Perl: 0.1501 seconds, CL-PPCRE: 0.0600 seconds) - 374: 0.5947 (1000000 repetitions, Perl: 0.7903 seconds, CL-PPCRE: 0.4700 seconds) - 375: 0.6556 (1000000 repetitions, Perl: 0.7932 seconds, CL-PPCRE: 0.5200 seconds) - 376: 0.5811 (1000000 repetitions, Perl: 0.7916 seconds, CL-PPCRE: 0.4600 seconds) - 377: 0.5095 (100000 repetitions, Perl: 0.1374 seconds, CL-PPCRE: 0.0700 seconds) - 378: 0.7533 (100000 repetitions, Perl: 0.1327 seconds, CL-PPCRE: 0.1000 seconds) - 379: 0.2212 (100000 repetitions, Perl: 0.1356 seconds, CL-PPCRE: 0.0300 seconds) - 380: 0.2732 (100000 repetitions, Perl: 0.1830 seconds, CL-PPCRE: 0.0500 seconds) - 381: 0.3535 (100000 repetitions, Perl: 0.1414 seconds, CL-PPCRE: 0.0500 seconds) - 382: 0.3386 (1000000 repetitions, Perl: 0.7974 seconds, CL-PPCRE: 0.2700 seconds) - 383: 0.3481 (100000 repetitions, Perl: 0.1436 seconds, CL-PPCRE: 0.0500 seconds) - 384: 0.3376 (1000000 repetitions, Perl: 0.7998 seconds, CL-PPCRE: 0.2700 seconds) - 385: 0.2810 (100000 repetitions, Perl: 0.1424 seconds, CL-PPCRE: 0.0400 seconds) - 386: 0.3465 (1000000 repetitions, Perl: 0.8081 seconds, CL-PPCRE: 0.2800 seconds) - 387: 0.2732 (100000 repetitions, Perl: 0.1464 seconds, CL-PPCRE: 0.0400 seconds) - 388: 0.2781 (100000 repetitions, Perl: 0.1438 seconds, CL-PPCRE: 0.0400 seconds) - 389: 0.4344 (1000000 repetitions, Perl: 0.8288 seconds, CL-PPCRE: 0.3600 seconds) - 390: 0.3457 (100000 repetitions, Perl: 0.1446 seconds, CL-PPCRE: 0.0500 seconds) - 391: 0.5038 (1000000 repetitions, Perl: 0.8337 seconds, CL-PPCRE: 0.4200 seconds) - 392: 0.2577 (100000 repetitions, Perl: 0.1552 seconds, CL-PPCRE: 0.0400 seconds) - 393: 0.2542 (100000 repetitions, Perl: 0.1573 seconds, CL-PPCRE: 0.0400 seconds) - 394: 0.4403 (1000000 repetitions, Perl: 0.7722 seconds, CL-PPCRE: 0.3400 seconds) - 395: 0.5672 (100000 repetitions, Perl: 0.1587 seconds, CL-PPCRE: 0.0900 seconds) - 396: 0.6214 (100000 repetitions, Perl: 0.1609 seconds, CL-PPCRE: 0.1000 seconds) - 397: 0.5460 (100000 repetitions, Perl: 0.1648 seconds, CL-PPCRE: 0.0900 seconds) - 398: 0.2812 (100000 repetitions, Perl: 0.1778 seconds, CL-PPCRE: 0.0500 seconds) - 399: 0.2775 (100000 repetitions, Perl: 0.1802 seconds, CL-PPCRE: 0.0500 seconds) - 400: 0.3287 (100000 repetitions, Perl: 0.1825 seconds, CL-PPCRE: 0.0600 seconds) - 401: 0.2684 (100000 repetitions, Perl: 0.1863 seconds, CL-PPCRE: 0.0500 seconds) - 402: 0.4942 (100000 repetitions, Perl: 0.1416 seconds, CL-PPCRE: 0.0700 seconds) - 403: 0.5378 (100000 repetitions, Perl: 0.1116 seconds, CL-PPCRE: 0.0600 seconds) - 404: 0.2952 (100000 repetitions, Perl: 0.1694 seconds, CL-PPCRE: 0.0500 seconds) - 405: 0.2887 (100000 repetitions, Perl: 0.1732 seconds, CL-PPCRE: 0.0500 seconds) - 406: 0.6374 (1000000 repetitions, Perl: 0.7844 seconds, CL-PPCRE: 0.5000 seconds) - 407: 0.4260 (100000 repetitions, Perl: 0.1878 seconds, CL-PPCRE: 0.0800 seconds) - 408: 0.4368 (100000 repetitions, Perl: 0.1832 seconds, CL-PPCRE: 0.0800 seconds) - 409: 0.4269 (100000 repetitions, Perl: 0.1874 seconds, CL-PPCRE: 0.0800 seconds) - 410: 0.3848 (100000 repetitions, Perl: 0.1819 seconds, CL-PPCRE: 0.0700 seconds) - 411: 0.4387 (100000 repetitions, Perl: 0.1824 seconds, CL-PPCRE: 0.0800 seconds) - 412: 0.4306 (100000 repetitions, Perl: 0.1858 seconds, CL-PPCRE: 0.0800 seconds) - 413: 0.4817 (100000 repetitions, Perl: 0.1868 seconds, CL-PPCRE: 0.0900 seconds) - 414: 0.4738 (100000 repetitions, Perl: 0.1900 seconds, CL-PPCRE: 0.0900 seconds) - 415: 0.4302 (100000 repetitions, Perl: 0.1860 seconds, CL-PPCRE: 0.0800 seconds) - 416: 0.4258 (100000 repetitions, Perl: 0.1879 seconds, CL-PPCRE: 0.0800 seconds) - 417: 0.4302 (100000 repetitions, Perl: 0.1860 seconds, CL-PPCRE: 0.0800 seconds) - 418: 0.2241 (100000 repetitions, Perl: 0.1785 seconds, CL-PPCRE: 0.0400 seconds) - 419: 0.2783 (100000 repetitions, Perl: 0.1796 seconds, CL-PPCRE: 0.0500 seconds) - 420: 0.2807 (100000 repetitions, Perl: 0.1781 seconds, CL-PPCRE: 0.0500 seconds) - 421: 0.2787 (100000 repetitions, Perl: 0.1794 seconds, CL-PPCRE: 0.0500 seconds) - 422: 0.7300 (100000 repetitions, Perl: 0.3425 seconds, CL-PPCRE: 0.2500 seconds) - 423: 0.8544 (100000 repetitions, Perl: 0.3160 seconds, CL-PPCRE: 0.2700 seconds) - 424: 0.2787 (100000 repetitions, Perl: 0.1794 seconds, CL-PPCRE: 0.0500 seconds) - 425: 0.2306 (100000 repetitions, Perl: 0.1734 seconds, CL-PPCRE: 0.0400 seconds) - 426: 0.3410 (100000 repetitions, Perl: 0.2053 seconds, CL-PPCRE: 0.0700 seconds) - 427: 0.2799 (100000 repetitions, Perl: 0.1786 seconds, CL-PPCRE: 0.0500 seconds) - 428: 0.2829 (100000 repetitions, Perl: 0.1767 seconds, CL-PPCRE: 0.0500 seconds) - 429: 0.4273 (100000 repetitions, Perl: 0.1872 seconds, CL-PPCRE: 0.0800 seconds) - 431: 0.6052 (100000 repetitions, Perl: 0.1983 seconds, CL-PPCRE: 0.1200 seconds) - 432: 0.6033 (100000 repetitions, Perl: 0.1989 seconds, CL-PPCRE: 0.1200 seconds) - 433: 0.6306 (100000 repetitions, Perl: 0.2220 seconds, CL-PPCRE: 0.1400 seconds) - 434: 0.6084 (100000 repetitions, Perl: 0.1972 seconds, CL-PPCRE: 0.1200 seconds) - 435: 0.7267 (1000000 repetitions, Perl: 0.9632 seconds, CL-PPCRE: 0.7000 seconds) - 436: 0.9658 (1000000 repetitions, Perl: 0.6316 seconds, CL-PPCRE: 0.6100 seconds) - 437: 0.7902 (100000 repetitions, Perl: 0.1519 seconds, CL-PPCRE: 0.1200 seconds) - 438: 0.2423 (100000 repetitions, Perl: 0.1238 seconds, CL-PPCRE: 0.0300 seconds) - 439: 0.3170 (100000 repetitions, Perl: 0.1262 seconds, CL-PPCRE: 0.0400 seconds) - 440: 0.2741 (100000 repetitions, Perl: 0.1459 seconds, CL-PPCRE: 0.0400 seconds) - 441: 0.4055 (100000 repetitions, Perl: 0.1480 seconds, CL-PPCRE: 0.0600 seconds) - 442: 0.2719 (100000 repetitions, Perl: 0.1471 seconds, CL-PPCRE: 0.0400 seconds) - 443: 0.2952 (100000 repetitions, Perl: 0.1355 seconds, CL-PPCRE: 0.0400 seconds) - 444: 0.3922 (1000000 repetitions, Perl: 0.8924 seconds, CL-PPCRE: 0.3500 seconds) - 445: 0.2694 (100000 repetitions, Perl: 0.1485 seconds, CL-PPCRE: 0.0400 seconds) - 446: 0.2717 (100000 repetitions, Perl: 0.1472 seconds, CL-PPCRE: 0.0400 seconds) - 447: 0.2136 (100000 repetitions, Perl: 0.1872 seconds, CL-PPCRE: 0.0400 seconds) - 448: 0.2401 (100000 repetitions, Perl: 0.1249 seconds, CL-PPCRE: 0.0300 seconds) - 449: 0.2930 (100000 repetitions, Perl: 0.1024 seconds, CL-PPCRE: 0.0300 seconds) - 450: 0.2929 (100000 repetitions, Perl: 0.1024 seconds, CL-PPCRE: 0.0300 seconds) - 451: 0.2989 (100000 repetitions, Perl: 0.2007 seconds, CL-PPCRE: 0.0600 seconds) - 452: 0.3008 (100000 repetitions, Perl: 0.1995 seconds, CL-PPCRE: 0.0600 seconds) - 453: 0.3715 (100000 repetitions, Perl: 0.2153 seconds, CL-PPCRE: 0.0800 seconds) - 454: 0.4187 (1000000 repetitions, Perl: 0.8120 seconds, CL-PPCRE: 0.3400 seconds) - 455: 0.7238 (100000 repetitions, Perl: 0.3039 seconds, CL-PPCRE: 0.2200 seconds) - 456: 0.7574 (100000 repetitions, Perl: 0.3301 seconds, CL-PPCRE: 0.2500 seconds) - 457: 0.9668 (100000 repetitions, Perl: 0.6309 seconds, CL-PPCRE: 0.6100 seconds) - 458: 0.3100 (100000 repetitions, Perl: 0.1290 seconds, CL-PPCRE: 0.0400 seconds) - 459: 0.3207 (100000 repetitions, Perl: 0.1247 seconds, CL-PPCRE: 0.0400 seconds) - 460: 0.3861 (100000 repetitions, Perl: 0.1295 seconds, CL-PPCRE: 0.0500 seconds) - 461: 0.3780 (100000 repetitions, Perl: 0.1323 seconds, CL-PPCRE: 0.0500 seconds) - 462: 0.3066 (100000 repetitions, Perl: 0.1305 seconds, CL-PPCRE: 0.0400 seconds) - 463: 0.3195 (100000 repetitions, Perl: 0.1252 seconds, CL-PPCRE: 0.0400 seconds) - 464: 0.4669 (100000 repetitions, Perl: 0.1285 seconds, CL-PPCRE: 0.0600 seconds) - 465: 0.4623 (100000 repetitions, Perl: 0.1298 seconds, CL-PPCRE: 0.0600 seconds) - 466: 0.4711 (100000 repetitions, Perl: 0.6580 seconds, CL-PPCRE: 0.3100 seconds) - 467: 0.3991 (100000 repetitions, Perl: 0.2756 seconds, CL-PPCRE: 0.1100 seconds) - 468: 0.4139 (100000 repetitions, Perl: 0.2657 seconds, CL-PPCRE: 0.1100 seconds) - 469: 0.5015 (100000 repetitions, Perl: 0.2193 seconds, CL-PPCRE: 0.1100 seconds) - 470: 0.4581 (100000 repetitions, Perl: 0.2183 seconds, CL-PPCRE: 0.1000 seconds) - 471: 0.3853 (100000 repetitions, Perl: 0.2336 seconds, CL-PPCRE: 0.0900 seconds) - 472: 0.5455 (100000 repetitions, Perl: 0.2200 seconds, CL-PPCRE: 0.1200 seconds) - 473: 0.5154 (100000 repetitions, Perl: 0.2522 seconds, CL-PPCRE: 0.1300 seconds) - 474: 0.6171 (100000 repetitions, Perl: 0.1945 seconds, CL-PPCRE: 0.1200 seconds) - 475: 0.3168 (100000 repetitions, Perl: 0.1578 seconds, CL-PPCRE: 0.0500 seconds) - 476: 0.5424 (100000 repetitions, Perl: 0.4241 seconds, CL-PPCRE: 0.2300 seconds) - 477: 0.4988 (100000 repetitions, Perl: 0.3007 seconds, CL-PPCRE: 0.1500 seconds) - 478: 0.6218 (100000 repetitions, Perl: 0.4342 seconds, CL-PPCRE: 0.2700 seconds) - 479: 0.5608 (100000 repetitions, Perl: 0.1605 seconds, CL-PPCRE: 0.0900 seconds) - 480: 0.5581 (100000 repetitions, Perl: 0.1792 seconds, CL-PPCRE: 0.1000 seconds) - 481: 0.5284 (100000 repetitions, Perl: 0.1514 seconds, CL-PPCRE: 0.0800 seconds) - 482: 0.5586 (100000 repetitions, Perl: 0.3222 seconds, CL-PPCRE: 0.1800 seconds) - 483: 0.4873 (100000 repetitions, Perl: 0.2052 seconds, CL-PPCRE: 0.1000 seconds) - 484: 0.5479 (100000 repetitions, Perl: 0.6388 seconds, CL-PPCRE: 0.3500 seconds) - 485: 0.5229 (100000 repetitions, Perl: 0.2869 seconds, CL-PPCRE: 0.1500 seconds) - 486: 0.5340 (100000 repetitions, Perl: 0.2247 seconds, CL-PPCRE: 0.1200 seconds) - 487: 0.3397 (100000 repetitions, Perl: 0.1766 seconds, CL-PPCRE: 0.0600 seconds) - 488: 0.4438 (100000 repetitions, Perl: 0.1803 seconds, CL-PPCRE: 0.0800 seconds) - 489: 0.5042 (100000 repetitions, Perl: 0.1983 seconds, CL-PPCRE: 0.1000 seconds) - 490: 0.2714 (100000 repetitions, Perl: 0.1474 seconds, CL-PPCRE: 0.0400 seconds) - 491: 0.2673 (100000 repetitions, Perl: 0.1497 seconds, CL-PPCRE: 0.0400 seconds) - 492: 0.3556 (1000000 repetitions, Perl: 0.7312 seconds, CL-PPCRE: 0.2600 seconds) - 493: 0.3586 (1000000 repetitions, Perl: 0.7250 seconds, CL-PPCRE: 0.2600 seconds) - 494: 0.3417 (1000000 repetitions, Perl: 0.6145 seconds, CL-PPCRE: 0.2100 seconds) - 495: 0.4060 (1000000 repetitions, Perl: 0.7390 seconds, CL-PPCRE: 0.3000 seconds) - 496: 0.3838 (1000000 repetitions, Perl: 0.7296 seconds, CL-PPCRE: 0.2800 seconds) - 497: 0.3394 (100000 repetitions, Perl: 0.1179 seconds, CL-PPCRE: 0.0400 seconds) - 498: 0.2507 (100000 repetitions, Perl: 0.1196 seconds, CL-PPCRE: 0.0300 seconds) - 499: 0.2521 (100000 repetitions, Perl: 0.1190 seconds, CL-PPCRE: 0.0300 seconds) - 500: 0.2512 (100000 repetitions, Perl: 0.1194 seconds, CL-PPCRE: 0.0300 seconds) - 501: 0.3337 (100000 repetitions, Perl: 0.1199 seconds, CL-PPCRE: 0.0400 seconds) - 502: 0.3380 (100000 repetitions, Perl: 0.1183 seconds, CL-PPCRE: 0.0400 seconds) - 503: 0.3385 (100000 repetitions, Perl: 0.1182 seconds, CL-PPCRE: 0.0400 seconds) - 504: 0.3383 (100000 repetitions, Perl: 0.1182 seconds, CL-PPCRE: 0.0400 seconds) - 505: 0.2934 (1000000 repetitions, Perl: 0.9203 seconds, CL-PPCRE: 0.2700 seconds) - 506: 0.3109 (1000000 repetitions, Perl: 0.9005 seconds, CL-PPCRE: 0.2800 seconds) - 507: 0.3253 (100000 repetitions, Perl: 0.1845 seconds, CL-PPCRE: 0.0600 seconds) - 508: 0.6707 (100000 repetitions, Perl: 0.6709 seconds, CL-PPCRE: 0.4500 seconds) - 509: 0.8568 (1000000 repetitions, Perl: 0.8753 seconds, CL-PPCRE: 0.7500 seconds) - 510: 1.0720 (100000 repetitions, Perl: 0.1119 seconds, CL-PPCRE: 0.1200 seconds) - 511: 0.3961 (100000 repetitions, Perl: 0.1262 seconds, CL-PPCRE: 0.0500 seconds) - 512: 0.3948 (100000 repetitions, Perl: 0.1266 seconds, CL-PPCRE: 0.0500 seconds) - 513: 0.3915 (100000 repetitions, Perl: 0.1277 seconds, CL-PPCRE: 0.0500 seconds) - 514: 0.5436 (100000 repetitions, Perl: 0.1288 seconds, CL-PPCRE: 0.0700 seconds) - 515: 0.5481 (100000 repetitions, Perl: 0.1277 seconds, CL-PPCRE: 0.0700 seconds) - 516: 0.4678 (100000 repetitions, Perl: 0.1283 seconds, CL-PPCRE: 0.0600 seconds) - 517: 0.5499 (100000 repetitions, Perl: 0.1273 seconds, CL-PPCRE: 0.0700 seconds) - 518: 0.6267 (100000 repetitions, Perl: 0.1277 seconds, CL-PPCRE: 0.0800 seconds) - 519: 0.5435 (100000 repetitions, Perl: 0.1288 seconds, CL-PPCRE: 0.0700 seconds) - 520: 0.5474 (100000 repetitions, Perl: 0.1279 seconds, CL-PPCRE: 0.0700 seconds) - 521: 0.6194 (100000 repetitions, Perl: 0.1292 seconds, CL-PPCRE: 0.0800 seconds) - 522: 0.6198 (100000 repetitions, Perl: 0.1291 seconds, CL-PPCRE: 0.0800 seconds) - 523: 0.5402 (100000 repetitions, Perl: 0.1296 seconds, CL-PPCRE: 0.0700 seconds) - 524: 0.5440 (100000 repetitions, Perl: 0.1287 seconds, CL-PPCRE: 0.0700 seconds) - 525: 0.6254 (100000 repetitions, Perl: 0.1279 seconds, CL-PPCRE: 0.0800 seconds) - 526: 0.6277 (100000 repetitions, Perl: 0.1274 seconds, CL-PPCRE: 0.0800 seconds) - 527: 0.5386 (100000 repetitions, Perl: 0.1300 seconds, CL-PPCRE: 0.0700 seconds) - 528: 0.5282 (100000 repetitions, Perl: 0.1325 seconds, CL-PPCRE: 0.0700 seconds) - 529: 1.0026 (1000000 repetitions, Perl: 0.7181 seconds, CL-PPCRE: 0.7200 seconds) - 530: 0.5673 (100000 repetitions, Perl: 0.1587 seconds, CL-PPCRE: 0.0900 seconds) - 531: 0.5812 (100000 repetitions, Perl: 0.1549 seconds, CL-PPCRE: 0.0900 seconds) - 532: 0.6859 (1000000 repetitions, Perl: 0.7436 seconds, CL-PPCRE: 0.5100 seconds) - 533: 0.5101 (100000 repetitions, Perl: 0.1568 seconds, CL-PPCRE: 0.0800 seconds) - 534: 0.4462 (100000 repetitions, Perl: 0.1569 seconds, CL-PPCRE: 0.0700 seconds) - 535: 0.7151 (1000000 repetitions, Perl: 0.7132 seconds, CL-PPCRE: 0.5100 seconds) - 536: 0.5707 (100000 repetitions, Perl: 0.1577 seconds, CL-PPCRE: 0.0900 seconds) - 537: 0.5677 (100000 repetitions, Perl: 0.1585 seconds, CL-PPCRE: 0.0900 seconds) - 538: 0.5097 (100000 repetitions, Perl: 0.1570 seconds, CL-PPCRE: 0.0800 seconds) - 539: 0.6915 (1000000 repetitions, Perl: 0.7375 seconds, CL-PPCRE: 0.5100 seconds) - 540: 0.5089 (100000 repetitions, Perl: 0.1572 seconds, CL-PPCRE: 0.0800 seconds) - 541: 0.5087 (100000 repetitions, Perl: 0.1573 seconds, CL-PPCRE: 0.0800 seconds) - 542: 0.4399 (100000 repetitions, Perl: 0.1591 seconds, CL-PPCRE: 0.0700 seconds) - 543: 0.4417 (100000 repetitions, Perl: 0.1585 seconds, CL-PPCRE: 0.0700 seconds) - 544: 0.8613 (100000 repetitions, Perl: 0.1741 seconds, CL-PPCRE: 0.1500 seconds) - 545: 0.4573 (100000 repetitions, Perl: 0.2843 seconds, CL-PPCRE: 0.1300 seconds) - 546: 0.7665 (100000 repetitions, Perl: 0.1827 seconds, CL-PPCRE: 0.1400 seconds) - 547: 0.5560 (100000 repetitions, Perl: 0.1439 seconds, CL-PPCRE: 0.0800 seconds) - 548: 0.5507 (100000 repetitions, Perl: 0.1453 seconds, CL-PPCRE: 0.0800 seconds) - 549: 0.6166 (100000 repetitions, Perl: 0.1946 seconds, CL-PPCRE: 0.1200 seconds) - 550: 0.2937 (100000 repetitions, Perl: 0.1362 seconds, CL-PPCRE: 0.0400 seconds) - 551: 0.3012 (100000 repetitions, Perl: 0.1328 seconds, CL-PPCRE: 0.0400 seconds) - 552: 0.2268 (100000 repetitions, Perl: 0.1323 seconds, CL-PPCRE: 0.0300 seconds) - 553: 0.6824 (100000 repetitions, Perl: 0.1905 seconds, CL-PPCRE: 0.1300 seconds) - 554: 0.2956 (100000 repetitions, Perl: 0.1353 seconds, CL-PPCRE: 0.0400 seconds) - 555: 0.2234 (100000 repetitions, Perl: 0.1343 seconds, CL-PPCRE: 0.0300 seconds) - 556: 0.2264 (100000 repetitions, Perl: 0.1325 seconds, CL-PPCRE: 0.0300 seconds) - 557: 0.6351 (100000 repetitions, Perl: 0.4409 seconds, CL-PPCRE: 0.2800 seconds) - 558: 0.5139 (100000 repetitions, Perl: 0.1751 seconds, CL-PPCRE: 0.0900 seconds) - 559: 0.6258 (100000 repetitions, Perl: 0.5274 seconds, CL-PPCRE: 0.3300 seconds) - 560: 0.6464 (100000 repetitions, Perl: 0.4487 seconds, CL-PPCRE: 0.2900 seconds) - 561: 0.5391 (100000 repetitions, Perl: 0.1855 seconds, CL-PPCRE: 0.1000 seconds) - 562: 0.6338 (100000 repetitions, Perl: 0.4576 seconds, CL-PPCRE: 0.2900 seconds) - 563: 0.4424 (100000 repetitions, Perl: 0.1582 seconds, CL-PPCRE: 0.0700 seconds) - 564: 0.4890 (100000 repetitions, Perl: 0.1840 seconds, CL-PPCRE: 0.0900 seconds) - 565: 0.6256 (100000 repetitions, Perl: 0.5435 seconds, CL-PPCRE: 0.3400 seconds) - 566: 0.4351 (100000 repetitions, Perl: 0.1609 seconds, CL-PPCRE: 0.0700 seconds) - 567: 0.4919 (100000 repetitions, Perl: 0.1830 seconds, CL-PPCRE: 0.0900 seconds) - 568: 0.6910 (100000 repetitions, Perl: 0.4631 seconds, CL-PPCRE: 0.3200 seconds) - 569: 0.4384 (100000 repetitions, Perl: 0.1597 seconds, CL-PPCRE: 0.0700 seconds) - 570: 0.4962 (100000 repetitions, Perl: 0.1814 seconds, CL-PPCRE: 0.0900 seconds) - 571: 0.6262 (100000 repetitions, Perl: 0.5429 seconds, CL-PPCRE: 0.3400 seconds) - 572: 0.3394 (100000 repetitions, Perl: 0.1473 seconds, CL-PPCRE: 0.0500 seconds) - 573: 0.3720 (100000 repetitions, Perl: 0.1613 seconds, CL-PPCRE: 0.0600 seconds) - 574: 0.5290 (100000 repetitions, Perl: 0.4915 seconds, CL-PPCRE: 0.2600 seconds) - 575: 0.5686 (100000 repetitions, Perl: 0.1055 seconds, CL-PPCRE: 0.0600 seconds) - 576: 0.2902 (100000 repetitions, Perl: 0.1378 seconds, CL-PPCRE: 0.0400 seconds) - 577: 0.3304 (100000 repetitions, Perl: 0.2421 seconds, CL-PPCRE: 0.0800 seconds) - 578: 0.3620 (100000 repetitions, Perl: 0.1381 seconds, CL-PPCRE: 0.0500 seconds) - 579: 0.3452 (100000 repetitions, Perl: 0.1448 seconds, CL-PPCRE: 0.0500 seconds) - 580: 0.2969 (100000 repetitions, Perl: 0.1684 seconds, CL-PPCRE: 0.0500 seconds) - 581: 0.4167 (100000 repetitions, Perl: 0.1440 seconds, CL-PPCRE: 0.0600 seconds) - 582: 0.4219 (100000 repetitions, Perl: 0.1422 seconds, CL-PPCRE: 0.0600 seconds) - 583: 0.4820 (100000 repetitions, Perl: 0.1452 seconds, CL-PPCRE: 0.0700 seconds) - 584: 0.2670 (100000 repetitions, Perl: 0.1498 seconds, CL-PPCRE: 0.0400 seconds) - 585: 0.2672 (100000 repetitions, Perl: 0.1497 seconds, CL-PPCRE: 0.0400 seconds) - 586: 0.8320 (100000 repetitions, Perl: 0.4207 seconds, CL-PPCRE: 0.3500 seconds) - 587: 0.3310 (100000 repetitions, Perl: 0.1208 seconds, CL-PPCRE: 0.0400 seconds) - 588: 0.3001 (1000000 repetitions, Perl: 0.8997 seconds, CL-PPCRE: 0.2700 seconds) - 589: 0.2536 (100000 repetitions, Perl: 0.1972 seconds, CL-PPCRE: 0.0500 seconds) - 590: 0.4693 (1000000 repetitions, Perl: 0.7671 seconds, CL-PPCRE: 0.3600 seconds) - 591: 0.2681 (100000 repetitions, Perl: 0.1865 seconds, CL-PPCRE: 0.0500 seconds) - 592: 0.2581 (100000 repetitions, Perl: 0.1550 seconds, CL-PPCRE: 0.0400 seconds) - 593: 0.4175 (100000 repetitions, Perl: 0.1916 seconds, CL-PPCRE: 0.0800 seconds) - 594: 0.4450 (100000 repetitions, Perl: 0.1573 seconds, CL-PPCRE: 0.0700 seconds) - 595: 0.4296 (100000 repetitions, Perl: 0.1862 seconds, CL-PPCRE: 0.0800 seconds) - 596: 0.4277 (100000 repetitions, Perl: 0.1871 seconds, CL-PPCRE: 0.0800 seconds) - 597: 0.4308 (100000 repetitions, Perl: 0.1857 seconds, CL-PPCRE: 0.0800 seconds) - 598: 0.7786 (1000000 repetitions, Perl: 0.7835 seconds, CL-PPCRE: 0.6100 seconds) - 599: 0.3235 (100000 repetitions, Perl: 0.1854 seconds, CL-PPCRE: 0.0600 seconds) - 600: 0.3302 (100000 repetitions, Perl: 0.1514 seconds, CL-PPCRE: 0.0500 seconds) - 601: 0.3100 (100000 repetitions, Perl: 0.3871 seconds, CL-PPCRE: 0.1200 seconds) - 602: 0.3929 (100000 repetitions, Perl: 0.5853 seconds, CL-PPCRE: 0.2300 seconds) - 603: 0.2478 (100000 repetitions, Perl: 0.1211 seconds, CL-PPCRE: 0.0300 seconds) - 604: 0.3026 (100000 repetitions, Perl: 0.1322 seconds, CL-PPCRE: 0.0400 seconds) - 605: 0.2324 (100000 repetitions, Perl: 0.1291 seconds, CL-PPCRE: 0.0300 seconds) - 606: 0.2566 (100000 repetitions, Perl: 0.1169 seconds, CL-PPCRE: 0.0300 seconds) - 607: 0.7426 (10000 repetitions, Perl: 0.6598 seconds, CL-PPCRE: 0.4900 seconds) - 608: 0.3101 (100000 repetitions, Perl: 0.1612 seconds, CL-PPCRE: 0.0500 seconds) - 609: 0.3097 (100000 repetitions, Perl: 0.1614 seconds, CL-PPCRE: 0.0500 seconds) - 610: 0.3080 (100000 repetitions, Perl: 0.1624 seconds, CL-PPCRE: 0.0500 seconds) - 611: 0.3044 (100000 repetitions, Perl: 0.1314 seconds, CL-PPCRE: 0.0400 seconds) - 612: 0.2972 (100000 repetitions, Perl: 0.1682 seconds, CL-PPCRE: 0.0500 seconds) - 613: 0.2979 (100000 repetitions, Perl: 0.1678 seconds, CL-PPCRE: 0.0500 seconds) - 614: 0.3004 (100000 repetitions, Perl: 0.1664 seconds, CL-PPCRE: 0.0500 seconds) - 615: 0.2998 (100000 repetitions, Perl: 0.1668 seconds, CL-PPCRE: 0.0500 seconds) - 616: 0.3094 (100000 repetitions, Perl: 0.3232 seconds, CL-PPCRE: 0.1000 seconds) - 617: 0.3499 (100000 repetitions, Perl: 0.4572 seconds, CL-PPCRE: 0.1600 seconds) - 618: 0.3665 (100000 repetitions, Perl: 0.6275 seconds, CL-PPCRE: 0.2300 seconds) - 619: 0.3663 (100000 repetitions, Perl: 0.8190 seconds, CL-PPCRE: 0.3000 seconds) - 620: 0.3761 (10000 repetitions, Perl: 0.1063 seconds, CL-PPCRE: 0.0400 seconds) - 621: 0.3691 (100000 repetitions, Perl: 0.3251 seconds, CL-PPCRE: 0.1200 seconds) - 622: 0.3314 (100000 repetitions, Perl: 0.3319 seconds, CL-PPCRE: 0.1100 seconds) - 623: 0.3612 (100000 repetitions, Perl: 0.3323 seconds, CL-PPCRE: 0.1200 seconds) - 624: 0.3560 (100000 repetitions, Perl: 0.3370 seconds, CL-PPCRE: 0.1200 seconds) - 625: 0.3616 (100000 repetitions, Perl: 0.3319 seconds, CL-PPCRE: 0.1200 seconds) - 626: 0.3517 (100000 repetitions, Perl: 0.1422 seconds, CL-PPCRE: 0.0500 seconds) - 627: 0.2692 (100000 repetitions, Perl: 0.1857 seconds, CL-PPCRE: 0.0500 seconds) - 628: 0.2865 (100000 repetitions, Perl: 0.1745 seconds, CL-PPCRE: 0.0500 seconds) - 630: 0.4441 (100000 repetitions, Perl: 0.1801 seconds, CL-PPCRE: 0.0800 seconds) - 632: 0.6037 (100000 repetitions, Perl: 0.1822 seconds, CL-PPCRE: 0.1100 seconds) - 635: 0.5615 (100000 repetitions, Perl: 0.4096 seconds, CL-PPCRE: 0.2300 seconds) - 636: 0.0000 (10 repetitions, Perl: 6.2984 seconds, CL-PPCRE: 0.0000 seconds) - 637: 0.5417 (100000 repetitions, Perl: 0.4061 seconds, CL-PPCRE: 0.2200 seconds) - 638: 0.0000 (100 repetitions, Perl: 0.1005 seconds, CL-PPCRE: 0.0000 seconds) - 639: 0.5243 (100000 repetitions, Perl: 0.1526 seconds, CL-PPCRE: 0.0800 seconds) - 640: 0.5098 (100000 repetitions, Perl: 0.1373 seconds, CL-PPCRE: 0.0700 seconds) - 641: 0.4568 (100000 repetitions, Perl: 0.2408 seconds, CL-PPCRE: 0.1100 seconds) - 642: 0.4462 (100000 repetitions, Perl: 0.2017 seconds, CL-PPCRE: 0.0900 seconds) - 643: 0.7628 (1000000 repetitions, Perl: 0.7735 seconds, CL-PPCRE: 0.5900 seconds) - 644: 0.4939 (100000 repetitions, Perl: 0.4656 seconds, CL-PPCRE: 0.2300 seconds) - 645: 0.3290 (100000 repetitions, Perl: 0.2128 seconds, CL-PPCRE: 0.0700 seconds) - 646: 0.4070 (100000 repetitions, Perl: 0.3686 seconds, CL-PPCRE: 0.1500 seconds) - 647: 0.4161 (100000 repetitions, Perl: 0.4086 seconds, CL-PPCRE: 0.1700 seconds) - 648: 0.2592 (100000 repetitions, Perl: 0.1158 seconds, CL-PPCRE: 0.0300 seconds) - 649: 0.3547 (100000 repetitions, Perl: 0.3101 seconds, CL-PPCRE: 0.1100 seconds) - 650: 0.4569 (1000000 repetitions, Perl: 0.7879 seconds, CL-PPCRE: 0.3600 seconds) - 651: 0.3252 (100000 repetitions, Perl: 0.1230 seconds, CL-PPCRE: 0.0400 seconds) - 652: 0.3773 (1000000 repetitions, Perl: 0.7950 seconds, CL-PPCRE: 0.3000 seconds) - 653: 0.3258 (100000 repetitions, Perl: 0.1228 seconds, CL-PPCRE: 0.0400 seconds) - 654: 1.4129 (1000000 repetitions, Perl: 0.8140 seconds, CL-PPCRE: 1.1500 seconds) - 655: 1.4957 (1000000 repetitions, Perl: 0.7622 seconds, CL-PPCRE: 1.1400 seconds) - 656: 0.3204 (100000 repetitions, Perl: 0.1560 seconds, CL-PPCRE: 0.0500 seconds) - 659: 0.4925 (100000 repetitions, Perl: 0.1218 seconds, CL-PPCRE: 0.0600 seconds) - 660: 0.3800 (1000000 repetitions, Perl: 0.7895 seconds, CL-PPCRE: 0.3000 seconds) - 661: 0.3298 (100000 repetitions, Perl: 0.1213 seconds, CL-PPCRE: 0.0400 seconds) - 663: 0.4117 (100000 repetitions, Perl: 0.1700 seconds, CL-PPCRE: 0.0700 seconds) - 664: 0.4841 (100000 repetitions, Perl: 0.1239 seconds, CL-PPCRE: 0.0600 seconds) - 665: 0.3108 (100000 repetitions, Perl: 0.1609 seconds, CL-PPCRE: 0.0500 seconds) - 666: 0.3096 (100000 repetitions, Perl: 0.1615 seconds, CL-PPCRE: 0.0500 seconds) - 667: 0.3054 (100000 repetitions, Perl: 0.1310 seconds, CL-PPCRE: 0.0400 seconds) - 668: 0.4166 (100000 repetitions, Perl: 0.1680 seconds, CL-PPCRE: 0.0700 seconds) - 669: 0.4020 (100000 repetitions, Perl: 0.1741 seconds, CL-PPCRE: 0.0700 seconds) - 670: 0.5613 (1000000 repetitions, Perl: 0.7660 seconds, CL-PPCRE: 0.4300 seconds) - 671: 0.3964 (100000 repetitions, Perl: 0.1513 seconds, CL-PPCRE: 0.0600 seconds) - 672: 0.5896 (1000000 repetitions, Perl: 0.7633 seconds, CL-PPCRE: 0.4500 seconds) - 673: 0.4650 (1000000 repetitions, Perl: 0.7742 seconds, CL-PPCRE: 0.3600 seconds) - 674: 0.2537 (100000 repetitions, Perl: 0.1577 seconds, CL-PPCRE: 0.0400 seconds) - 675: 0.5987 (1000000 repetitions, Perl: 0.7683 seconds, CL-PPCRE: 0.4600 seconds) - 676: 0.4043 (1000000 repetitions, Perl: 0.7667 seconds, CL-PPCRE: 0.3100 seconds) - 677: 0.3906 (1000000 repetitions, Perl: 0.7681 seconds, CL-PPCRE: 0.3000 seconds) - 678: 0.2633 (100000 repetitions, Perl: 0.1519 seconds, CL-PPCRE: 0.0400 seconds) - 679: 0.2444 (100000 repetitions, Perl: 0.1227 seconds, CL-PPCRE: 0.0300 seconds) - 680: 0.3258 (100000 repetitions, Perl: 0.1228 seconds, CL-PPCRE: 0.0400 seconds) - 681: 0.3292 (1000000 repetitions, Perl: 0.7897 seconds, CL-PPCRE: 0.2600 seconds) - 682: 0.2429 (100000 repetitions, Perl: 0.1235 seconds, CL-PPCRE: 0.0300 seconds) - 683: 0.3308 (100000 repetitions, Perl: 0.1209 seconds, CL-PPCRE: 0.0400 seconds) - 684: 0.3541 (1000000 repetitions, Perl: 0.7906 seconds, CL-PPCRE: 0.2800 seconds) - 685: 0.3376 (1000000 repetitions, Perl: 0.7996 seconds, CL-PPCRE: 0.2700 seconds) - 686: 0.3260 (100000 repetitions, Perl: 0.1227 seconds, CL-PPCRE: 0.0400 seconds) - 687: 0.2467 (100000 repetitions, Perl: 0.1216 seconds, CL-PPCRE: 0.0300 seconds) - 688: 0.3422 (1000000 repetitions, Perl: 0.7891 seconds, CL-PPCRE: 0.2700 seconds) - 689: 0.3388 (1000000 repetitions, Perl: 0.7970 seconds, CL-PPCRE: 0.2700 seconds) - 690: 0.2430 (100000 repetitions, Perl: 0.1235 seconds, CL-PPCRE: 0.0300 seconds) - 691: 0.3268 (100000 repetitions, Perl: 0.1224 seconds, CL-PPCRE: 0.0400 seconds) - 692: 0.2475 (100000 repetitions, Perl: 0.1212 seconds, CL-PPCRE: 0.0300 seconds) - 694: 0.2583 (100000 repetitions, Perl: 0.1549 seconds, CL-PPCRE: 0.0400 seconds) - 695: 0.3891 (1000000 repetitions, Perl: 0.7710 seconds, CL-PPCRE: 0.3000 seconds) - 697: 0.2431 (100000 repetitions, Perl: 0.1234 seconds, CL-PPCRE: 0.0300 seconds) - 698: 0.2484 (100000 repetitions, Perl: 0.1208 seconds, CL-PPCRE: 0.0300 seconds) - 699: 0.2462 (100000 repetitions, Perl: 0.1218 seconds, CL-PPCRE: 0.0300 seconds) - 700: 0.3274 (1000000 repetitions, Perl: 0.7941 seconds, CL-PPCRE: 0.2600 seconds) - 701: 0.3268 (100000 repetitions, Perl: 0.1224 seconds, CL-PPCRE: 0.0400 seconds) - 702: 0.2446 (100000 repetitions, Perl: 0.1226 seconds, CL-PPCRE: 0.0300 seconds) - 703: 0.2474 (100000 repetitions, Perl: 0.1212 seconds, CL-PPCRE: 0.0300 seconds) - 704: 0.3152 (1000000 repetitions, Perl: 0.7931 seconds, CL-PPCRE: 0.2500 seconds) - 705: 0.3720 (1000000 repetitions, Perl: 0.8065 seconds, CL-PPCRE: 0.3000 seconds) - 706: 0.3264 (100000 repetitions, Perl: 0.1226 seconds, CL-PPCRE: 0.0400 seconds) - 707: 0.3935 (1000000 repetitions, Perl: 0.7878 seconds, CL-PPCRE: 0.3100 seconds) - 708: 0.3254 (100000 repetitions, Perl: 0.1229 seconds, CL-PPCRE: 0.0400 seconds) - 709: 0.3775 (1000000 repetitions, Perl: 0.7948 seconds, CL-PPCRE: 0.3000 seconds) - 710: 0.3276 (100000 repetitions, Perl: 0.1221 seconds, CL-PPCRE: 0.0400 seconds) - 711: 0.2444 (100000 repetitions, Perl: 0.1228 seconds, CL-PPCRE: 0.0300 seconds) - 712: 0.2476 (100000 repetitions, Perl: 0.1212 seconds, CL-PPCRE: 0.0300 seconds) - 713: 0.3040 (1000000 repetitions, Perl: 0.7894 seconds, CL-PPCRE: 0.2400 seconds) - 715: 0.3191 (100000 repetitions, Perl: 0.1567 seconds, CL-PPCRE: 0.0500 seconds) - 716: 0.3000 (100000 repetitions, Perl: 0.1667 seconds, CL-PPCRE: 0.0500 seconds) - 717: 0.2954 (100000 repetitions, Perl: 0.1692 seconds, CL-PPCRE: 0.0500 seconds) - 718: 0.2865 (100000 repetitions, Perl: 0.1745 seconds, CL-PPCRE: 0.0500 seconds) - 719: 0.4718 (1000000 repetitions, Perl: 0.6147 seconds, CL-PPCRE: 0.2900 seconds) - 720: 0.2761 (100000 repetitions, Perl: 0.1811 seconds, CL-PPCRE: 0.0500 seconds) - 721: 0.4707 (1000000 repetitions, Perl: 0.6161 seconds, CL-PPCRE: 0.2900 seconds) - 722: 0.2801 (100000 repetitions, Perl: 0.1785 seconds, CL-PPCRE: 0.0500 seconds) - 723: 0.4566 (1000000 repetitions, Perl: 0.7885 seconds, CL-PPCRE: 0.3600 seconds) - 724: 0.4874 (1000000 repetitions, Perl: 0.6155 seconds, CL-PPCRE: 0.3000 seconds) - 725: 0.5016 (1000000 repetitions, Perl: 0.6180 seconds, CL-PPCRE: 0.3100 seconds) - 726: 0.2828 (100000 repetitions, Perl: 0.1768 seconds, CL-PPCRE: 0.0500 seconds) - 727: 0.5010 (1000000 repetitions, Perl: 0.6188 seconds, CL-PPCRE: 0.3100 seconds) - 728: 0.2833 (100000 repetitions, Perl: 0.1765 seconds, CL-PPCRE: 0.0500 seconds) - 729: 0.4384 (1000000 repetitions, Perl: 0.7756 seconds, CL-PPCRE: 0.3400 seconds) - 730: 0.5023 (1000000 repetitions, Perl: 0.6172 seconds, CL-PPCRE: 0.3100 seconds) - 731: 0.2386 (100000 repetitions, Perl: 0.1676 seconds, CL-PPCRE: 0.0400 seconds) - 732: 0.5181 (1000000 repetitions, Perl: 0.6177 seconds, CL-PPCRE: 0.3200 seconds) - 733: 0.4159 (1000000 repetitions, Perl: 0.7694 seconds, CL-PPCRE: 0.3200 seconds) - 734: 0.2543 (100000 repetitions, Perl: 0.1573 seconds, CL-PPCRE: 0.0400 seconds) - 735: 0.4703 (1000000 repetitions, Perl: 0.6166 seconds, CL-PPCRE: 0.2900 seconds) - 736: 0.2996 (100000 repetitions, Perl: 0.1669 seconds, CL-PPCRE: 0.0500 seconds) - 737: 0.4858 (1000000 repetitions, Perl: 0.6175 seconds, CL-PPCRE: 0.3000 seconds) - 738: 0.4444 (1000000 repetitions, Perl: 0.7876 seconds, CL-PPCRE: 0.3500 seconds) - 739: 0.2519 (100000 repetitions, Perl: 0.1588 seconds, CL-PPCRE: 0.0400 seconds) - 740: 0.4139 (1000000 repetitions, Perl: 0.7731 seconds, CL-PPCRE: 0.3200 seconds) - 741: 0.4308 (1000000 repetitions, Perl: 0.7660 seconds, CL-PPCRE: 0.3300 seconds) - 742: 0.4158 (1000000 repetitions, Perl: 0.7696 seconds, CL-PPCRE: 0.3200 seconds) - 743: 0.4542 (1000000 repetitions, Perl: 0.6165 seconds, CL-PPCRE: 0.2800 seconds) - 744: 0.4251 (100000 repetitions, Perl: 0.1411 seconds, CL-PPCRE: 0.0600 seconds) - 745: 0.4541 (1000000 repetitions, Perl: 0.6166 seconds, CL-PPCRE: 0.2800 seconds) - 746: 0.5009 (1000000 repetitions, Perl: 0.6189 seconds, CL-PPCRE: 0.3100 seconds) - 747: 0.6469 (1000000 repetitions, Perl: 0.7265 seconds, CL-PPCRE: 0.4700 seconds) - 748: 0.4178 (100000 repetitions, Perl: 0.1436 seconds, CL-PPCRE: 0.0600 seconds) - 749: 0.2556 (100000 repetitions, Perl: 0.1565 seconds, CL-PPCRE: 0.0400 seconds) - 750: 0.4699 (1000000 repetitions, Perl: 0.6171 seconds, CL-PPCRE: 0.2900 seconds) - 753: 0.2326 (100000 repetitions, Perl: 0.1290 seconds, CL-PPCRE: 0.0300 seconds) - 754: 0.2557 (100000 repetitions, Perl: 0.1564 seconds, CL-PPCRE: 0.0400 seconds) - 755: 0.3206 (100000 repetitions, Perl: 0.1559 seconds, CL-PPCRE: 0.0500 seconds) - 756: 0.3706 (100000 repetitions, Perl: 0.1349 seconds, CL-PPCRE: 0.0500 seconds) - 757: 0.3777 (100000 repetitions, Perl: 0.1324 seconds, CL-PPCRE: 0.0500 seconds) - 760: 0.2308 (100000 repetitions, Perl: 0.2167 seconds, CL-PPCRE: 0.0500 seconds) - 761: 0.4950 (1000000 repetitions, Perl: 0.7677 seconds, CL-PPCRE: 0.3800 seconds) - 762: 0.4656 (1000000 repetitions, Perl: 0.7731 seconds, CL-PPCRE: 0.3600 seconds) - 763: 0.2372 (100000 repetitions, Perl: 0.2108 seconds, CL-PPCRE: 0.0500 seconds) - 764: 0.4701 (1000000 repetitions, Perl: 0.7658 seconds, CL-PPCRE: 0.3600 seconds) - 765: 0.4926 (1000000 repetitions, Perl: 0.7714 seconds, CL-PPCRE: 0.3800 seconds) - 766: 0.6695 (100000 repetitions, Perl: 0.1792 seconds, CL-PPCRE: 0.1200 seconds) - 767: 1.1548 (1000000 repetitions, Perl: 0.7621 seconds, CL-PPCRE: 0.8800 seconds) - 768: 1.1199 (1000000 repetitions, Perl: 0.7679 seconds, CL-PPCRE: 0.8600 seconds) - 769: 0.3325 (100000 repetitions, Perl: 0.1804 seconds, CL-PPCRE: 0.0600 seconds) - 770: 0.5164 (1000000 repetitions, Perl: 0.7745 seconds, CL-PPCRE: 0.4000 seconds) - 771: 0.2703 (100000 repetitions, Perl: 0.1850 seconds, CL-PPCRE: 0.0500 seconds) - 772: 0.6408 (1000000 repetitions, Perl: 0.7646 seconds, CL-PPCRE: 0.4900 seconds) - 773: 0.4346 (1000000 repetitions, Perl: 0.8284 seconds, CL-PPCRE: 0.3600 seconds) - 774: 0.2671 (100000 repetitions, Perl: 0.1872 seconds, CL-PPCRE: 0.0500 seconds) - 775: 0.6119 (1000000 repetitions, Perl: 0.7681 seconds, CL-PPCRE: 0.4700 seconds) - 776: 0.4309 (1000000 repetitions, Perl: 0.8355 seconds, CL-PPCRE: 0.3600 seconds) - 777: 0.5830 (100000 repetitions, Perl: 0.1544 seconds, CL-PPCRE: 0.0900 seconds) - 778: 1.4436 (1000000 repetitions, Perl: 0.7620 seconds, CL-PPCRE: 1.1000 seconds) - 779: 0.8700 (1000000 repetitions, Perl: 0.8390 seconds, CL-PPCRE: 0.7300 seconds) - 780: 0.3165 (100000 repetitions, Perl: 0.1580 seconds, CL-PPCRE: 0.0500 seconds) - 781: 0.6059 (1000000 repetitions, Perl: 0.7756 seconds, CL-PPCRE: 0.4700 seconds) - 782: 0.4393 (1000000 repetitions, Perl: 0.8194 seconds, CL-PPCRE: 0.3600 seconds) - 783: 0.3732 (1000000 repetitions, Perl: 0.8307 seconds, CL-PPCRE: 0.3100 seconds) - 784: 0.2886 (100000 repetitions, Perl: 0.1733 seconds, CL-PPCRE: 0.0500 seconds) - 785: 0.4761 (1000000 repetitions, Perl: 0.7771 seconds, CL-PPCRE: 0.3700 seconds) - 786: 0.4285 (100000 repetitions, Perl: 0.2567 seconds, CL-PPCRE: 0.1100 seconds) - 787: 0.4003 (100000 repetitions, Perl: 0.2748 seconds, CL-PPCRE: 0.1100 seconds) - 788: 0.4010 (100000 repetitions, Perl: 0.2244 seconds, CL-PPCRE: 0.0900 seconds) - 789: 0.4943 (100000 repetitions, Perl: 0.4451 seconds, CL-PPCRE: 0.2200 seconds) - 791: 0.4275 (100000 repetitions, Perl: 0.4444 seconds, CL-PPCRE: 0.1900 seconds) - 792: 0.5687 (100000 repetitions, Perl: 0.4748 seconds, CL-PPCRE: 0.2700 seconds) - 793: 0.6169 (100000 repetitions, Perl: 0.4539 seconds, CL-PPCRE: 0.2800 seconds) - 794: 0.6400 (100000 repetitions, Perl: 0.4531 seconds, CL-PPCRE: 0.2900 seconds) - 795: 0.2678 (100000 repetitions, Perl: 0.2240 seconds, CL-PPCRE: 0.0600 seconds) - 796: 0.3119 (100000 repetitions, Perl: 0.1924 seconds, CL-PPCRE: 0.0600 seconds) - 797: 0.5787 (100000 repetitions, Perl: 0.3801 seconds, CL-PPCRE: 0.2200 seconds) - 798: 0.6085 (100000 repetitions, Perl: 0.3287 seconds, CL-PPCRE: 0.2000 seconds) - 799: 0.4050 (1000000 repetitions, Perl: 0.8149 seconds, CL-PPCRE: 0.3300 seconds) - 800: 0.3213 (100000 repetitions, Perl: 0.1556 seconds, CL-PPCRE: 0.0500 seconds) - 801: 0.2587 (100000 repetitions, Perl: 0.1546 seconds, CL-PPCRE: 0.0400 seconds) - 802: 0.3436 (100000 repetitions, Perl: 0.1455 seconds, CL-PPCRE: 0.0500 seconds) - 803: 0.4407 (100000 repetitions, Perl: 0.1361 seconds, CL-PPCRE: 0.0600 seconds) - 804: 0.6222 (1000000 repetitions, Perl: 0.7233 seconds, CL-PPCRE: 0.4500 seconds) - 805: 0.4411 (100000 repetitions, Perl: 0.1360 seconds, CL-PPCRE: 0.0600 seconds) - 806: 0.6147 (1000000 repetitions, Perl: 0.7158 seconds, CL-PPCRE: 0.4400 seconds) - 807: 0.2206 (100000 repetitions, Perl: 0.1814 seconds, CL-PPCRE: 0.0400 seconds) - 808: 0.2470 (100000 repetitions, Perl: 0.2024 seconds, CL-PPCRE: 0.0500 seconds) - 809: 0.2735 (100000 repetitions, Perl: 0.1828 seconds, CL-PPCRE: 0.0500 seconds) - 810: 0.2674 (100000 repetitions, Perl: 0.1870 seconds, CL-PPCRE: 0.0500 seconds) - 811: 0.3405 (100000 repetitions, Perl: 0.1468 seconds, CL-PPCRE: 0.0500 seconds) - 812: 0.4059 (100000 repetitions, Perl: 0.1478 seconds, CL-PPCRE: 0.0600 seconds) - 813: 0.2085 (100000 repetitions, Perl: 0.2398 seconds, CL-PPCRE: 0.0500 seconds) - 814: 0.4373 (1000000 repetitions, Perl: 0.6174 seconds, CL-PPCRE: 0.2700 seconds) - 815: 0.2669 (100000 repetitions, Perl: 0.1874 seconds, CL-PPCRE: 0.0500 seconds) - 816: 0.7040 (100000 repetitions, Perl: 0.1847 seconds, CL-PPCRE: 0.1300 seconds) - 817: 0.4656 (100000 repetitions, Perl: 0.2148 seconds, CL-PPCRE: 0.1000 seconds) - 818: 0.4928 (100000 repetitions, Perl: 0.1420 seconds, CL-PPCRE: 0.0700 seconds) - 819: 0.6155 (100000 repetitions, Perl: 0.1625 seconds, CL-PPCRE: 0.1000 seconds) - 820: 0.4187 (100000 repetitions, Perl: 0.1433 seconds, CL-PPCRE: 0.0600 seconds) - 821: 0.4519 (100000 repetitions, Perl: 0.1328 seconds, CL-PPCRE: 0.0600 seconds) - 822: 0.5520 (1000000 repetitions, Perl: 0.7970 seconds, CL-PPCRE: 0.4400 seconds) - 823: 0.6456 (1000000 repetitions, Perl: 0.7899 seconds, CL-PPCRE: 0.5100 seconds) - 824: 0.5695 (1000000 repetitions, Perl: 0.7901 seconds, CL-PPCRE: 0.4500 seconds) - 825: 5.6157 (100000 repetitions, Perl: 0.1086 seconds, CL-PPCRE: 0.6100 seconds) - 826: 0.4859 (100000 repetitions, Perl: 0.1852 seconds, CL-PPCRE: 0.0900 seconds) - 827: 0.4928 (100000 repetitions, Perl: 0.2232 seconds, CL-PPCRE: 0.1100 seconds) - 828: 0.4467 (100000 repetitions, Perl: 0.2238 seconds, CL-PPCRE: 0.1000 seconds) - 829: 0.4870 (100000 repetitions, Perl: 0.1848 seconds, CL-PPCRE: 0.0900 seconds) - 830: 0.4523 (10000 repetitions, Perl: 0.2432 seconds, CL-PPCRE: 0.1100 seconds) - 831: 0.4011 (10000 repetitions, Perl: 0.1994 seconds, CL-PPCRE: 0.0800 seconds) - 832: 0.5870 (100000 repetitions, Perl: 0.1533 seconds, CL-PPCRE: 0.0900 seconds) - 833: 0.6449 (100000 repetitions, Perl: 0.1706 seconds, CL-PPCRE: 0.1100 seconds) - 834: 0.5824 (100000 repetitions, Perl: 0.1717 seconds, CL-PPCRE: 0.1000 seconds) - 835: 0.7363 (100000 repetitions, Perl: 0.3259 seconds, CL-PPCRE: 0.2400 seconds) - 836: 0.3287 (100000 repetitions, Perl: 0.1521 seconds, CL-PPCRE: 0.0500 seconds) - 837: 0.4946 (100000 repetitions, Perl: 0.1617 seconds, CL-PPCRE: 0.0800 seconds) - 838: 0.4950 (100000 repetitions, Perl: 0.1616 seconds, CL-PPCRE: 0.0800 seconds) - 839: 0.2466 (100000 repetitions, Perl: 0.2839 seconds, CL-PPCRE: 0.0700 seconds) - 840: 0.2690 (100000 repetitions, Perl: 0.4832 seconds, CL-PPCRE: 0.1300 seconds) - 841: 0.4333 (100000 repetitions, Perl: 0.8077 seconds, CL-PPCRE: 0.3500 seconds) - 842: 0.3721 (100000 repetitions, Perl: 0.3763 seconds, CL-PPCRE: 0.1400 seconds) - 843: 0.3971 (100000 repetitions, Perl: 0.5288 seconds, CL-PPCRE: 0.2100 seconds) - 844: 0.4906 (100000 repetitions, Perl: 0.4077 seconds, CL-PPCRE: 0.2000 seconds) - 845: 0.3136 (100000 repetitions, Perl: 0.1595 seconds, CL-PPCRE: 0.0500 seconds) - 847: 0.4496 (1000000 repetitions, Perl: 0.7786 seconds, CL-PPCRE: 0.3500 seconds) - 848: 0.4622 (1000000 repetitions, Perl: 0.7789 seconds, CL-PPCRE: 0.3600 seconds) - 849: 0.4740 (100000 repetitions, Perl: 0.1899 seconds, CL-PPCRE: 0.0900 seconds) - 850: 0.8123 (1000000 repetitions, Perl: 0.8002 seconds, CL-PPCRE: 0.6500 seconds) - 851: 0.9209 (1000000 repetitions, Perl: 0.6190 seconds, CL-PPCRE: 0.5700 seconds) - 852: 0.8913 (1000000 repetitions, Perl: 0.6171 seconds, CL-PPCRE: 0.5500 seconds) - 853: 0.4788 (100000 repetitions, Perl: 0.1880 seconds, CL-PPCRE: 0.0900 seconds) - 854: 0.9083 (1000000 repetitions, Perl: 0.6165 seconds, CL-PPCRE: 0.5600 seconds) - 855: 0.5293 (100000 repetitions, Perl: 0.1700 seconds, CL-PPCRE: 0.0900 seconds) - 856: 0.5205 (100000 repetitions, Perl: 0.1729 seconds, CL-PPCRE: 0.0900 seconds) - 857: 0.4842 (100000 repetitions, Perl: 0.1446 seconds, CL-PPCRE: 0.0700 seconds) - 858: 0.4118 (100000 repetitions, Perl: 0.1457 seconds, CL-PPCRE: 0.0600 seconds) - 859: 0.8257 (1000000 repetitions, Perl: 0.7630 seconds, CL-PPCRE: 0.6300 seconds) - 860: 0.7571 (1000000 repetitions, Perl: 0.7661 seconds, CL-PPCRE: 0.5800 seconds) - 861: 0.8254 (1000000 repetitions, Perl: 0.7633 seconds, CL-PPCRE: 0.6300 seconds) - 862: 0.7463 (1000000 repetitions, Perl: 0.7637 seconds, CL-PPCRE: 0.5700 seconds) - 863: 0.3740 (100000 repetitions, Perl: 0.1604 seconds, CL-PPCRE: 0.0600 seconds) - 864: 0.3688 (100000 repetitions, Perl: 0.1627 seconds, CL-PPCRE: 0.0600 seconds) - 865: 0.4717 (1000000 repetitions, Perl: 0.7632 seconds, CL-PPCRE: 0.3600 seconds) - 866: 0.3015 (100000 repetitions, Perl: 0.1327 seconds, CL-PPCRE: 0.0400 seconds) - 867: 0.3042 (100000 repetitions, Perl: 0.1315 seconds, CL-PPCRE: 0.0400 seconds) - 868: 0.4176 (100000 repetitions, Perl: 0.1437 seconds, CL-PPCRE: 0.0600 seconds) - 869: 0.4879 (100000 repetitions, Perl: 0.1435 seconds, CL-PPCRE: 0.0700 seconds) - 870: 0.4843 (1000000 repetitions, Perl: 0.7640 seconds, CL-PPCRE: 0.3700 seconds) - 871: 0.5737 (1000000 repetitions, Perl: 0.7669 seconds, CL-PPCRE: 0.4400 seconds) - 872: 0.4173 (100000 repetitions, Perl: 0.1917 seconds, CL-PPCRE: 0.0800 seconds) - 873: 0.3683 (100000 repetitions, Perl: 0.1900 seconds, CL-PPCRE: 0.0700 seconds) - 874: 0.3494 (100000 repetitions, Perl: 0.1431 seconds, CL-PPCRE: 0.0500 seconds) - 875: 0.2311 (100000 repetitions, Perl: 0.1731 seconds, CL-PPCRE: 0.0400 seconds) - 876: 0.3566 (100000 repetitions, Perl: 0.2804 seconds, CL-PPCRE: 0.1000 seconds) - 877: 0.3548 (100000 repetitions, Perl: 0.2819 seconds, CL-PPCRE: 0.1000 seconds) - 878: 0.3539 (100000 repetitions, Perl: 0.2826 seconds, CL-PPCRE: 0.1000 seconds) - 879: 0.4957 (1000000 repetitions, Perl: 0.7666 seconds, CL-PPCRE: 0.3800 seconds) - 880: 0.6677 (100000 repetitions, Perl: 0.2396 seconds, CL-PPCRE: 0.1600 seconds) - 881: 0.3568 (100000 repetitions, Perl: 0.2803 seconds, CL-PPCRE: 0.1000 seconds) - 882: 0.3561 (100000 repetitions, Perl: 0.2808 seconds, CL-PPCRE: 0.1000 seconds) - 883: 0.3531 (100000 repetitions, Perl: 0.2832 seconds, CL-PPCRE: 0.1000 seconds) - 884: 0.4939 (1000000 repetitions, Perl: 0.7693 seconds, CL-PPCRE: 0.3800 seconds) - 885: 0.6675 (100000 repetitions, Perl: 0.2397 seconds, CL-PPCRE: 0.1600 seconds) - 886: 0.1878 (100000 repetitions, Perl: 0.2662 seconds, CL-PPCRE: 0.0500 seconds) - 887: 0.2227 (100000 repetitions, Perl: 0.2694 seconds, CL-PPCRE: 0.0600 seconds) - 888: 0.1826 (100000 repetitions, Perl: 0.2738 seconds, CL-PPCRE: 0.0500 seconds) - 889: 0.2220 (100000 repetitions, Perl: 0.1352 seconds, CL-PPCRE: 0.0300 seconds) - 890: 0.3370 (1000000 repetitions, Perl: 0.7715 seconds, CL-PPCRE: 0.2600 seconds) - 891: 0.3276 (1000000 repetitions, Perl: 0.7632 seconds, CL-PPCRE: 0.2500 seconds) - 892: 0.3100 (100000 repetitions, Perl: 0.1936 seconds, CL-PPCRE: 0.0600 seconds) - 893: 0.2601 (100000 repetitions, Perl: 0.1923 seconds, CL-PPCRE: 0.0500 seconds) - 894: 0.4041 (1000000 repetitions, Perl: 0.6187 seconds, CL-PPCRE: 0.2500 seconds) - 895: 0.3268 (1000000 repetitions, Perl: 0.7651 seconds, CL-PPCRE: 0.2500 seconds) - 896: 0.3254 (1000000 repetitions, Perl: 0.7683 seconds, CL-PPCRE: 0.2500 seconds) - 897: 0.4751 (100000 repetitions, Perl: 0.2105 seconds, CL-PPCRE: 0.1000 seconds) - 898: 0.4364 (100000 repetitions, Perl: 0.2062 seconds, CL-PPCRE: 0.0900 seconds) - 899: 0.4444 (100000 repetitions, Perl: 0.1350 seconds, CL-PPCRE: 0.0600 seconds) - 900: 0.5022 (100000 repetitions, Perl: 0.1394 seconds, CL-PPCRE: 0.0700 seconds) - 901: 0.7035 (1000000 repetitions, Perl: 0.7676 seconds, CL-PPCRE: 0.5400 seconds) - 902: 0.4586 (100000 repetitions, Perl: 0.1527 seconds, CL-PPCRE: 0.0700 seconds) - 903: 0.4671 (100000 repetitions, Perl: 0.1713 seconds, CL-PPCRE: 0.0800 seconds) - 904: 0.3907 (100000 repetitions, Perl: 0.1792 seconds, CL-PPCRE: 0.0700 seconds) - 905: 0.3864 (100000 repetitions, Perl: 0.1812 seconds, CL-PPCRE: 0.0700 seconds) - 906: 0.3806 (100000 repetitions, Perl: 0.2102 seconds, CL-PPCRE: 0.0800 seconds) - 907: 0.3776 (100000 repetitions, Perl: 0.2118 seconds, CL-PPCRE: 0.0800 seconds) - 908: 0.3921 (100000 repetitions, Perl: 0.2295 seconds, CL-PPCRE: 0.0900 seconds) - 909: 0.4301 (100000 repetitions, Perl: 0.1860 seconds, CL-PPCRE: 0.0800 seconds) - 910: 0.3195 (100000 repetitions, Perl: 0.1878 seconds, CL-PPCRE: 0.0600 seconds) - 911: 0.2436 (100000 repetitions, Perl: 0.1642 seconds, CL-PPCRE: 0.0400 seconds) - 912: 0.3041 (100000 repetitions, Perl: 0.1315 seconds, CL-PPCRE: 0.0400 seconds) - 913: 0.2414 (100000 repetitions, Perl: 0.1243 seconds, CL-PPCRE: 0.0300 seconds) - 914: 0.2742 (100000 repetitions, Perl: 0.1823 seconds, CL-PPCRE: 0.0500 seconds) - 915: 0.2971 (100000 repetitions, Perl: 0.1683 seconds, CL-PPCRE: 0.0500 seconds) - 916: 0.3023 (100000 repetitions, Perl: 0.1323 seconds, CL-PPCRE: 0.0400 seconds) - 917: 0.2352 (100000 repetitions, Perl: 0.1276 seconds, CL-PPCRE: 0.0300 seconds) - 918: 0.3308 (100000 repetitions, Perl: 0.2418 seconds, CL-PPCRE: 0.0800 seconds) - 919: 0.2534 (100000 repetitions, Perl: 0.1578 seconds, CL-PPCRE: 0.0400 seconds) - 920: 0.2807 (100000 repetitions, Perl: 0.1781 seconds, CL-PPCRE: 0.0500 seconds) - 921: 0.3005 (100000 repetitions, Perl: 0.1997 seconds, CL-PPCRE: 0.0600 seconds) - 922: 0.3028 (100000 repetitions, Perl: 0.2312 seconds, CL-PPCRE: 0.0700 seconds) - 923: 0.3821 (100000 repetitions, Perl: 0.2355 seconds, CL-PPCRE: 0.0900 seconds) - 924: 0.2499 (100000 repetitions, Perl: 0.1601 seconds, CL-PPCRE: 0.0400 seconds) - 925: 0.2759 (100000 repetitions, Perl: 0.1813 seconds, CL-PPCRE: 0.0500 seconds) - 926: 0.2996 (100000 repetitions, Perl: 0.2003 seconds, CL-PPCRE: 0.0600 seconds) - 927: 0.3238 (100000 repetitions, Perl: 0.2162 seconds, CL-PPCRE: 0.0700 seconds) - 928: 0.4485 (100000 repetitions, Perl: 0.1784 seconds, CL-PPCRE: 0.0800 seconds) - 929: 0.5143 (100000 repetitions, Perl: 0.1750 seconds, CL-PPCRE: 0.0900 seconds) - 930: 0.4808 (100000 repetitions, Perl: 0.1872 seconds, CL-PPCRE: 0.0900 seconds) - 931: 0.5237 (100000 repetitions, Perl: 0.2864 seconds, CL-PPCRE: 0.1500 seconds) - 932: 0.4539 (100000 repetitions, Perl: 0.1763 seconds, CL-PPCRE: 0.0800 seconds) - 933: 0.5025 (100000 repetitions, Perl: 0.1791 seconds, CL-PPCRE: 0.0900 seconds) - 934: 0.4820 (100000 repetitions, Perl: 0.1867 seconds, CL-PPCRE: 0.0900 seconds) - 935: 0.5277 (100000 repetitions, Perl: 0.2843 seconds, CL-PPCRE: 0.1500 seconds) - 936: 0.4468 (100000 repetitions, Perl: 0.2238 seconds, CL-PPCRE: 0.1000 seconds) - 937: 0.3800 (100000 repetitions, Perl: 0.2631 seconds, CL-PPCRE: 0.1000 seconds) - 938: 0.4090 (100000 repetitions, Perl: 0.2934 seconds, CL-PPCRE: 0.1200 seconds) - 939: 0.4672 (100000 repetitions, Perl: 0.1926 seconds, CL-PPCRE: 0.0900 seconds) - 940: 0.6314 (100000 repetitions, Perl: 0.1742 seconds, CL-PPCRE: 0.1100 seconds) - 941: 0.6664 (100000 repetitions, Perl: 0.1801 seconds, CL-PPCRE: 0.1200 seconds) - 942: 0.6355 (100000 repetitions, Perl: 0.1731 seconds, CL-PPCRE: 0.1100 seconds) - 943: 0.6240 (100000 repetitions, Perl: 0.1763 seconds, CL-PPCRE: 0.1100 seconds) - 944: 0.6861 (100000 repetitions, Perl: 0.1749 seconds, CL-PPCRE: 0.1200 seconds) - 945: 0.7400 (100000 repetitions, Perl: 0.1757 seconds, CL-PPCRE: 0.1300 seconds) - 946: 0.7302 (100000 repetitions, Perl: 0.1780 seconds, CL-PPCRE: 0.1300 seconds) - 947: 0.6298 (100000 repetitions, Perl: 0.1747 seconds, CL-PPCRE: 0.1100 seconds) - 948: 0.6705 (100000 repetitions, Perl: 0.1790 seconds, CL-PPCRE: 0.1200 seconds) - 949: 0.6259 (100000 repetitions, Perl: 0.1758 seconds, CL-PPCRE: 0.1100 seconds) - 950: 0.6232 (100000 repetitions, Perl: 0.1765 seconds, CL-PPCRE: 0.1100 seconds) - 951: 0.6639 (100000 repetitions, Perl: 0.1807 seconds, CL-PPCRE: 0.1200 seconds) - 952: 0.7448 (100000 repetitions, Perl: 0.1745 seconds, CL-PPCRE: 0.1300 seconds) - 953: 0.6846 (100000 repetitions, Perl: 0.1753 seconds, CL-PPCRE: 0.1200 seconds) - 954: 0.2594 (100000 repetitions, Perl: 0.2313 seconds, CL-PPCRE: 0.0600 seconds) - 955: 0.2587 (100000 repetitions, Perl: 0.2319 seconds, CL-PPCRE: 0.0600 seconds) - 956: 0.3055 (100000 repetitions, Perl: 0.2291 seconds, CL-PPCRE: 0.0700 seconds) - 957: 0.4766 (100000 repetitions, Perl: 0.2308 seconds, CL-PPCRE: 0.1100 seconds) - 958: 0.4771 (100000 repetitions, Perl: 0.2725 seconds, CL-PPCRE: 0.1300 seconds) - 959: 0.4772 (100000 repetitions, Perl: 0.3144 seconds, CL-PPCRE: 0.1500 seconds) - 960: 0.6517 (100000 repetitions, Perl: 0.1841 seconds, CL-PPCRE: 0.1200 seconds) - 961: 0.4511 (100000 repetitions, Perl: 0.2217 seconds, CL-PPCRE: 0.1000 seconds) - 962: 0.3977 (100000 repetitions, Perl: 0.2263 seconds, CL-PPCRE: 0.0900 seconds) - 963: 0.4044 (100000 repetitions, Perl: 0.2226 seconds, CL-PPCRE: 0.0900 seconds) - 964: 0.4084 (100000 repetitions, Perl: 0.2204 seconds, CL-PPCRE: 0.0900 seconds) - 965: 0.4408 (100000 repetitions, Perl: 0.2269 seconds, CL-PPCRE: 0.1000 seconds) - 966: 0.4340 (100000 repetitions, Perl: 0.2304 seconds, CL-PPCRE: 0.1000 seconds) - 967: 0.4000 (100000 repetitions, Perl: 0.2250 seconds, CL-PPCRE: 0.0900 seconds) - 968: 0.4063 (100000 repetitions, Perl: 0.2215 seconds, CL-PPCRE: 0.0900 seconds) - 969: 0.4449 (100000 repetitions, Perl: 0.2248 seconds, CL-PPCRE: 0.1000 seconds) - 970: 0.4263 (100000 repetitions, Perl: 0.1877 seconds, CL-PPCRE: 0.0800 seconds) - 971: 0.4445 (100000 repetitions, Perl: 0.2250 seconds, CL-PPCRE: 0.1000 seconds) - 972: 0.4297 (100000 repetitions, Perl: 0.1862 seconds, CL-PPCRE: 0.0800 seconds) - 973: 0.3937 (100000 repetitions, Perl: 0.1778 seconds, CL-PPCRE: 0.0700 seconds) - 974: 0.3974 (100000 repetitions, Perl: 0.1761 seconds, CL-PPCRE: 0.0700 seconds) - 975: 0.3941 (100000 repetitions, Perl: 0.1776 seconds, CL-PPCRE: 0.0700 seconds) - 976: 0.3917 (100000 repetitions, Perl: 0.1787 seconds, CL-PPCRE: 0.0700 seconds) - 977: 0.3929 (100000 repetitions, Perl: 0.1781 seconds, CL-PPCRE: 0.0700 seconds) - 978: 0.3915 (100000 repetitions, Perl: 0.1788 seconds, CL-PPCRE: 0.0700 seconds) - 979: 0.3970 (100000 repetitions, Perl: 0.1763 seconds, CL-PPCRE: 0.0700 seconds) - 980: 0.3956 (100000 repetitions, Perl: 0.1770 seconds, CL-PPCRE: 0.0700 seconds) - 981: 0.3936 (100000 repetitions, Perl: 0.1779 seconds, CL-PPCRE: 0.0700 seconds) - 982: 0.3955 (100000 repetitions, Perl: 0.1770 seconds, CL-PPCRE: 0.0700 seconds) - 983: 0.3928 (100000 repetitions, Perl: 0.1782 seconds, CL-PPCRE: 0.0700 seconds) - 984: 0.3968 (100000 repetitions, Perl: 0.1764 seconds, CL-PPCRE: 0.0700 seconds) - 985: 0.2590 (100000 repetitions, Perl: 0.2317 seconds, CL-PPCRE: 0.0600 seconds) - 986: 0.3023 (100000 repetitions, Perl: 0.2315 seconds, CL-PPCRE: 0.0700 seconds) - 987: 0.4364 (100000 repetitions, Perl: 0.2521 seconds, CL-PPCRE: 0.1100 seconds) - 988: 0.3976 (100000 repetitions, Perl: 0.2515 seconds, CL-PPCRE: 0.1000 seconds) - 989: 0.3863 (100000 repetitions, Perl: 0.2071 seconds, CL-PPCRE: 0.0800 seconds) - 990: 0.3864 (100000 repetitions, Perl: 0.2070 seconds, CL-PPCRE: 0.0800 seconds) - 991: 0.2795 (100000 repetitions, Perl: 0.2504 seconds, CL-PPCRE: 0.0700 seconds) - 992: 0.3350 (100000 repetitions, Perl: 0.2686 seconds, CL-PPCRE: 0.0900 seconds) - 993: 0.1875 (100000 repetitions, Perl: 0.2133 seconds, CL-PPCRE: 0.0400 seconds) - 994: 0.4958 (100000 repetitions, Perl: 0.2218 seconds, CL-PPCRE: 0.1100 seconds) - 995: 0.4927 (100000 repetitions, Perl: 0.2233 seconds, CL-PPCRE: 0.1100 seconds) - 996: 0.4889 (100000 repetitions, Perl: 0.1841 seconds, CL-PPCRE: 0.0900 seconds) - 997: 0.4658 (100000 repetitions, Perl: 0.1503 seconds, CL-PPCRE: 0.0700 seconds) - 998: 0.3414 (100000 repetitions, Perl: 0.1464 seconds, CL-PPCRE: 0.0500 seconds) - 999: 0.3149 (100000 repetitions, Perl: 0.1588 seconds, CL-PPCRE: 0.0500 seconds) -1000: 0.3993 (100000 repetitions, Perl: 0.1503 seconds, CL-PPCRE: 0.0600 seconds) -1001: 0.3749 (100000 repetitions, Perl: 0.1600 seconds, CL-PPCRE: 0.0600 seconds) -1002: 0.4008 (100000 repetitions, Perl: 0.1497 seconds, CL-PPCRE: 0.0600 seconds) -1003: 0.3744 (100000 repetitions, Perl: 0.1603 seconds, CL-PPCRE: 0.0600 seconds) -1004: 0.3792 (100000 repetitions, Perl: 0.1582 seconds, CL-PPCRE: 0.0600 seconds) -1005: 0.5061 (100000 repetitions, Perl: 0.1581 seconds, CL-PPCRE: 0.0800 seconds) -1006: 0.5539 (100000 repetitions, Perl: 0.1625 seconds, CL-PPCRE: 0.0900 seconds) -1007: 0.5210 (100000 repetitions, Perl: 0.1727 seconds, CL-PPCRE: 0.0900 seconds) -1008: 0.5835 (100000 repetitions, Perl: 0.1714 seconds, CL-PPCRE: 0.1000 seconds) -1009: 0.6770 (1000000 repetitions, Perl: 0.7681 seconds, CL-PPCRE: 0.5200 seconds) -1010: 0.6788 (1000000 repetitions, Perl: 0.7660 seconds, CL-PPCRE: 0.5200 seconds) -1011: 0.6545 (1000000 repetitions, Perl: 0.7640 seconds, CL-PPCRE: 0.5000 seconds) -1012: 0.6682 (1000000 repetitions, Perl: 0.7632 seconds, CL-PPCRE: 0.5100 seconds) -1013: 0.4885 (100000 repetitions, Perl: 0.1433 seconds, CL-PPCRE: 0.0700 seconds) -1014: 0.4995 (100000 repetitions, Perl: 0.1401 seconds, CL-PPCRE: 0.0700 seconds) -1015: 0.4964 (100000 repetitions, Perl: 0.1410 seconds, CL-PPCRE: 0.0700 seconds) -1016: 0.4570 (100000 repetitions, Perl: 0.1532 seconds, CL-PPCRE: 0.0700 seconds) -1017: 0.4607 (100000 repetitions, Perl: 0.1519 seconds, CL-PPCRE: 0.0700 seconds) -1018: 0.4578 (100000 repetitions, Perl: 0.1529 seconds, CL-PPCRE: 0.0700 seconds) -1019: 0.4573 (100000 repetitions, Perl: 0.1531 seconds, CL-PPCRE: 0.0700 seconds) -1020: 0.4685 (100000 repetitions, Perl: 0.1281 seconds, CL-PPCRE: 0.0600 seconds) -1021: 0.5708 (100000 repetitions, Perl: 0.1402 seconds, CL-PPCRE: 0.0800 seconds) -1022: 0.4815 (100000 repetitions, Perl: 0.1661 seconds, CL-PPCRE: 0.0800 seconds) -1023: 0.4868 (100000 repetitions, Perl: 0.1643 seconds, CL-PPCRE: 0.0800 seconds) -1024: 0.4939 (100000 repetitions, Perl: 0.1620 seconds, CL-PPCRE: 0.0800 seconds) -1025: 0.5472 (100000 repetitions, Perl: 0.1645 seconds, CL-PPCRE: 0.0900 seconds) -1026: 0.5505 (100000 repetitions, Perl: 0.1635 seconds, CL-PPCRE: 0.0900 seconds) -1027: 0.5315 (100000 repetitions, Perl: 0.1505 seconds, CL-PPCRE: 0.0800 seconds) -1028: 0.5022 (100000 repetitions, Perl: 0.1394 seconds, CL-PPCRE: 0.0700 seconds) -1029: 0.3264 (100000 repetitions, Perl: 0.2145 seconds, CL-PPCRE: 0.0700 seconds) -1030: 0.3346 (100000 repetitions, Perl: 0.1494 seconds, CL-PPCRE: 0.0500 seconds) -1031: 0.4008 (100000 repetitions, Perl: 0.1497 seconds, CL-PPCRE: 0.0600 seconds) -1032: 0.2813 (100000 repetitions, Perl: 0.2133 seconds, CL-PPCRE: 0.0600 seconds) -1033: 0.3560 (100000 repetitions, Perl: 0.2247 seconds, CL-PPCRE: 0.0800 seconds) -1034: 0.3124 (100000 repetitions, Perl: 0.2241 seconds, CL-PPCRE: 0.0700 seconds) -1035: 0.2817 (100000 repetitions, Perl: 0.1420 seconds, CL-PPCRE: 0.0400 seconds) -1036: 0.3732 (100000 repetitions, Perl: 0.1608 seconds, CL-PPCRE: 0.0600 seconds) -1037: 0.8908 (1000000 repetitions, Perl: 0.6174 seconds, CL-PPCRE: 0.5500 seconds) -1038: 0.8891 (1000000 repetitions, Perl: 0.6186 seconds, CL-PPCRE: 0.5500 seconds) -1039: 0.9084 (1000000 repetitions, Perl: 0.6164 seconds, CL-PPCRE: 0.5600 seconds) -1040: 0.4134 (100000 repetitions, Perl: 0.5080 seconds, CL-PPCRE: 0.2100 seconds) -1041: 0.3771 (100000 repetitions, Perl: 0.3978 seconds, CL-PPCRE: 0.1500 seconds) -1042: 0.4070 (100000 repetitions, Perl: 0.4423 seconds, CL-PPCRE: 0.1800 seconds) -1043: 0.3686 (100000 repetitions, Perl: 0.4069 seconds, CL-PPCRE: 0.1500 seconds) -1044: 0.4354 (100000 repetitions, Perl: 0.7580 seconds, CL-PPCRE: 0.3300 seconds) -1045: 0.4202 (100000 repetitions, Perl: 0.7616 seconds, CL-PPCRE: 0.3200 seconds) -1046: 0.4074 (100000 repetitions, Perl: 0.4173 seconds, CL-PPCRE: 0.1700 seconds) -1047: 0.4346 (100000 repetitions, Perl: 0.7823 seconds, CL-PPCRE: 0.3400 seconds) -1048: 0.4338 (100000 repetitions, Perl: 0.7837 seconds, CL-PPCRE: 0.3400 seconds) -1049: 0.4215 (100000 repetitions, Perl: 0.7829 seconds, CL-PPCRE: 0.3300 seconds) -1050: 0.4348 (100000 repetitions, Perl: 0.7819 seconds, CL-PPCRE: 0.3400 seconds) -1051: 0.4342 (100000 repetitions, Perl: 0.7831 seconds, CL-PPCRE: 0.3400 seconds) -1052: 0.4315 (100000 repetitions, Perl: 0.7879 seconds, CL-PPCRE: 0.3400 seconds) -1053: 1.1017 (1000000 repetitions, Perl: 0.6172 seconds, CL-PPCRE: 0.6800 seconds) -1054: 1.1006 (1000000 repetitions, Perl: 0.6179 seconds, CL-PPCRE: 0.6800 seconds) -1055: 1.1014 (1000000 repetitions, Perl: 0.6174 seconds, CL-PPCRE: 0.6800 seconds) -1056: 0.4202 (100000 repetitions, Perl: 0.4997 seconds, CL-PPCRE: 0.2100 seconds) -1057: 0.4627 (100000 repetitions, Perl: 0.3890 seconds, CL-PPCRE: 0.1800 seconds) -1058: 0.4481 (100000 repetitions, Perl: 0.4240 seconds, CL-PPCRE: 0.1900 seconds) -1059: 0.4822 (100000 repetitions, Perl: 0.3941 seconds, CL-PPCRE: 0.1900 seconds) -1060: 0.4665 (100000 repetitions, Perl: 0.6645 seconds, CL-PPCRE: 0.3100 seconds) -1061: 0.4661 (100000 repetitions, Perl: 0.6651 seconds, CL-PPCRE: 0.3100 seconds) -1062: 0.4250 (100000 repetitions, Perl: 0.4000 seconds, CL-PPCRE: 0.1700 seconds) -1063: 0.4645 (100000 repetitions, Perl: 0.6889 seconds, CL-PPCRE: 0.3200 seconds) -1064: 0.4515 (100000 repetitions, Perl: 0.6866 seconds, CL-PPCRE: 0.3100 seconds) -1065: 0.4666 (100000 repetitions, Perl: 0.6858 seconds, CL-PPCRE: 0.3200 seconds) -1066: 0.4514 (100000 repetitions, Perl: 0.6867 seconds, CL-PPCRE: 0.3100 seconds) -1067: 0.4803 (100000 repetitions, Perl: 0.6871 seconds, CL-PPCRE: 0.3300 seconds) -1068: 0.4521 (100000 repetitions, Perl: 0.6857 seconds, CL-PPCRE: 0.3100 seconds) -1069: 0.2367 (100000 repetitions, Perl: 0.1690 seconds, CL-PPCRE: 0.0400 seconds) -1070: 0.2927 (100000 repetitions, Perl: 0.1708 seconds, CL-PPCRE: 0.0500 seconds) -1071: 0.2937 (100000 repetitions, Perl: 0.1702 seconds, CL-PPCRE: 0.0500 seconds) -1072: 0.4285 (1000000 repetitions, Perl: 0.7935 seconds, CL-PPCRE: 0.3400 seconds) -1073: 0.4273 (1000000 repetitions, Perl: 0.7958 seconds, CL-PPCRE: 0.3400 seconds) -1074: 0.4155 (1000000 repetitions, Perl: 0.7702 seconds, CL-PPCRE: 0.3200 seconds) -1075: 0.3433 (100000 repetitions, Perl: 0.1456 seconds, CL-PPCRE: 0.0500 seconds) -1076: 0.3420 (100000 repetitions, Perl: 0.1462 seconds, CL-PPCRE: 0.0500 seconds) -1077: 0.4112 (100000 repetitions, Perl: 0.1459 seconds, CL-PPCRE: 0.0600 seconds) -1078: 0.4726 (100000 repetitions, Perl: 0.1481 seconds, CL-PPCRE: 0.0700 seconds) -1079: 0.2441 (100000 repetitions, Perl: 0.1229 seconds, CL-PPCRE: 0.0300 seconds) -1080: 0.3215 (100000 repetitions, Perl: 0.1244 seconds, CL-PPCRE: 0.0400 seconds) -1081: 0.4700 (100000 repetitions, Perl: 0.1489 seconds, CL-PPCRE: 0.0700 seconds) -1082: 0.4060 (100000 repetitions, Perl: 0.1478 seconds, CL-PPCRE: 0.0600 seconds) -1083: 0.6335 (1000000 repetitions, Perl: 0.6156 seconds, CL-PPCRE: 0.3900 seconds) -1084: 0.5988 (1000000 repetitions, Perl: 0.6179 seconds, CL-PPCRE: 0.3700 seconds) -1085: 0.4737 (100000 repetitions, Perl: 0.1478 seconds, CL-PPCRE: 0.0700 seconds) -1086: 0.4662 (100000 repetitions, Perl: 0.1502 seconds, CL-PPCRE: 0.0700 seconds) -1087: 0.4698 (100000 repetitions, Perl: 0.1490 seconds, CL-PPCRE: 0.0700 seconds) -1088: 0.4444 (100000 repetitions, Perl: 0.1575 seconds, CL-PPCRE: 0.0700 seconds) -1089: 0.6147 (1000000 repetitions, Perl: 0.6181 seconds, CL-PPCRE: 0.3800 seconds) -1090: 0.7628 (1000000 repetitions, Perl: 0.6162 seconds, CL-PPCRE: 0.4700 seconds) -1091: 0.4155 (100000 repetitions, Perl: 0.1444 seconds, CL-PPCRE: 0.0600 seconds) -1092: 0.3413 (100000 repetitions, Perl: 0.1465 seconds, CL-PPCRE: 0.0500 seconds) -1093: 0.3394 (100000 repetitions, Perl: 0.1473 seconds, CL-PPCRE: 0.0500 seconds) -1094: 0.4168 (100000 repetitions, Perl: 0.1439 seconds, CL-PPCRE: 0.0600 seconds) -1095: 0.4189 (100000 repetitions, Perl: 0.1432 seconds, CL-PPCRE: 0.0600 seconds) -1096: 0.4240 (100000 repetitions, Perl: 0.1415 seconds, CL-PPCRE: 0.0600 seconds) -1097: 0.6320 (1000000 repetitions, Perl: 0.7278 seconds, CL-PPCRE: 0.4600 seconds) -1098: 0.7439 (1000000 repetitions, Perl: 0.7259 seconds, CL-PPCRE: 0.5400 seconds) -1099: 0.4353 (100000 repetitions, Perl: 0.1378 seconds, CL-PPCRE: 0.0600 seconds) -1100: 0.2869 (100000 repetitions, Perl: 0.1743 seconds, CL-PPCRE: 0.0500 seconds) -1101: 0.2916 (100000 repetitions, Perl: 0.1714 seconds, CL-PPCRE: 0.0500 seconds) -1102: 0.6549 (1000000 repetitions, Perl: 0.7787 seconds, CL-PPCRE: 0.5100 seconds) -1103: 0.2606 (100000 repetitions, Perl: 0.1151 seconds, CL-PPCRE: 0.0300 seconds) -1104: 0.3060 (100000 repetitions, Perl: 0.1307 seconds, CL-PPCRE: 0.0400 seconds) -1105: 0.3699 (100000 repetitions, Perl: 0.1622 seconds, CL-PPCRE: 0.0600 seconds) -1106: 0.3107 (100000 repetitions, Perl: 0.1609 seconds, CL-PPCRE: 0.0500 seconds) -1107: 0.4186 (100000 repetitions, Perl: 0.1433 seconds, CL-PPCRE: 0.0600 seconds) -1108: 0.3705 (100000 repetitions, Perl: 0.1620 seconds, CL-PPCRE: 0.0600 seconds) -1109: 0.3070 (100000 repetitions, Perl: 0.1303 seconds, CL-PPCRE: 0.0400 seconds) -1110: 0.2271 (100000 repetitions, Perl: 0.1321 seconds, CL-PPCRE: 0.0300 seconds) -1111: 0.3084 (100000 repetitions, Perl: 0.1621 seconds, CL-PPCRE: 0.0500 seconds) -1112: 0.2849 (100000 repetitions, Perl: 0.1755 seconds, CL-PPCRE: 0.0500 seconds) -1113: 0.2561 (100000 repetitions, Perl: 0.1562 seconds, CL-PPCRE: 0.0400 seconds) -1114: 0.2522 (100000 repetitions, Perl: 0.1586 seconds, CL-PPCRE: 0.0400 seconds) -1115: 0.3156 (100000 repetitions, Perl: 0.1584 seconds, CL-PPCRE: 0.0500 seconds) -1116: 0.2411 (100000 repetitions, Perl: 0.1659 seconds, CL-PPCRE: 0.0400 seconds) -1117: 0.3145 (100000 repetitions, Perl: 0.1590 seconds, CL-PPCRE: 0.0500 seconds) -1118: 0.3867 (100000 repetitions, Perl: 0.1293 seconds, CL-PPCRE: 0.0500 seconds) -1119: 0.4624 (100000 repetitions, Perl: 0.1298 seconds, CL-PPCRE: 0.0600 seconds) -1120: 0.3085 (100000 repetitions, Perl: 0.1621 seconds, CL-PPCRE: 0.0500 seconds) -1121: 0.3127 (100000 repetitions, Perl: 0.1599 seconds, CL-PPCRE: 0.0500 seconds) -1122: 0.3696 (100000 repetitions, Perl: 0.1623 seconds, CL-PPCRE: 0.0600 seconds) -1123: 0.3817 (100000 repetitions, Perl: 0.1310 seconds, CL-PPCRE: 0.0500 seconds) -1124: 0.5259 (100000 repetitions, Perl: 0.1711 seconds, CL-PPCRE: 0.0900 seconds) -1125: 0.3481 (100000 repetitions, Perl: 0.1723 seconds, CL-PPCRE: 0.0600 seconds) -1126: 0.5827 (100000 repetitions, Perl: 0.1716 seconds, CL-PPCRE: 0.1000 seconds) -1127: 0.5218 (1000000 repetitions, Perl: 0.8432 seconds, CL-PPCRE: 0.4400 seconds) -1128: 0.5541 (100000 repetitions, Perl: 0.1444 seconds, CL-PPCRE: 0.0800 seconds) -1129: 0.4897 (1000000 repetitions, Perl: 0.9190 seconds, CL-PPCRE: 0.4500 seconds) -1130: 0.6666 (1000000 repetitions, Perl: 0.9151 seconds, CL-PPCRE: 0.6100 seconds) -1131: 0.5408 (1000000 repetitions, Perl: 0.8506 seconds, CL-PPCRE: 0.4600 seconds) -1132: 0.7029 (1000000 repetitions, Perl: 0.9105 seconds, CL-PPCRE: 0.6400 seconds) -1133: 0.3426 (100000 repetitions, Perl: 0.1751 seconds, CL-PPCRE: 0.0600 seconds) -1134: 0.4030 (100000 repetitions, Perl: 0.1737 seconds, CL-PPCRE: 0.0700 seconds) -1135: 0.3455 (100000 repetitions, Perl: 0.1737 seconds, CL-PPCRE: 0.0600 seconds) -1136: 0.2454 (100000 repetitions, Perl: 0.1223 seconds, CL-PPCRE: 0.0300 seconds) -1137: 0.3244 (100000 repetitions, Perl: 0.1233 seconds, CL-PPCRE: 0.0400 seconds) -1138: 0.2405 (100000 repetitions, Perl: 0.1247 seconds, CL-PPCRE: 0.0300 seconds) -1139: 0.3148 (1000000 repetitions, Perl: 0.7941 seconds, CL-PPCRE: 0.2500 seconds) -1140: 0.3763 (100000 repetitions, Perl: 0.1595 seconds, CL-PPCRE: 0.0600 seconds) -1141: 0.3067 (100000 repetitions, Perl: 0.1630 seconds, CL-PPCRE: 0.0500 seconds) -1142: 0.3115 (100000 repetitions, Perl: 0.1605 seconds, CL-PPCRE: 0.0500 seconds) -1143: 0.3903 (100000 repetitions, Perl: 0.1281 seconds, CL-PPCRE: 0.0500 seconds) -1144: 0.2431 (100000 repetitions, Perl: 0.1234 seconds, CL-PPCRE: 0.0300 seconds) -1145: 0.2490 (100000 repetitions, Perl: 0.1205 seconds, CL-PPCRE: 0.0300 seconds) -1146: 0.2464 (100000 repetitions, Perl: 0.1218 seconds, CL-PPCRE: 0.0300 seconds) -1147: 0.3224 (1000000 repetitions, Perl: 0.7755 seconds, CL-PPCRE: 0.2500 seconds) -1148: 0.2474 (100000 repetitions, Perl: 0.1213 seconds, CL-PPCRE: 0.0300 seconds) -1149: 0.2453 (100000 repetitions, Perl: 0.1223 seconds, CL-PPCRE: 0.0300 seconds) -1150: 0.2402 (100000 repetitions, Perl: 0.1249 seconds, CL-PPCRE: 0.0300 seconds) -1151: 0.3149 (1000000 repetitions, Perl: 0.7939 seconds, CL-PPCRE: 0.2500 seconds) -1152: 0.3758 (100000 repetitions, Perl: 0.1596 seconds, CL-PPCRE: 0.0600 seconds) -1153: 0.5027 (100000 repetitions, Perl: 0.1591 seconds, CL-PPCRE: 0.0800 seconds) -1154: 0.4940 (100000 repetitions, Perl: 0.1619 seconds, CL-PPCRE: 0.0800 seconds) -1155: 0.5548 (100000 repetitions, Perl: 0.1262 seconds, CL-PPCRE: 0.0700 seconds) -1156: 0.2429 (100000 repetitions, Perl: 0.1235 seconds, CL-PPCRE: 0.0300 seconds) -1157: 0.2446 (100000 repetitions, Perl: 0.1227 seconds, CL-PPCRE: 0.0300 seconds) -1158: 0.2415 (100000 repetitions, Perl: 0.1242 seconds, CL-PPCRE: 0.0300 seconds) -1159: 0.3301 (1000000 repetitions, Perl: 0.7877 seconds, CL-PPCRE: 0.2600 seconds) -1160: 0.2993 (100000 repetitions, Perl: 0.1336 seconds, CL-PPCRE: 0.0400 seconds) -1161: 0.3004 (100000 repetitions, Perl: 0.1332 seconds, CL-PPCRE: 0.0400 seconds) -1162: 0.4877 (100000 repetitions, Perl: 0.1640 seconds, CL-PPCRE: 0.0800 seconds) -1163: 0.2980 (100000 repetitions, Perl: 0.1678 seconds, CL-PPCRE: 0.0500 seconds) -1164: 0.3522 (100000 repetitions, Perl: 0.1419 seconds, CL-PPCRE: 0.0500 seconds) -1165: 0.3501 (100000 repetitions, Perl: 0.1428 seconds, CL-PPCRE: 0.0500 seconds) -1166: 0.4903 (1000000 repetitions, Perl: 0.6119 seconds, CL-PPCRE: 0.3000 seconds) -1167: 0.5138 (100000 repetitions, Perl: 0.1752 seconds, CL-PPCRE: 0.0900 seconds) -1168: 0.4740 (100000 repetitions, Perl: 0.1899 seconds, CL-PPCRE: 0.0900 seconds) -1169: 0.7838 (100000 repetitions, Perl: 0.1786 seconds, CL-PPCRE: 0.1400 seconds) -1170: 0.5897 (100000 repetitions, Perl: 0.2374 seconds, CL-PPCRE: 0.1400 seconds) -1171: 0.4120 (100000 repetitions, Perl: 0.1456 seconds, CL-PPCRE: 0.0600 seconds) -1172: 0.3606 (100000 repetitions, Perl: 0.3050 seconds, CL-PPCRE: 0.1100 seconds) -1173: 0.3640 (100000 repetitions, Perl: 0.3022 seconds, CL-PPCRE: 0.1100 seconds) -1174: 0.3397 (100000 repetitions, Perl: 0.2943 seconds, CL-PPCRE: 0.1000 seconds) -1175: 0.3675 (100000 repetitions, Perl: 0.2993 seconds, CL-PPCRE: 0.1100 seconds) -1176: 0.3699 (100000 repetitions, Perl: 0.1892 seconds, CL-PPCRE: 0.0700 seconds) -1177: 0.3681 (100000 repetitions, Perl: 0.1902 seconds, CL-PPCRE: 0.0700 seconds) -1178: 0.2174 (100000 repetitions, Perl: 0.1380 seconds, CL-PPCRE: 0.0300 seconds) -1179: 0.4697 (1000000 repetitions, Perl: 0.6175 seconds, CL-PPCRE: 0.2900 seconds) -1180: 0.5686 (100000 repetitions, Perl: 0.1583 seconds, CL-PPCRE: 0.0900 seconds) -1181: 0.5004 (100000 repetitions, Perl: 0.1599 seconds, CL-PPCRE: 0.0800 seconds) -1182: 0.3159 (100000 repetitions, Perl: 0.1583 seconds, CL-PPCRE: 0.0500 seconds) -1183: 0.3580 (100000 repetitions, Perl: 0.2234 seconds, CL-PPCRE: 0.0800 seconds) -1184: 0.4515 (100000 repetitions, Perl: 0.1550 seconds, CL-PPCRE: 0.0700 seconds) -1185: 0.2848 (100000 repetitions, Perl: 0.1755 seconds, CL-PPCRE: 0.0500 seconds) -1186: 0.2827 (100000 repetitions, Perl: 0.1769 seconds, CL-PPCRE: 0.0500 seconds) -1187: 0.7259 (100000 repetitions, Perl: 0.2066 seconds, CL-PPCRE: 0.1500 seconds) -1188: 0.2363 (100000 repetitions, Perl: 0.1693 seconds, CL-PPCRE: 0.0400 seconds) -1189: 0.6586 (100000 repetitions, Perl: 0.3340 seconds, CL-PPCRE: 0.2200 seconds) -1190: 0.5050 (100000 repetitions, Perl: 0.2178 seconds, CL-PPCRE: 0.1100 seconds) -1191: 0.4693 (100000 repetitions, Perl: 0.1918 seconds, CL-PPCRE: 0.0900 seconds) -1192: 0.3908 (100000 repetitions, Perl: 0.2047 seconds, CL-PPCRE: 0.0800 seconds) -1193: 0.4733 (100000 repetitions, Perl: 0.2324 seconds, CL-PPCRE: 0.1100 seconds) -1194: 0.4724 (100000 repetitions, Perl: 0.2329 seconds, CL-PPCRE: 0.1100 seconds) -1195: 0.4342 (100000 repetitions, Perl: 0.2534 seconds, CL-PPCRE: 0.1100 seconds) -1196: 0.3314 (100000 repetitions, Perl: 0.1811 seconds, CL-PPCRE: 0.0600 seconds) -1197: 0.5206 (1000000 repetitions, Perl: 0.6147 seconds, CL-PPCRE: 0.3200 seconds) -1198: 0.7281 (1000000 repetitions, Perl: 0.6180 seconds, CL-PPCRE: 0.4500 seconds) -1199: 0.5142 (100000 repetitions, Perl: 0.1556 seconds, CL-PPCRE: 0.0800 seconds) -1200: 0.5652 (100000 repetitions, Perl: 0.2123 seconds, CL-PPCRE: 0.1200 seconds) -1201: 0.8035 (100000 repetitions, Perl: 0.1494 seconds, CL-PPCRE: 0.1200 seconds) -1202: 0.4921 (100000 repetitions, Perl: 0.2439 seconds, CL-PPCRE: 0.1200 seconds) -1203: 0.5212 (100000 repetitions, Perl: 0.1727 seconds, CL-PPCRE: 0.0900 seconds) -1204: 0.5820 (100000 repetitions, Perl: 0.1890 seconds, CL-PPCRE: 0.1100 seconds) -1205: 0.5753 (100000 repetitions, Perl: 0.2260 seconds, CL-PPCRE: 0.1300 seconds) -1206: 0.5358 (100000 repetitions, Perl: 0.2986 seconds, CL-PPCRE: 0.1600 seconds) -1207: 0.5399 (100000 repetitions, Perl: 0.2963 seconds, CL-PPCRE: 0.1600 seconds) -1208: 1.0716 (100000 repetitions, Perl: 0.2053 seconds, CL-PPCRE: 0.2200 seconds) -1209: 1.1409 (100000 repetitions, Perl: 0.2104 seconds, CL-PPCRE: 0.2400 seconds) -1210: 1.1050 (100000 repetitions, Perl: 0.1991 seconds, CL-PPCRE: 0.2200 seconds) -1211: 0.4698 (1000000 repetitions, Perl: 0.6173 seconds, CL-PPCRE: 0.2900 seconds) -1212: 0.4866 (1000000 repetitions, Perl: 0.6165 seconds, CL-PPCRE: 0.3000 seconds) -1213: 0.3107 (100000 repetitions, Perl: 0.1931 seconds, CL-PPCRE: 0.0600 seconds) -1214: 0.4636 (100000 repetitions, Perl: 0.2157 seconds, CL-PPCRE: 0.1000 seconds) -1215: 0.4719 (100000 repetitions, Perl: 0.2755 seconds, CL-PPCRE: 0.1300 seconds) -1216: 0.2852 (100000 repetitions, Perl: 0.1753 seconds, CL-PPCRE: 0.0500 seconds) -1217: 0.4211 (100000 repetitions, Perl: 0.1900 seconds, CL-PPCRE: 0.0800 seconds) -1218: 0.3272 (100000 repetitions, Perl: 0.1528 seconds, CL-PPCRE: 0.0500 seconds) -1219: 0.4935 (100000 repetitions, Perl: 0.1824 seconds, CL-PPCRE: 0.0900 seconds) -1220: 0.6097 (100000 repetitions, Perl: 0.1968 seconds, CL-PPCRE: 0.1200 seconds) -1221: 0.5091 (100000 repetitions, Perl: 0.1375 seconds, CL-PPCRE: 0.0700 seconds) -1222: 0.5014 (100000 repetitions, Perl: 0.1396 seconds, CL-PPCRE: 0.0700 seconds) -1223: 0.4948 (100000 repetitions, Perl: 0.1617 seconds, CL-PPCRE: 0.0800 seconds) -1224: 0.5640 (100000 repetitions, Perl: 0.3192 seconds, CL-PPCRE: 0.1800 seconds) -1225: 0.8114 (100000 repetitions, Perl: 0.3327 seconds, CL-PPCRE: 0.2700 seconds) -1226: 0.5465 (100000 repetitions, Perl: 0.9515 seconds, CL-PPCRE: 0.5200 seconds) -1227: 0.7252 (10000 repetitions, Perl: 0.1379 seconds, CL-PPCRE: 0.1000 seconds) -1228: 0.3727 (100000 repetitions, Perl: 0.1342 seconds, CL-PPCRE: 0.0500 seconds) -1229: 0.4447 (100000 repetitions, Perl: 0.1349 seconds, CL-PPCRE: 0.0600 seconds) -1230: 0.3507 (100000 repetitions, Perl: 0.1426 seconds, CL-PPCRE: 0.0500 seconds) -1231: 0.3976 (100000 repetitions, Perl: 0.1006 seconds, CL-PPCRE: 0.0400 seconds) -1232: 0.5323 (1000000 repetitions, Perl: 0.7890 seconds, CL-PPCRE: 0.4200 seconds) -1233: 0.4362 (1000000 repetitions, Perl: 0.8253 seconds, CL-PPCRE: 0.3600 seconds) -1234: 0.4144 (1000000 repetitions, Perl: 0.8204 seconds, CL-PPCRE: 0.3400 seconds) -1235: 0.3422 (100000 repetitions, Perl: 0.1461 seconds, CL-PPCRE: 0.0500 seconds) -1236: 0.3898 (100000 repetitions, Perl: 0.1539 seconds, CL-PPCRE: 0.0600 seconds) -1237: 0.3885 (100000 repetitions, Perl: 0.1545 seconds, CL-PPCRE: 0.0600 seconds) -1238: 0.5008 (100000 repetitions, Perl: 0.1997 seconds, CL-PPCRE: 0.1000 seconds) -1239: 0.5094 (100000 repetitions, Perl: 0.1963 seconds, CL-PPCRE: 0.1000 seconds) -1240: 0.4515 (100000 repetitions, Perl: 0.1550 seconds, CL-PPCRE: 0.0700 seconds) -1241: 0.6930 (1000000 repetitions, Perl: 0.6205 seconds, CL-PPCRE: 0.4300 seconds) -1242: 0.6343 (1000000 repetitions, Perl: 0.6148 seconds, CL-PPCRE: 0.3900 seconds) -1243: 0.5096 (100000 repetitions, Perl: 0.1570 seconds, CL-PPCRE: 0.0800 seconds) -1244: 0.5477 (100000 repetitions, Perl: 0.1826 seconds, CL-PPCRE: 0.1000 seconds) -1245: 0.5955 (100000 repetitions, Perl: 0.1847 seconds, CL-PPCRE: 0.1100 seconds) -1246: 0.5025 (100000 repetitions, Perl: 0.1592 seconds, CL-PPCRE: 0.0800 seconds) -1247: 0.6442 (1000000 repetitions, Perl: 0.6209 seconds, CL-PPCRE: 0.4000 seconds) -1248: 0.8571 (1000000 repetitions, Perl: 0.6183 seconds, CL-PPCRE: 0.5300 seconds) -1249: 0.4124 (100000 repetitions, Perl: 0.1697 seconds, CL-PPCRE: 0.0700 seconds) -1250: 0.4076 (100000 repetitions, Perl: 0.1472 seconds, CL-PPCRE: 0.0600 seconds) -1251: 0.4063 (100000 repetitions, Perl: 0.1477 seconds, CL-PPCRE: 0.0600 seconds) -1252: 0.4719 (100000 repetitions, Perl: 0.1483 seconds, CL-PPCRE: 0.0700 seconds) -1253: 0.4707 (100000 repetitions, Perl: 0.1487 seconds, CL-PPCRE: 0.0700 seconds) -1254: 0.4641 (100000 repetitions, Perl: 0.1293 seconds, CL-PPCRE: 0.0600 seconds) -1255: 0.4680 (1000000 repetitions, Perl: 0.9401 seconds, CL-PPCRE: 0.4400 seconds) -1256: 0.4910 (100000 repetitions, Perl: 0.1018 seconds, CL-PPCRE: 0.0500 seconds) -1257: 0.4802 (100000 repetitions, Perl: 0.1249 seconds, CL-PPCRE: 0.0600 seconds) -1258: 0.4269 (100000 repetitions, Perl: 0.1405 seconds, CL-PPCRE: 0.0600 seconds) -1259: 0.2609 (100000 repetitions, Perl: 0.1150 seconds, CL-PPCRE: 0.0300 seconds) -1260: 0.3090 (100000 repetitions, Perl: 0.1294 seconds, CL-PPCRE: 0.0400 seconds) -1261: 0.4528 (100000 repetitions, Perl: 0.1325 seconds, CL-PPCRE: 0.0600 seconds) -1262: 0.4556 (100000 repetitions, Perl: 0.1317 seconds, CL-PPCRE: 0.0600 seconds) -1263: 0.5502 (100000 repetitions, Perl: 0.1454 seconds, CL-PPCRE: 0.0800 seconds) -1264: 0.4150 (100000 repetitions, Perl: 0.1446 seconds, CL-PPCRE: 0.0600 seconds) -1265: 0.3445 (100000 repetitions, Perl: 0.1161 seconds, CL-PPCRE: 0.0400 seconds) -1266: 0.4460 (100000 repetitions, Perl: 0.1345 seconds, CL-PPCRE: 0.0600 seconds) -1267: 0.4512 (100000 repetitions, Perl: 0.1330 seconds, CL-PPCRE: 0.0600 seconds) -1268: 0.2792 (100000 repetitions, Perl: 0.1075 seconds, CL-PPCRE: 0.0300 seconds) -1269: 0.3707 (100000 repetitions, Perl: 0.1079 seconds, CL-PPCRE: 0.0400 seconds) -1270: 0.4187 (100000 repetitions, Perl: 0.1433 seconds, CL-PPCRE: 0.0600 seconds) -1271: 0.3944 (100000 repetitions, Perl: 0.1268 seconds, CL-PPCRE: 0.0500 seconds) -1272: 0.3111 (100000 repetitions, Perl: 0.1286 seconds, CL-PPCRE: 0.0400 seconds) -1273: 0.2980 (100000 repetitions, Perl: 0.1342 seconds, CL-PPCRE: 0.0400 seconds) -1274: 0.4554 (100000 repetitions, Perl: 0.1318 seconds, CL-PPCRE: 0.0600 seconds) -1275: 0.4558 (100000 repetitions, Perl: 0.1316 seconds, CL-PPCRE: 0.0600 seconds) -1276: 0.4516 (100000 repetitions, Perl: 0.1329 seconds, CL-PPCRE: 0.0600 seconds) -1277: 0.3876 (100000 repetitions, Perl: 0.1032 seconds, CL-PPCRE: 0.0400 seconds) -1278: 0.4804 (100000 repetitions, Perl: 0.1041 seconds, CL-PPCRE: 0.0500 seconds) -1279: 0.4588 (100000 repetitions, Perl: 0.1308 seconds, CL-PPCRE: 0.0600 seconds) -1280: 0.2754 (100000 repetitions, Perl: 0.1452 seconds, CL-PPCRE: 0.0400 seconds) -1281: 0.2799 (100000 repetitions, Perl: 0.1429 seconds, CL-PPCRE: 0.0400 seconds) -1282: 0.5499 (100000 repetitions, Perl: 0.1455 seconds, CL-PPCRE: 0.0800 seconds) -1283: 0.3526 (100000 repetitions, Perl: 0.1134 seconds, CL-PPCRE: 0.0400 seconds) -1284: 0.3570 (100000 repetitions, Perl: 0.1121 seconds, CL-PPCRE: 0.0400 seconds) -1285: 0.3734 (100000 repetitions, Perl: 0.1339 seconds, CL-PPCRE: 0.0500 seconds) -1286: 0.3545 (100000 repetitions, Perl: 0.1410 seconds, CL-PPCRE: 0.0500 seconds) -1287: 0.4091 (100000 repetitions, Perl: 0.1467 seconds, CL-PPCRE: 0.0600 seconds) -1288: 0.4858 (1000000 repetitions, Perl: 0.6176 seconds, CL-PPCRE: 0.3000 seconds) -1289: 0.6510 (100000 repetitions, Perl: 0.1382 seconds, CL-PPCRE: 0.0900 seconds) -1290: 0.6770 (100000 repetitions, Perl: 0.1477 seconds, CL-PPCRE: 0.1000 seconds) -1291: 0.6942 (100000 repetitions, Perl: 0.2305 seconds, CL-PPCRE: 0.1600 seconds) -1292: 0.6907 (100000 repetitions, Perl: 0.2316 seconds, CL-PPCRE: 0.1600 seconds) -1293: 0.4198 (100000 repetitions, Perl: 0.1429 seconds, CL-PPCRE: 0.0600 seconds) -1294: 0.4822 (100000 repetitions, Perl: 0.1452 seconds, CL-PPCRE: 0.0700 seconds) -1295: 0.4146 (100000 repetitions, Perl: 0.1447 seconds, CL-PPCRE: 0.0600 seconds) -1296: 0.3391 (100000 repetitions, Perl: 0.3244 seconds, CL-PPCRE: 0.1100 seconds) -1297: 0.3420 (100000 repetitions, Perl: 0.3217 seconds, CL-PPCRE: 0.1100 seconds) -1298: 0.3516 (100000 repetitions, Perl: 0.3128 seconds, CL-PPCRE: 0.1100 seconds) -1299: 0.3490 (100000 repetitions, Perl: 0.3152 seconds, CL-PPCRE: 0.1100 seconds) -1300: 0.3570 (100000 repetitions, Perl: 0.1961 seconds, CL-PPCRE: 0.0700 seconds) -1301: 0.3511 (100000 repetitions, Perl: 0.1994 seconds, CL-PPCRE: 0.0700 seconds) -1302: 0.3363 (100000 repetitions, Perl: 0.1487 seconds, CL-PPCRE: 0.0500 seconds) -1303: 0.2163 (100000 repetitions, Perl: 0.1387 seconds, CL-PPCRE: 0.0300 seconds) -1304: 0.5458 (100000 repetitions, Perl: 0.1649 seconds, CL-PPCRE: 0.0900 seconds) -1305: 0.5308 (100000 repetitions, Perl: 0.1696 seconds, CL-PPCRE: 0.0900 seconds) -1306: 0.2966 (100000 repetitions, Perl: 0.1686 seconds, CL-PPCRE: 0.0500 seconds) -1307: 0.4821 (100000 repetitions, Perl: 0.1867 seconds, CL-PPCRE: 0.0900 seconds) -1308: 0.4939 (100000 repetitions, Perl: 0.1620 seconds, CL-PPCRE: 0.0800 seconds) -1309: 0.3487 (100000 repetitions, Perl: 0.1434 seconds, CL-PPCRE: 0.0500 seconds) -1310: 0.3636 (100000 repetitions, Perl: 0.1375 seconds, CL-PPCRE: 0.0500 seconds) -1311: 0.6696 (100000 repetitions, Perl: 0.2539 seconds, CL-PPCRE: 0.1700 seconds) -1312: 0.3703 (100000 repetitions, Perl: 0.1350 seconds, CL-PPCRE: 0.0500 seconds) -1313: 0.4320 (100000 repetitions, Perl: 0.1389 seconds, CL-PPCRE: 0.0600 seconds) -1314: 0.6490 (100000 repetitions, Perl: 0.3544 seconds, CL-PPCRE: 0.2300 seconds) -1315: 0.5671 (100000 repetitions, Perl: 0.2292 seconds, CL-PPCRE: 0.1300 seconds) -1316: 0.5198 (100000 repetitions, Perl: 0.2116 seconds, CL-PPCRE: 0.1100 seconds) -1317: 0.4623 (100000 repetitions, Perl: 0.1730 seconds, CL-PPCRE: 0.0800 seconds) -1318: 0.6373 (100000 repetitions, Perl: 0.1883 seconds, CL-PPCRE: 0.1200 seconds) -1319: 0.6446 (100000 repetitions, Perl: 0.1862 seconds, CL-PPCRE: 0.1200 seconds) -1320: 0.6559 (100000 repetitions, Perl: 0.2135 seconds, CL-PPCRE: 0.1400 seconds) -1321: 0.4390 (100000 repetitions, Perl: 0.1822 seconds, CL-PPCRE: 0.0800 seconds) -1322: 0.5881 (100000 repetitions, Perl: 0.1700 seconds, CL-PPCRE: 0.1000 seconds) -1323: 0.7739 (100000 repetitions, Perl: 0.1680 seconds, CL-PPCRE: 0.1300 seconds) -1324: 0.3400 (100000 repetitions, Perl: 0.1471 seconds, CL-PPCRE: 0.0500 seconds) -1325: 0.5080 (100000 repetitions, Perl: 0.2559 seconds, CL-PPCRE: 0.1300 seconds) -1326: 0.5332 (100000 repetitions, Perl: 0.1875 seconds, CL-PPCRE: 0.1000 seconds) -1327: 0.5438 (100000 repetitions, Perl: 0.2023 seconds, CL-PPCRE: 0.1100 seconds) -1328: 0.5896 (100000 repetitions, Perl: 0.2374 seconds, CL-PPCRE: 0.1400 seconds) -1329: 0.6437 (100000 repetitions, Perl: 0.4194 seconds, CL-PPCRE: 0.2700 seconds) -1330: 0.5475 (100000 repetitions, Perl: 0.3105 seconds, CL-PPCRE: 0.1700 seconds) -1331: 0.5626 (100000 repetitions, Perl: 0.3022 seconds, CL-PPCRE: 0.1700 seconds) -1332: 1.2478 (100000 repetitions, Perl: 0.1763 seconds, CL-PPCRE: 0.2200 seconds) -1333: 1.3674 (100000 repetitions, Perl: 0.1828 seconds, CL-PPCRE: 0.2500 seconds) -1334: 1.2733 (100000 repetitions, Perl: 0.1728 seconds, CL-PPCRE: 0.2200 seconds) -1335: 0.5285 (100000 repetitions, Perl: 0.1325 seconds, CL-PPCRE: 0.0700 seconds) -1336: 0.4142 (100000 repetitions, Perl: 0.1690 seconds, CL-PPCRE: 0.0700 seconds) -1337: 0.4689 (1000000 repetitions, Perl: 0.6185 seconds, CL-PPCRE: 0.2900 seconds) -1338: 0.4705 (1000000 repetitions, Perl: 0.6164 seconds, CL-PPCRE: 0.2900 seconds) -1339: 0.5296 (100000 repetitions, Perl: 0.1511 seconds, CL-PPCRE: 0.0800 seconds) -1340: 0.5221 (100000 repetitions, Perl: 0.1915 seconds, CL-PPCRE: 0.1000 seconds) -1341: 0.5562 (100000 repetitions, Perl: 0.2337 seconds, CL-PPCRE: 0.1300 seconds) -1342: 0.4419 (100000 repetitions, Perl: 0.1358 seconds, CL-PPCRE: 0.0600 seconds) -1343: 0.6095 (100000 repetitions, Perl: 0.1477 seconds, CL-PPCRE: 0.0900 seconds) -1344: 0.3896 (100000 repetitions, Perl: 0.1540 seconds, CL-PPCRE: 0.0600 seconds) -1345: 0.5580 (100000 repetitions, Perl: 0.1613 seconds, CL-PPCRE: 0.0900 seconds) -1346: 0.5612 (100000 repetitions, Perl: 0.1960 seconds, CL-PPCRE: 0.1100 seconds) -1347: 0.3277 (100000 repetitions, Perl: 0.2136 seconds, CL-PPCRE: 0.0700 seconds) -1348: 0.2471 (100000 repetitions, Perl: 0.2428 seconds, CL-PPCRE: 0.0600 seconds) -1349: 0.2891 (100000 repetitions, Perl: 0.2767 seconds, CL-PPCRE: 0.0800 seconds) -1350: 0.3802 (100000 repetitions, Perl: 0.2104 seconds, CL-PPCRE: 0.0800 seconds) -1351: 0.3484 (100000 repetitions, Perl: 0.2583 seconds, CL-PPCRE: 0.0900 seconds) -1352: 0.3698 (100000 repetitions, Perl: 0.2433 seconds, CL-PPCRE: 0.0900 seconds) -1353: 0.3679 (100000 repetitions, Perl: 0.2447 seconds, CL-PPCRE: 0.0900 seconds) -1354: 0.3893 (100000 repetitions, Perl: 0.3853 seconds, CL-PPCRE: 0.1500 seconds) -1355: 0.3846 (100000 repetitions, Perl: 0.2600 seconds, CL-PPCRE: 0.1000 seconds) -1356: 0.4225 (100000 repetitions, Perl: 0.3313 seconds, CL-PPCRE: 0.1400 seconds) -1357: 0.4133 (100000 repetitions, Perl: 0.3145 seconds, CL-PPCRE: 0.1300 seconds) -1358: 0.4143 (100000 repetitions, Perl: 0.3379 seconds, CL-PPCRE: 0.1400 seconds) -1359: 0.3678 (100000 repetitions, Perl: 0.3806 seconds, CL-PPCRE: 0.1400 seconds) -1360: 0.4124 (100000 repetitions, Perl: 0.3637 seconds, CL-PPCRE: 0.1500 seconds) -1361: 0.4276 (100000 repetitions, Perl: 0.3508 seconds, CL-PPCRE: 0.1500 seconds) -1362: 0.4059 (100000 repetitions, Perl: 0.3449 seconds, CL-PPCRE: 0.1400 seconds) -1363: 0.3658 (100000 repetitions, Perl: 0.3827 seconds, CL-PPCRE: 0.1400 seconds) -1364: 0.4070 (100000 repetitions, Perl: 0.3440 seconds, CL-PPCRE: 0.1400 seconds) -1365: 0.4046 (100000 repetitions, Perl: 0.2966 seconds, CL-PPCRE: 0.1200 seconds) -1366: 0.3032 (100000 repetitions, Perl: 0.2639 seconds, CL-PPCRE: 0.0800 seconds) -1367: 0.5464 (100000 repetitions, Perl: 0.1464 seconds, CL-PPCRE: 0.0800 seconds) -1368: 0.2849 (100000 repetitions, Perl: 0.1404 seconds, CL-PPCRE: 0.0400 seconds) -1369: 0.4075 (100000 repetitions, Perl: 0.4172 seconds, CL-PPCRE: 0.1700 seconds) -1370: 0.9250 (1000000 repetitions, Perl: 0.6162 seconds, CL-PPCRE: 0.5700 seconds) -1371: 0.4216 (100000 repetitions, Perl: 0.7589 seconds, CL-PPCRE: 0.3200 seconds) -1372: 0.4316 (100000 repetitions, Perl: 0.7877 seconds, CL-PPCRE: 0.3400 seconds) -1373: 0.6365 (100000 repetitions, Perl: 0.2828 seconds, CL-PPCRE: 0.1800 seconds) -1374: 0.7316 (100000 repetitions, Perl: 0.2324 seconds, CL-PPCRE: 0.1700 seconds) -1375: 0.6991 (100000 repetitions, Perl: 0.2575 seconds, CL-PPCRE: 0.1800 seconds) -1376: 0.4090 (100000 repetitions, Perl: 0.3912 seconds, CL-PPCRE: 0.1600 seconds) -1377: 0.2652 (100000 repetitions, Perl: 0.1885 seconds, CL-PPCRE: 0.0500 seconds) -1378: 0.3020 (100000 repetitions, Perl: 0.1325 seconds, CL-PPCRE: 0.0400 seconds) -1379: 0.2309 (100000 repetitions, Perl: 0.1299 seconds, CL-PPCRE: 0.0300 seconds) -1380: 0.2177 (100000 repetitions, Perl: 0.1838 seconds, CL-PPCRE: 0.0400 seconds) -1381: 0.2384 (100000 repetitions, Perl: 0.1678 seconds, CL-PPCRE: 0.0400 seconds) -1382: 0.2337 (100000 repetitions, Perl: 0.1711 seconds, CL-PPCRE: 0.0400 seconds) -1383: 0.2700 (100000 repetitions, Perl: 0.1852 seconds, CL-PPCRE: 0.0500 seconds) -1384: 0.2408 (100000 repetitions, Perl: 0.1661 seconds, CL-PPCRE: 0.0400 seconds) -1385: 0.4655 (100000 repetitions, Perl: 0.3437 seconds, CL-PPCRE: 0.1600 seconds) -1386: 0.8942 (100000 repetitions, Perl: 0.1342 seconds, CL-PPCRE: 0.1200 seconds) -1387: 0.3001 (100000 repetitions, Perl: 0.3665 seconds, CL-PPCRE: 0.1100 seconds) -1388: 0.3030 (100000 repetitions, Perl: 0.5611 seconds, CL-PPCRE: 0.1700 seconds) -1389: 0.3822 (100000 repetitions, Perl: 0.6802 seconds, CL-PPCRE: 0.2600 seconds) -1390: 0.4852 (100000 repetitions, Perl: 0.2473 seconds, CL-PPCRE: 0.1200 seconds) -1391: 0.7024 (100000 repetitions, Perl: 0.1424 seconds, CL-PPCRE: 0.1000 seconds) -1392: 0.3041 (100000 repetitions, Perl: 0.1644 seconds, CL-PPCRE: 0.0500 seconds) -1393: 0.5266 (100000 repetitions, Perl: 0.1709 seconds, CL-PPCRE: 0.0900 seconds) -1394: 0.3038 (100000 repetitions, Perl: 0.1646 seconds, CL-PPCRE: 0.0500 seconds) -1395: 0.4551 (100000 repetitions, Perl: 0.1758 seconds, CL-PPCRE: 0.0800 seconds) -1396: 0.3618 (1000000 repetitions, Perl: 0.8845 seconds, CL-PPCRE: 0.3200 seconds) -1397: 0.4574 (1000000 repetitions, Perl: 0.7651 seconds, CL-PPCRE: 0.3500 seconds) -1398: 0.3032 (100000 repetitions, Perl: 0.1649 seconds, CL-PPCRE: 0.0500 seconds) -1399: 0.4585 (100000 repetitions, Perl: 0.1745 seconds, CL-PPCRE: 0.0800 seconds) -1400: 0.3029 (100000 repetitions, Perl: 0.1651 seconds, CL-PPCRE: 0.0500 seconds) -1401: 0.4451 (100000 repetitions, Perl: 0.1797 seconds, CL-PPCRE: 0.0800 seconds) -1402: 0.4356 (1000000 repetitions, Perl: 0.7805 seconds, CL-PPCRE: 0.3400 seconds) -1403: 0.4575 (1000000 repetitions, Perl: 0.7651 seconds, CL-PPCRE: 0.3500 seconds) -1404: 0.3098 (100000 repetitions, Perl: 0.1614 seconds, CL-PPCRE: 0.0500 seconds) -1405: 0.4778 (100000 repetitions, Perl: 0.1674 seconds, CL-PPCRE: 0.0800 seconds) -1406: 0.3176 (100000 repetitions, Perl: 0.1574 seconds, CL-PPCRE: 0.0500 seconds) -1407: 0.5297 (100000 repetitions, Perl: 0.1699 seconds, CL-PPCRE: 0.0900 seconds) -1408: 0.3185 (100000 repetitions, Perl: 0.1570 seconds, CL-PPCRE: 0.0500 seconds) -1409: 0.4814 (1000000 repetitions, Perl: 0.7686 seconds, CL-PPCRE: 0.3700 seconds) -1410: 0.3147 (100000 repetitions, Perl: 0.1589 seconds, CL-PPCRE: 0.0500 seconds) -1411: 0.5297 (100000 repetitions, Perl: 0.1699 seconds, CL-PPCRE: 0.0900 seconds) -1412: 0.4106 (1000000 repetitions, Perl: 0.7793 seconds, CL-PPCRE: 0.3200 seconds) -1413: 0.4384 (1000000 repetitions, Perl: 0.7756 seconds, CL-PPCRE: 0.3400 seconds) -1414: 0.3158 (100000 repetitions, Perl: 0.1583 seconds, CL-PPCRE: 0.0500 seconds) -1415: 0.4746 (100000 repetitions, Perl: 0.1686 seconds, CL-PPCRE: 0.0800 seconds) -1416: 0.3202 (100000 repetitions, Perl: 0.1561 seconds, CL-PPCRE: 0.0500 seconds) -1417: 0.5344 (100000 repetitions, Perl: 0.1684 seconds, CL-PPCRE: 0.0900 seconds) -1418: 0.4052 (1000000 repetitions, Perl: 0.7651 seconds, CL-PPCRE: 0.3100 seconds) -1419: 0.3992 (1000000 repetitions, Perl: 0.7765 seconds, CL-PPCRE: 0.3100 seconds) -1420: 0.3187 (100000 repetitions, Perl: 0.1569 seconds, CL-PPCRE: 0.0500 seconds) -1421: 0.4692 (100000 repetitions, Perl: 0.1705 seconds, CL-PPCRE: 0.0800 seconds) -1422: 0.4313 (1000000 repetitions, Perl: 0.7652 seconds, CL-PPCRE: 0.3300 seconds) -1423: 0.4179 (1000000 repetitions, Perl: 0.7656 seconds, CL-PPCRE: 0.3200 seconds) -1424: 0.9233 (1000000 repetitions, Perl: 0.6174 seconds, CL-PPCRE: 0.5700 seconds) -1425: 0.5082 (100000 repetitions, Perl: 0.1377 seconds, CL-PPCRE: 0.0700 seconds) -1426: 0.5301 (100000 repetitions, Perl: 0.1698 seconds, CL-PPCRE: 0.0900 seconds) -1427: 0.4377 (100000 repetitions, Perl: 0.1371 seconds, CL-PPCRE: 0.0600 seconds) -1428: 0.8477 (100000 repetitions, Perl: 0.1533 seconds, CL-PPCRE: 0.1300 seconds) -1429: 0.5569 (100000 repetitions, Perl: 0.1616 seconds, CL-PPCRE: 0.0900 seconds) -1430: 0.5470 (100000 repetitions, Perl: 0.1645 seconds, CL-PPCRE: 0.0900 seconds) -1431: 0.2694 (100000 repetitions, Perl: 0.3340 seconds, CL-PPCRE: 0.0900 seconds) -1432: 0.3398 (100000 repetitions, Perl: 0.2648 seconds, CL-PPCRE: 0.0900 seconds) -1433: 0.3196 (100000 repetitions, Perl: 0.1564 seconds, CL-PPCRE: 0.0500 seconds) -1434: 0.2563 (100000 repetitions, Perl: 0.1561 seconds, CL-PPCRE: 0.0400 seconds) -1435: 0.2549 (100000 repetitions, Perl: 0.1569 seconds, CL-PPCRE: 0.0400 seconds) -1436: 0.3966 (1000000 repetitions, Perl: 0.7817 seconds, CL-PPCRE: 0.3100 seconds) -1437: 0.3186 (100000 repetitions, Perl: 0.1569 seconds, CL-PPCRE: 0.0500 seconds) -1438: 0.2879 (100000 repetitions, Perl: 0.1737 seconds, CL-PPCRE: 0.0500 seconds) -1440: 0.4261 (100000 repetitions, Perl: 0.1877 seconds, CL-PPCRE: 0.0800 seconds) -1441: 0.2673 (100000 repetitions, Perl: 0.1871 seconds, CL-PPCRE: 0.0500 seconds) -1442: 0.3109 (100000 repetitions, Perl: 0.2573 seconds, CL-PPCRE: 0.0800 seconds) -1443: 0.8570 (100000 repetitions, Perl: 0.1750 seconds, CL-PPCRE: 0.1500 seconds) -1444: 0.4761 (100000 repetitions, Perl: 0.1470 seconds, CL-PPCRE: 0.0700 seconds) -1445: 0.2776 (100000 repetitions, Perl: 0.1441 seconds, CL-PPCRE: 0.0400 seconds) -1446: 0.4592 (100000 repetitions, Perl: 0.1525 seconds, CL-PPCRE: 0.0700 seconds) -1447: 0.4758 (100000 repetitions, Perl: 0.1471 seconds, CL-PPCRE: 0.0700 seconds) -1448: 0.5301 (100000 repetitions, Perl: 0.1698 seconds, CL-PPCRE: 0.0900 seconds) -1449: 0.6724 (100000 repetitions, Perl: 0.1933 seconds, CL-PPCRE: 0.1300 seconds) -1450: 0.6677 (100000 repetitions, Perl: 0.1947 seconds, CL-PPCRE: 0.1300 seconds) -1451: 0.4503 (100000 repetitions, Perl: 0.1999 seconds, CL-PPCRE: 0.0900 seconds) -1452: 0.4078 (100000 repetitions, Perl: 0.1962 seconds, CL-PPCRE: 0.0800 seconds) -1453: 0.5974 (100000 repetitions, Perl: 0.1339 seconds, CL-PPCRE: 0.0800 seconds) -1454: 0.6096 (100000 repetitions, Perl: 0.1312 seconds, CL-PPCRE: 0.0800 seconds) -1455: 0.4783 (100000 repetitions, Perl: 0.1464 seconds, CL-PPCRE: 0.0700 seconds) -1456: 0.2228 (100000 repetitions, Perl: 0.1347 seconds, CL-PPCRE: 0.0300 seconds) -1457: 0.3958 (100000 repetitions, Perl: 0.1516 seconds, CL-PPCRE: 0.0600 seconds) -1458: 0.4623 (100000 repetitions, Perl: 0.1514 seconds, CL-PPCRE: 0.0700 seconds) -1459: 0.4619 (100000 repetitions, Perl: 0.1515 seconds, CL-PPCRE: 0.0700 seconds) -1460: 0.4710 (100000 repetitions, Perl: 0.1699 seconds, CL-PPCRE: 0.0800 seconds) -1461: 0.4722 (100000 repetitions, Perl: 0.1482 seconds, CL-PPCRE: 0.0700 seconds) -1462: 0.5930 (100000 repetitions, Perl: 0.1686 seconds, CL-PPCRE: 0.1000 seconds) -1463: 0.5698 (100000 repetitions, Perl: 0.1579 seconds, CL-PPCRE: 0.0900 seconds) -1464: 0.8227 (1000000 repetitions, Perl: 0.6199 seconds, CL-PPCRE: 0.5100 seconds) -1465: 0.5918 (100000 repetitions, Perl: 0.1352 seconds, CL-PPCRE: 0.0800 seconds) -1466: 0.7302 (100000 repetitions, Perl: 0.1370 seconds, CL-PPCRE: 0.1000 seconds) -1467: 0.3578 (100000 repetitions, Perl: 0.2795 seconds, CL-PPCRE: 0.1000 seconds) -1468: 0.3107 (100000 repetitions, Perl: 0.2574 seconds, CL-PPCRE: 0.0800 seconds) -1469: 0.3741 (100000 repetitions, Perl: 0.2139 seconds, CL-PPCRE: 0.0800 seconds) -1470: 0.4383 (100000 repetitions, Perl: 0.2281 seconds, CL-PPCRE: 0.1000 seconds) -1471: 0.1875 (100000 repetitions, Perl: 0.1600 seconds, CL-PPCRE: 0.0300 seconds) -1472: 0.1889 (100000 repetitions, Perl: 0.1588 seconds, CL-PPCRE: 0.0300 seconds) -1473: 0.2495 (100000 repetitions, Perl: 0.1603 seconds, CL-PPCRE: 0.0400 seconds) -1474: 0.2374 (100000 repetitions, Perl: 0.1685 seconds, CL-PPCRE: 0.0400 seconds) -1475: 0.5786 (100000 repetitions, Perl: 0.2420 seconds, CL-PPCRE: 0.1400 seconds) -1476: 0.3304 (100000 repetitions, Perl: 0.2724 seconds, CL-PPCRE: 0.0900 seconds) -1477: 0.4475 (100000 repetitions, Perl: 0.1788 seconds, CL-PPCRE: 0.0800 seconds) -1478: 0.6218 (100000 repetitions, Perl: 0.2412 seconds, CL-PPCRE: 0.1500 seconds) -1479: 0.5484 (100000 repetitions, Perl: 0.1459 seconds, CL-PPCRE: 0.0800 seconds) -1480: 0.6176 (100000 repetitions, Perl: 0.1457 seconds, CL-PPCRE: 0.0900 seconds) -1481: 0.5064 (100000 repetitions, Perl: 0.2567 seconds, CL-PPCRE: 0.1300 seconds) -1482: 0.9923 (100000 repetitions, Perl: 0.3023 seconds, CL-PPCRE: 0.3000 seconds) -1483: 0.4191 (100000 repetitions, Perl: 0.1909 seconds, CL-PPCRE: 0.0800 seconds) -1484: 0.4962 (100000 repetitions, Perl: 0.1814 seconds, CL-PPCRE: 0.0900 seconds) -1485: 0.5508 (100000 repetitions, Perl: 0.2542 seconds, CL-PPCRE: 0.1400 seconds) -1486: 1.0588 (100000 repetitions, Perl: 0.3022 seconds, CL-PPCRE: 0.3200 seconds) -1487: 0.7284 (100000 repetitions, Perl: 0.6453 seconds, CL-PPCRE: 0.4700 seconds) -1488: 0.7429 (100000 repetitions, Perl: 0.6461 seconds, CL-PPCRE: 0.4800 seconds) -1489: 0.4189 (100000 repetitions, Perl: 0.1910 seconds, CL-PPCRE: 0.0800 seconds) -1490: 0.3235 (100000 repetitions, Perl: 0.1546 seconds, CL-PPCRE: 0.0500 seconds) -1491: 0.5143 (100000 repetitions, Perl: 0.1556 seconds, CL-PPCRE: 0.0800 seconds) -1492: 0.4563 (100000 repetitions, Perl: 0.1534 seconds, CL-PPCRE: 0.0700 seconds) -1493: 0.5185 (100000 repetitions, Perl: 0.1543 seconds, CL-PPCRE: 0.0800 seconds) -1494: 0.4955 (100000 repetitions, Perl: 0.1615 seconds, CL-PPCRE: 0.0800 seconds) -1495: 0.4944 (100000 repetitions, Perl: 0.1618 seconds, CL-PPCRE: 0.0800 seconds) -1496: 0.4331 (100000 repetitions, Perl: 0.8082 seconds, CL-PPCRE: 0.3500 seconds) -1497: 0.7886 (1000000 repetitions, Perl: 0.7608 seconds, CL-PPCRE: 0.6000 seconds) -1498: 0.5902 (1000000 repetitions, Perl: 0.7624 seconds, CL-PPCRE: 0.4500 seconds) -1499: 0.2554 (100000 repetitions, Perl: 0.1566 seconds, CL-PPCRE: 0.0400 seconds) -1500: 0.2541 (100000 repetitions, Perl: 0.1574 seconds, CL-PPCRE: 0.0400 seconds) -1501: 0.2524 (100000 repetitions, Perl: 0.1585 seconds, CL-PPCRE: 0.0400 seconds) -1502: 0.3265 (100000 repetitions, Perl: 0.3369 seconds, CL-PPCRE: 0.1100 seconds) -1503: 0.3811 (100000 repetitions, Perl: 0.3674 seconds, CL-PPCRE: 0.1400 seconds) -1504: 0.3815 (100000 repetitions, Perl: 0.3670 seconds, CL-PPCRE: 0.1400 seconds) -1505: 0.3818 (100000 repetitions, Perl: 0.3667 seconds, CL-PPCRE: 0.1400 seconds) -1506: 0.4213 (100000 repetitions, Perl: 0.4510 seconds, CL-PPCRE: 0.1900 seconds) -1507: 0.4781 (100000 repetitions, Perl: 0.5438 seconds, CL-PPCRE: 0.2600 seconds) -1508: 0.6455 (100000 repetitions, Perl: 0.6972 seconds, CL-PPCRE: 0.4500 seconds) -1509: 0.5764 (100000 repetitions, Perl: 0.5899 seconds, CL-PPCRE: 0.3400 seconds) -1510: 0.5361 (100000 repetitions, Perl: 0.4850 seconds, CL-PPCRE: 0.2600 seconds) -1511: 0.7082 (1000000 repetitions, Perl: 0.6495 seconds, CL-PPCRE: 0.4600 seconds) -1512: 0.5625 (100000 repetitions, Perl: 0.1600 seconds, CL-PPCRE: 0.0900 seconds) -1513: 0.5700 (100000 repetitions, Perl: 0.1579 seconds, CL-PPCRE: 0.0900 seconds) -1514: 0.5287 (100000 repetitions, Perl: 0.2837 seconds, CL-PPCRE: 0.1500 seconds) -1515: 0.5201 (100000 repetitions, Perl: 0.2884 seconds, CL-PPCRE: 0.1500 seconds) -1516: 0.5035 (100000 repetitions, Perl: 0.2780 seconds, CL-PPCRE: 0.1400 seconds) -1517: 0.5849 (100000 repetitions, Perl: 0.2906 seconds, CL-PPCRE: 0.1700 seconds) -1518: 0.6021 (100000 repetitions, Perl: 0.2824 seconds, CL-PPCRE: 0.1700 seconds) -1519: 0.6077 (100000 repetitions, Perl: 0.3127 seconds, CL-PPCRE: 0.1900 seconds) -1520: 0.7115 (100000 repetitions, Perl: 0.6746 seconds, CL-PPCRE: 0.4800 seconds) -1521: 0.7063 (100000 repetitions, Perl: 0.6796 seconds, CL-PPCRE: 0.4800 seconds) -1522: 0.7059 (100000 repetitions, Perl: 0.6658 seconds, CL-PPCRE: 0.4700 seconds) -1523: 0.7191 (100000 repetitions, Perl: 0.6675 seconds, CL-PPCRE: 0.4800 seconds) -1524: 0.4683 (100000 repetitions, Perl: 0.1922 seconds, CL-PPCRE: 0.0900 seconds) -1525: 0.4213 (100000 repetitions, Perl: 0.2136 seconds, CL-PPCRE: 0.0900 seconds) -1526: 0.0286 (10000 repetitions, Perl: 0.3498 seconds, CL-PPCRE: 0.0100 seconds) -1527: 0.6763 (100000 repetitions, Perl: 0.8429 seconds, CL-PPCRE: 0.5700 seconds) -1528: 0.8554 (1000000 repetitions, Perl: 0.8768 seconds, CL-PPCRE: 0.7500 seconds) -1529: 0.9597 (100000 repetitions, Perl: 0.1146 seconds, CL-PPCRE: 0.1100 seconds) -1530: 0.2910 (100000 repetitions, Perl: 0.2406 seconds, CL-PPCRE: 0.0700 seconds) -1531: 0.2867 (100000 repetitions, Perl: 0.2442 seconds, CL-PPCRE: 0.0700 seconds) -1532: 0.3131 (100000 repetitions, Perl: 0.1597 seconds, CL-PPCRE: 0.0500 seconds) -1533: 0.3589 (100000 repetitions, Perl: 0.2508 seconds, CL-PPCRE: 0.0900 seconds) -1534: 0.3536 (100000 repetitions, Perl: 0.2546 seconds, CL-PPCRE: 0.0900 seconds) -1535: 0.3596 (100000 repetitions, Perl: 0.1947 seconds, CL-PPCRE: 0.0700 seconds) -1536: 0.3210 (100000 repetitions, Perl: 0.2492 seconds, CL-PPCRE: 0.0800 seconds) -1537: 0.2765 (100000 repetitions, Perl: 0.2531 seconds, CL-PPCRE: 0.0700 seconds) -1538: 0.3216 (100000 repetitions, Perl: 0.1866 seconds, CL-PPCRE: 0.0600 seconds) -1539: 0.3169 (100000 repetitions, Perl: 0.2524 seconds, CL-PPCRE: 0.0800 seconds) -1540: 0.3192 (100000 repetitions, Perl: 0.2506 seconds, CL-PPCRE: 0.0800 seconds) -1541: 0.3373 (100000 repetitions, Perl: 0.2075 seconds, CL-PPCRE: 0.0700 seconds) -1542: 0.7186 (100000 repetitions, Perl: 0.2644 seconds, CL-PPCRE: 0.1900 seconds) -1543: 0.7809 (100000 repetitions, Perl: 0.4354 seconds, CL-PPCRE: 0.3400 seconds) -1544: 0.7975 (100000 repetitions, Perl: 0.4389 seconds, CL-PPCRE: 0.3500 seconds) -1545: 0.7251 (100000 repetitions, Perl: 0.2620 seconds, CL-PPCRE: 0.1900 seconds) -1546: 0.7521 (100000 repetitions, Perl: 0.4387 seconds, CL-PPCRE: 0.3300 seconds) -1547: 0.8778 (100000 repetitions, Perl: 0.4443 seconds, CL-PPCRE: 0.3900 seconds) -1548: 0.5969 (100000 repetitions, Perl: 0.3016 seconds, CL-PPCRE: 0.1800 seconds) -1549: 0.7601 (100000 repetitions, Perl: 0.4736 seconds, CL-PPCRE: 0.3600 seconds) -1550: 0.7864 (100000 repetitions, Perl: 0.4832 seconds, CL-PPCRE: 0.3800 seconds) -1551: 0.5106 (100000 repetitions, Perl: 0.3330 seconds, CL-PPCRE: 0.1700 seconds) -1552: 0.4608 (100000 repetitions, Perl: 0.3038 seconds, CL-PPCRE: 0.1400 seconds) -1553: 0.4988 (100000 repetitions, Perl: 0.3207 seconds, CL-PPCRE: 0.1600 seconds) -1554: 0.3418 (100000 repetitions, Perl: 0.3803 seconds, CL-PPCRE: 0.1300 seconds) -1555: 0.3461 (100000 repetitions, Perl: 0.2311 seconds, CL-PPCRE: 0.0800 seconds) -1556: 0.2425 (100000 repetitions, Perl: 0.1237 seconds, CL-PPCRE: 0.0300 seconds) -1557: 0.3378 (100000 repetitions, Perl: 0.1184 seconds, CL-PPCRE: 0.0400 seconds) -1558: 0.3310 (100000 repetitions, Perl: 0.1208 seconds, CL-PPCRE: 0.0400 seconds) -1559: 0.3415 (100000 repetitions, Perl: 0.1171 seconds, CL-PPCRE: 0.0400 seconds) -1560: 0.3131 (1000000 repetitions, Perl: 0.8943 seconds, CL-PPCRE: 0.2800 seconds) -1561: 0.3385 (100000 repetitions, Perl: 0.1182 seconds, CL-PPCRE: 0.0400 seconds) -1562: 0.2542 (100000 repetitions, Perl: 0.1180 seconds, CL-PPCRE: 0.0300 seconds) -1563: 0.2498 (100000 repetitions, Perl: 0.1201 seconds, CL-PPCRE: 0.0300 seconds) -1564: 0.3125 (1000000 repetitions, Perl: 0.8961 seconds, CL-PPCRE: 0.2800 seconds) \ No newline at end of file diff --git a/doc/index.html b/doc/index.html index eefdc09..3742814 100644 --- a/doc/index.html +++ b/doc/index.html @@ -36,84 +36,18 @@ which has the following features:
    -
  • It is compatible with Perl. (Well - as far as you can be -compatible with a language defined by its ever-changing -implementation. As of December 2002 CL-PPCRE was more -compatible with the regex semantics of Perl 5.8.0 than, say, -Perl 5.6.1 was...) It even correctly parses and -applies Jeffrey -Friedl's famous 6600-byte long RFC822 address pattern. +
  • It is compatible with Perl. -
  • It is fast. Used with a Lisp compiler which compiles to -native code it is on par with Perl's highly -optimized regex engine (written in C) which to my knowledge is faster -than most other regex engines around. +
  • It is pretty fast. -
  • It is portable, i.e. the code aims to be strictly ANSI-compliant. If -you encounter any deviations, this is an error and should be -reported to the mailing list. CL-PPCRE has been -successfully tested with the following Common Lisp implementations: +
  • It is portable between ANSI-compliant Common Lisp +implementations. - - -If you succeed in using CL-PPCRE on other platforms, please let us know. - -
    -Note that the tests mainly made sure that the package compiled -without errors and that the test suite - which -compiles about 1,500 regex strings into scanners and applies these to -target strings with the SCAN function -- yields the expected results. Other functions like SPLIT, ALL-MATCHES, REGEX-REPLACE, REGEX-APROPOS, or the DO-macros have only been tested -on CMUCL and LispWorks which were my main development platforms. - -
    Also, I don't have the time to re-test any implementation with -every new release of CL-PPCRE. Let us -know if your implementation is listed above and fails with a -recent version and I'll try to fix it. - -
  • It is thread-safe. Although the code uses closures -extensively, no state which dynamically changes during the scanning -process is stored in the lexical environments of the closures, so it -should be safe to use CL-PPCRE in a multi-threaded program. Tests with -LispWorks and Scieneer Common Lisp seem to confirm this. - -
  • It comes with convenient features like a SPLIT function, a couple of DO-like loop constructs, and a regex-based APROPOS feature -similar to the one found in Emacs. +
  • It is thread-safe.
  • In addition to specifying regular expressions as strings like in Perl you can also use S-expressions which obviously is -more Lisp-y. - -
  • Is it is fully documented so I might have a chance to -understand my own code in about six months... :) +href="#create-scanner2">S-expressions.
  • It comes with a BSD-style @@ -139,37 +73,59 @@ href="http://weitz.de/regex-coach/">The Regex Coach.
  • Support and mailing lists
  • The CL-PPCRE dictionary
      -
    1. create-scanner (for Perl regex strings) -
    2. create-scanner (for parse trees) -
    3. parse-tree-synonym -
    4. define-parse-tree-synonym -
    5. scan -
    6. scan-to-strings -
    7. register-groups-bind -
    8. do-scans -
    9. do-matches -
    10. do-matches-as-strings -
    11. do-register-groups -
    12. all-matches -
    13. all-matches-as-strings -
    14. split -
    15. regex-replace -
    16. regex-replace-all -
    17. regex-apropos -
    18. regex-apropos-list -
    19. *regex-char-code-limit* -
    20. *use-bmh-matchers* -
    21. *allow-quoting* -
    22. *allow-named-registers* -
    23. quote-meta-chars -
    24. ppcre-error -
    25. ppcre-invocation-error -
    26. ppcre-syntax-error -
    27. ppcre-syntax-error-string -
    28. ppcre-syntax-error-pos +
    29. Scanning +
        +
      1. create-scanner (for Perl regex strings) +
      2. create-scanner (for parse trees) +
      3. scan +
      4. scan-to-strings +
      5. register-groups-bind +
      6. do-scans +
      7. do-matches +
      8. do-matches-as-strings +
      9. do-register-groups +
      10. all-matches +
      11. all-matches-as-strings +
      +
    30. Splitting and replacing +
        +
      1. split +
      2. regex-replace +
      3. regex-replace-all +
      +
    31. Modifying scanner behaviour +
        +
      1. *property-resolver* +
      2. parse-tree-synonym +
      3. define-parse-tree-synonym +
      4. *regex-char-code-limit* +
      5. *use-bmh-matchers* +
      6. *optimize-char-classes* +
      7. *allow-quoting* +
      8. *allow-named-registers* +
      +
    32. Miscellaneous +
        +
      1. parse-string +
      2. create-optimized-test-function +
      3. quote-meta-chars +
      4. regex-apropos +
      5. regex-apropos-list +
      +
    33. Conditions +
        +
      1. ppcre-error +
      2. ppcre-invocation-error +
      3. ppcre-syntax-error +
      4. ppcre-syntax-error-string +
      5. ppcre-syntax-error-pos +
      +
    +
  • Unicode properties +
      +
    1. unicode-property-resolver
  • Filters -
  • Testing CL-PPCRE
  • Compatibility with Perl
    1. Empty strings instead of undef in $1, $2, etc. @@ -177,21 +133,15 @@ href="http://weitz.de/regex-coach/">The Regex Coach.
    2. Inconsistent capturing of $1, $2, etc.
    3. Captured groups not available outside of look-aheads and look-behinds
    4. Alternations don't always work from left to right +
    5. Different names for Unicode properties
    6. "\r" doesn't work with MCL
    7. What about "\w"?
    -
  • Performance -
      -
    1. Benchmarking -
    2. Other performance issues -
  • Bugs and problems
      -
    1. Stack overflow
    2. "\Q" doesn't work, or does it?
    3. Backslashes may confuse you...
    -
  • Remarks
  • AllegroCL compatibility mode
  • Acknowledgements @@ -200,52 +150,26 @@ href="http://weitz.de/regex-coach/">The Regex Coach. CL-PPCRE together with this documentation can be downloaded from http://weitz.de/files/cl-ppcre.tar.gz. The -current version is 1.4.1. +current version is 2.0.0.

    -If you're on Debian, you should -probably use the cl-ppcre -Debian package which is available thanks to Peter van Eynde and Kevin -Rosenberg. There's also a port -for Gentoo Linux thanks to Matthew Kennedy and a FreeBSD port thanks to Henrik Motakef. -Installation via asdf-install should as well -be possible. +CL-PPCRE comes with a system definition +for ASDF and you compile and +load it in the usual way. There are no dependencies (except that the +test suite which is not needed for normal operation depends +on FLEXI-STREAMS).

    -CL-PPCRE comes with simple system definitions for MK:DEFSYSTEM and asdf so you can either adapt it -to your needs or just unpack the archive and from within the CL-PPCRE -directory start your Lisp image and evaluate the form -(mk:compile-system "cl-ppcre") (or the -equivalent one for asdf) which should compile and load the whole -system. +CL-PPCRE is integrated into the package/port systems +of Debian, Gentoo, +and FreeBSD, but before you +install it from there, you should check if they actually offer the +latest release. Installation +via ASDF-Install +should as well be possible.

    -If for some reason you don't want to use MK:DEFSYSTEM or asdf, you -can just LOAD the file load.lisp or you -can also get away with something like this: - +You can run a test suite which tests most aspects of the library with

    -(loop for name in '("packages" "specials" "util" "errors" "lexer"
    -                    "parser" "regex-class" "convert" "optimize"
    -                    "closures" "repetition-closures" "scanner" "api")
    -      do (compile-file (make-pathname :name name
    -                                      :type "lisp"))
    -         (load name))
    +(asdf:oos 'asdf:test-op :cl-ppcre)
     
    - -Note that on CL implementations which use the Python compiler -(i.e. CMUCL, SBCL, SCL) you can concatenate the compiled object files -to create one single object file which you can load afterwards: - -
    -cat {packages,specials,util,errors,lexer,parser,regex-class,convert,optimize,closures,repetition-closures,scanner,api}.x86f > cl-ppcre.x86f
    -
    - -(Replace ".x86f" with the correct suffix for -your platform.) -

    -Note that there is no public CVS repository for CL-PPCRE - the repository at common-lisp.net is out of date and not in sync with the (current) version distributed from weitz.de.

    Luís Oliveira maintains a darcs repository of CL-PPCRE @@ -270,7 +194,7 @@ If you want to send patches, please read
     

    The CL-PPCRE dictionary

    -CL-PPCRE exports the following symbols: +

    Scanning


    [Method]
    create-scanner (string string)&key case-insensitive-mode multi-line-mode single-line-mode extended-mode destructive => scanner, register-names @@ -283,9 +207,8 @@ The mode keyword arguments are equivalent to the "imsx" modifiers in Perl. The destructive keyword will be ignored.

    -The function accepts most of the regex syntax of Perl 5 as described -in man +The function accepts most of the regex syntax of Perl 5.8 as described +in man perlre including extended features like non-greedy repetitions, positive and negative look-ahead and look-behind assertions, "standalone" subexpressions, and conditional @@ -303,13 +226,12 @@ they obviously don't make sense in Lisp. because they're actually not part of Perl's regex syntax and (honestly) because I was too lazy - but see CL-INTERPOL. -

  • \pP and \PP (named properties), -\X (extended Unicode), and \C (single +
  • \X (extended Unicode), and \C (single character). But you can of course use all characters supported by your CL implementation. -
  • Posix character classes like [[:alpha]]. I -might add this in the future. +
  • Posix character classes like [[:alpha]]. +Use Unicode properties instead.
  • \G for Perl's pos() because we don't have it. @@ -323,10 +245,16 @@ codes), \c[ (control characters), \w, \D, \b, \B, \A, \Z, and \z are supported.

    -Since version 0.6.0 CL-PPCRE also supports Perl's \Q and \E - see \Q and \E - see *ALLOW-QUOTING* below. Make sure you also read the relevant section in "Bugs and problems."

    -Since version 1.3.0 CL-PPCRE offers support for AllegroCL's (?<name>"<regex>") named registers and \k<name> back-references syntax, have a look at *ALLOW-NAMED-REGISTERS* for details. +Since version 1.3.0, CL-PPCRE offers support for AllegroCL's (?<name>"<regex>") named registers and \k<name> back-references syntax, have a look at *ALLOW-NAMED-REGISTERS* for details. +

    +Since version 2.0.0, CL-PPCRE +supports named properties +(\p and \P), but only the long form with +braces is supported, i.e. \p{Letter} +and \p{L} will work while \pL won't.

    The keyword arguments are just for your convenience. You can always use embedded modifiers like @@ -334,8 +262,11 @@ convenience. You can always use embedded modifiers like


    [Method]
    create-scanner (function function)&key case-insensitive-mode multi-line-mode single-line-mode extended-mode destructive => scanner -


    -In this case function should be a scanner returned by another invocation of CREATE-SCANNER. It will be returned as is. +

    In this case function should be a +scanner returned by another invocation +of CREATE-SCANNER. It will be returned as is. You can't +use any of the keyword arguments because the scanner has already been +created and is immutable.


    [Method] @@ -473,6 +404,12 @@ is found. See *ALLOW-NAMED-REGISTERS* for more information. +

  • (:PROPERTY|:INVERTED-PROPERTY <property>) is +a named property (or its inverse) with +<property> being a function designator or a +string which must be resolved +by *PROPERTY-RESOLVER*. +
  • (:FILTER <function> &optional <length>) where <function> is a .
  • (:CHAR-CLASS|:INVERTED-CHAR-CLASS {<item>}*) where <item> -is either a character, a character range, or a symbol for a -special character class (see above) will be translated into a (one -character wide) character class. A character range looks like +is either a character, a character range, a named property +(see above), or a symbol for a special character class (see above) +will be translated into a (one character wide) character +class. A character range looks like (:RANGE <char1> <char2>) where <char1> and <char2> are characters such that @@ -523,104 +461,37 @@ If destructive is not NIL (the default is

    If you want to find out how parse trees are related to Perl regex strings, you should play around with -CL-PPCRE::PARSE-STRING - a function which converts Perl -regex strings to parse trees. Here are some examples: +PARSE-STRING:

    -* (cl-ppcre::parse-string "(ab)*")
    +* (parse-string "(ab)*")
     (:GREEDY-REPETITION 0 NIL (:REGISTER "ab"))
     
    -* (cl-ppcre::parse-string "(a(b))")
    +* (parse-string "(a(b))")
     (:REGISTER (:SEQUENCE #\a (:REGISTER #\b)))
     
    -* (cl-ppcre::parse-string "(?:abc){3,5}")
    +* (parse-string "(?:abc){3,5}")
     (:GREEDY-REPETITION 3 5 (:GROUP "abc"))
     ;; (:GREEDY-REPETITION 3 5 "abc") would also be OK
     
    -* (cl-ppcre::parse-string "a(?i)b(?-i)c")
    +* (parse-string "a(?i)b(?-i)c")
     (:SEQUENCE #\a
      (:SEQUENCE (:FLAGS :CASE-INSENSITIVE-P)
       (:SEQUENCE #\b (:SEQUENCE (:FLAGS :CASE-SENSITIVE-P) #\c))))
     ;; same as (:SEQUENCE #\a :CASE-INSENSITIVE-P #\b :CASE-SENSITIVE-P #\c)
     
    -* (cl-ppcre::parse-string "(?=a)b")
    +* (parse-string "(?=a)b")
     (:SEQUENCE (:POSITIVE-LOOKAHEAD #\a) #\b)
     
  • -


    [Accessor] -
    parse-tree-synonym symbol => parse-tree -
    (setf (parse-tree-synonym symbol) new-parse-tree)
    - -


    -Any symbol (unless it's a keyword with a special meaning in parse -trees) can be made a "synonym", i.e. an abbreviation, for another parse -tree by this accessor. PARSE-TREE-SYNONYM returns NIL if symbol isn't a synonym yet. -

    -Here's an example: - -

    * (cl-ppcre::parse-string "a*b+")
    -(:SEQUENCE (:GREEDY-REPETITION 0 NIL #\a) (:GREEDY-REPETITION 1 NIL #\b))
    -
    -* (defun my-repetition (char min)
    -    `(:greedy-repetition ,min nil ,char))
    -MY-REPETITION
    -
    -* (setf (parse-tree-synonym 'a*) (my-repetition #\a 0))
    -(:GREEDY-REPETITION 0 NIL #\a)
    -
    -* (setf (parse-tree-synonym 'b+) (my-repetition #\b 1))
    -(:GREEDY-REPETITION 1 NIL #\b)
    -
    -* (let ((scanner (create-scanner '(:sequence a* b+))))
    -    (dolist (string '("ab" "b" "aab" "a" "x"))
    -      (print (scan scanner string)))
    -    (values))
    -0
    -0
    -0
    -NIL
    -NIL
    -
    -* (parse-tree-synonym 'a*)
    -(:GREEDY-REPETITION 0 NIL #\a)
    -
    -* (parse-tree-synonym 'a+)
    -NIL
    -
    - -


    [Macro] -
    define-parse-tree-synonym name parse-tree => parse-tree - -


    -This is a convenience macro for parse tree synonyms defined as - -
    (defmacro define-parse-tree-synonym (name parse-tree)
    -  `(eval-when (:compile-toplevel :load-toplevel :execute)
    -     (setf (parse-tree-synonym ',name) ',parse-tree)))
    -
    - -so you can write code like this: - -
    -(define-parse-tree-synonym a-z
    -  (:char-class (:range #\a #\z) (:range #\A #\Z)))
    -
    -(define-parse-tree-synonym a-z*
    -  (:greedy-repetition 0 nil a-z))
    -
    -(defun ascii-char-tester (string)
    -  (scan '(:sequence :start-anchor a-z* :end-anchor)
    -        string))
    -
    -


    -For the rest of this section regex can +For the rest of the dictionary, regex can always be a string (which is interpreted as a Perl regular expression), a parse tree, or a scanner created by -CREATE-SCANNER. The +CREATE-SCANNER. The start and end -keyword parameters are always used as in SCAN. +keyword parameters are always used as in SCAN. @@ -645,41 +516,39 @@ parameter real-start-pos. This one should target-string between start and end were a standalone string, i.e. look-aheads and look-behinds can't look beyond these boundaries. -

    -Examples:

    -* (cl-ppcre:scan "(a)*b" "xaaabd")
    +* (scan "(a)*b" "xaaabd")
     1
     5
     #(3)
     #(4)
     
    -* (cl-ppcre:scan "(a)*b" "xaaabd" :start 1)
    +* (scan "(a)*b" "xaaabd" :start 1)
     1
     5
     #(3)
     #(4)
     
    -* (cl-ppcre:scan "(a)*b" "xaaabd" :start 2)
    +* (scan "(a)*b" "xaaabd" :start 2)
     2
     5
     #(3)
     #(4)
     
    -* (cl-ppcre:scan "(a)*b" "xaaabd" :end 4)
    +* (scan "(a)*b" "xaaabd" :end 4)
     NIL
     
    -* (cl-ppcre:scan '(:GREEDY-REPETITION 0 NIL #\b) "bbbc")
    +* (scan '(:greedy-repetition 0 nil #\b) "bbbc")
     0
     3
     #()
     #()
     
    -* (cl-ppcre:scan '(:GREEDY-REPETITION 4 6 #\b) "bbbc")
    +* (scan '(:greedy-repetition 4 6 #\b) "bbbc")
     NIL
     
    -* (let ((s (cl-ppcre:create-scanner "(([a-c])+)x")))
    -    (cl-ppcre:scan s "abcxy"))
    +* (let ((s (create-scanner "(([a-c])+)x")))
    +    (scan s "abcxy"))
     0
     4
     #(0 2)
    @@ -698,18 +567,16 @@ function returns two values on success: the whole match as a string
     plus an array of substrings (or NILs) corresponding to
     the matched registers. If sharedp is true, the substrings may share structure with
     target-string.
    -

    -Examples:

    -* (cl-ppcre:scan-to-strings "[^b]*b" "aaabd")
    +* (scan-to-strings "[^b]*b" "aaabd")
     "aaab"
     #()
     
    -* (cl-ppcre:scan-to-strings "([^b])*b" "aaabd")
    +* (scan-to-strings "([^b])*b" "aaabd")
     "aaab"
     #("a")
     
    -* (cl-ppcre:scan-to-strings "(([^b])*)b" "aaabd")
    +* (scan-to-strings "(([^b])*)b" "aaabd")
     "aaab"
     #("aaa" "a")
     
    @@ -736,7 +603,6 @@ executed. For each element of group. The number of variables in var-list must not be greater than the number of register groups. If sharedp is true, the substrings may share structure with target-string. -

    Examples:

     * (register-groups-bind (first second third fourth)
           ("((a)|(b)|(c))+" "abababc" :sharedp t)
    @@ -756,8 +622,8 @@ NIL
     
     * (register-groups-bind (fname lname (#'parse-integer date month year))
           ("(\\w+)\\s+(\\w+)\\s+(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})" "Frank Zappa 21.12.1940")
    -    (list fname lname (encode-universal-time 0 0 0 date month year)))
    -("Frank" "Zappa" 1292882400)
    +    (list fname lname (encode-universal-time 0 0 0 date month year 0)))
    +("Frank" "Zappa" 1292889600)
     
    @@ -795,11 +661,10 @@ usage.

    Like DO-SCANS but doesn't bind variables to the register arrays. -

    Example:

     * (defun foo (regex target-string &key (start 0) (end (length target-string)))
         (let ((sum 0))
    -      (cl-ppcre:do-matches (s e regex target-string nil :start start :end end)
    +      (do-matches (s e regex target-string nil :start start :end end)
             (incf sum (- e s)))
           (format t "~,2F% of the string was inside of a match~%"
                     ;; note: doesn't check for division by zero
    @@ -826,12 +691,10 @@ Like DO-MATCHES but binds
     match-var to the substring of
     target-string corresponding to each match in turn. If sharedp is true, the substrings may share structure with
     target-string.
    -

    -Example:

     * (defun crossfoot (target-string &key (start 0) (end (length target-string)))
         (let ((sum 0))
    -      (cl-ppcre:do-matches-as-strings (m :digit-class
    +      (do-matches-as-strings (m :digit-class
                                              target-string nil
                                              :start start :end end)
             (incf sum (parse-integer m)))
    @@ -870,7 +733,6 @@ otherwise. An implicit block named NIL surrounds DO-REGISTER-
     an empty string, the scan is continued one position behind this
     match. If sharedp is true, the substrings may share structure with
     target-string.
    -

    Example:

     * (do-register-groups (first second third fourth)
           ("((a)|(b)|(c))" "abababc" nil :start 2 :sharedp t)
    @@ -903,13 +765,11 @@ of regex against
     matches the list contains (* 2 N) elements. If
     regex matches an empty string the scan is
     continued one position behind this match.
    -

    -Examples:

    -* (cl-ppcre:all-matches "a" "foo bar baz")
    +* (all-matches "a" "foo bar baz")
     (5 6 9 10)
     
    -* (cl-ppcre:all-matches "\\w*" "foo bar baz")
    +* (all-matches "\\w*" "foo bar baz")
     (0 3 3 3 4 7 7 7 8 11 11 11)
     
    @@ -923,19 +783,18 @@ Examples: Like ALL-MATCHES but returns a list of substrings instead. If sharedp is true, the substrings may share structure with target-string. -

    -Examples:

    -* (cl-ppcre:all-matches-as-strings "a" "foo bar baz")
    +* (all-matches-as-strings "a" "foo bar baz")
     ("a" "a")
     
    -* (cl-ppcre:all-matches-as-strings "\\w*" "foo bar baz")
    +* (all-matches-as-strings "\\w*" "foo bar baz")
     ("foo" "" "bar" "" "baz" "")
     
    +

    Splitting and replacing


    [Function] @@ -957,48 +816,44 @@ If regex matches an empty string, the scan is continued one position behind this match. If sharedp is true, the substrings may share structure with target-string.

    -Beginning with CL-PPCRE 0.2.0, this function also tries hard to be -Perl-compatible - thus the somewhat peculiar behaviour. But note that -it hasn't been as extensively tested as SCAN. -

    -Examples: +This function also tries hard to be +Perl-compatible - thus the somewhat peculiar behaviour.

    -* (cl-ppcre:split "\\s+" "foo   bar baz
    +* (split "\\s+" "foo   bar baz
     frob")
     ("foo" "bar" "baz" "frob")
     
    -* (cl-ppcre:split "\\s*" "foo bar   baz")
    +* (split "\\s*" "foo bar   baz")
     ("f" "o" "o" "b" "a" "r" "b" "a" "z")
     
    -* (cl-ppcre:split "(\\s+)" "foo bar   baz")
    +* (split "(\\s+)" "foo bar   baz")
     ("foo" "bar" "baz")
     
    -* (cl-ppcre:split "(\\s+)" "foo bar   baz" :with-registers-p t)
    +* (split "(\\s+)" "foo bar   baz" :with-registers-p t)
     ("foo" " " "bar" "   " "baz")
     
    -* (cl-ppcre:split "(\\s)(\\s*)" "foo bar   baz" :with-registers-p t)
    +* (split "(\\s)(\\s*)" "foo bar   baz" :with-registers-p t)
     ("foo" " " "" "bar" " " "  " "baz")
     
    -* (cl-ppcre:split "(,)|(;)" "foo,bar;baz" :with-registers-p t)
    +* (split "(,)|(;)" "foo,bar;baz" :with-registers-p t)
     ("foo" "," NIL "bar" NIL ";" "baz")
     
    -* (cl-ppcre:split "(,)|(;)" "foo,bar;baz" :with-registers-p t :omit-unmatched-p t)
    +* (split "(,)|(;)" "foo,bar;baz" :with-registers-p t :omit-unmatched-p t)
     ("foo" "," "bar" ";" "baz")
     
    -* (cl-ppcre:split ":" "a:b:c:d:e:f:g::")
    +* (split ":" "a:b:c:d:e:f:g::")
     ("a" "b" "c" "d" "e" "f" "g")
     
    -* (cl-ppcre:split ":" "a:b:c:d:e:f:g::" :limit 1)
    +* (split ":" "a:b:c:d:e:f:g::" :limit 1)
     ("a:b:c:d:e:f:g::")
     
    -* (cl-ppcre:split ":" "a:b:c:d:e:f:g::" :limit 2)
    +* (split ":" "a:b:c:d:e:f:g::" :limit 2)
     ("a" "b:c:d:e:f:g::")
     
    -* (cl-ppcre:split ":" "a:b:c:d:e:f:g::" :limit 3)
    +* (split ":" "a:b:c:d:e:f:g::" :limit 3)
     ("a" "b" "c:d:e:f:g::")
     
    -* (cl-ppcre:split ":" "a:b:c:d:e:f:g::" :limit 1000)
    +* (split ":" "a:b:c:d:e:f:g::" :limit 1000)
     ("a" "b" "c" "d" "e" "f" "g" "" "")
     
    @@ -1073,40 +928,37 @@ for LispWorks and CHARACTER for other Lisps. -

    -Examples: -

    -* (cl-ppcre:regex-replace "fo+" "foo bar" "frob")
    +* (regex-replace "fo+" "foo bar" "frob")
     "frob bar"
     T
     
    -* (cl-ppcre:regex-replace "fo+" "FOO bar" "frob")
    +* (regex-replace "fo+" "FOO bar" "frob")
     "FOO bar"
     NIL
     
    -* (cl-ppcre:regex-replace "(?i)fo+" "FOO bar" "frob")
    +* (regex-replace "(?i)fo+" "FOO bar" "frob")
     "frob bar"
     T
     
    -* (cl-ppcre:regex-replace "(?i)fo+" "FOO bar" "frob" :preserve-case t)
    +* (regex-replace "(?i)fo+" "FOO bar" "frob" :preserve-case t)
     "FROB bar"
     T
     
    -* (cl-ppcre:regex-replace "(?i)fo+" "Foo bar" "frob" :preserve-case t)
    +* (regex-replace "(?i)fo+" "Foo bar" "frob" :preserve-case t)
     "Frob bar"
     T
     
    -* (cl-ppcre:regex-replace "bar" "foo bar baz" "[frob (was '\\&' between '\\`' and '\\'')]")
    +* (regex-replace "bar" "foo bar baz" "[frob (was '\\&' between '\\`' and '\\'')]")
     "foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
     T
     
    -* (cl-ppcre:regex-replace "bar" "foo bar baz"
    +* (regex-replace "bar" "foo bar baz"
                               '("[frob (was '" :match "' between '" :before-match "' and '" :after-match "')]"))
     "foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
     T
     
    -* (cl-ppcre:regex-replace "(be)(nev)(o)(lent)"
    +* (regex-replace "(be)(nev)(o)(lent)"
                               "benevolent: adj. generous, kind"
                               #'(lambda (match &rest registers)
                                   (format nil "~A [~{~A~^.~}]" match registers))
    @@ -1121,26 +973,23 @@ T
     
     

    Like REGEX-REPLACE but replaces all matches. -

    -Examples: -

    -* (cl-ppcre:regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)
    +* (regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)
     "frob Frob FROB bar"
     T
     
    -* (cl-ppcre:regex-replace-all "(?i)f(o+)" "foo Fooo FOOOO bar" "fr\\1b" :preserve-case t)
    +* (regex-replace-all "(?i)f(o+)" "foo Fooo FOOOO bar" "fr\\1b" :preserve-case t)
     "froob Frooob FROOOOB bar"
     T
     
    -* (let ((qp-regex (cl-ppcre:create-scanner "[\\x80-\\xff]")))
    +* (let ((qp-regex (create-scanner "[\\x80-\\xff]")))
         (defun encode-quoted-printable (string)
    -      "Convert 8-bit string to quoted-printable representation."
    +      "Converts 8-bit string to quoted-printable representation."
           ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there
           (flet ((convert (target-string start end match-start match-end reg-starts reg-ends)
                  (declare (ignore start end match-end reg-starts reg-ends))
                  (format nil "=~2,'0x" (char-code (char target-string match-start)))))
    -        (cl-ppcre:regex-replace-all qp-regex string #'convert))))
    +        (regex-replace-all qp-regex string #'convert))))
     Converted ENCODE-QUOTED-PRINTABLE.
     ENCODE-QUOTED-PRINTABLE
     
    @@ -1148,14 +997,14 @@ ENCODE-QUOTED-PRINTABLE
     "F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"
     T
     
    -* (let ((url-regex (cl-ppcre:create-scanner "[^a-zA-Z0-9_\\-.]")))
    +* (let ((url-regex (create-scanner "[^a-zA-Z0-9_\\-.]")))
         (defun url-encode (string)
    -      "URL-encode a string."
    +      "URL-encodes a string."
           ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there
           (flet ((convert (target-string start end match-start match-end reg-starts reg-ends)
                  (declare (ignore start end match-end reg-starts reg-ends))
                  (format nil "%~2,'0x" (char-code (char target-string match-start)))))
    -        (cl-ppcre:regex-replace-all url-regex string #'convert))))
    +        (regex-replace-all url-regex string #'convert))))
     Converted URL-ENCODE.
     URL-ENCODE
     
    @@ -1169,20 +1018,20 @@ T
                             (svref reg-starts 0))))
     HOW-MANY
     
    -* (cl-ppcre:regex-replace-all "{(.+?)}"
    +* (regex-replace-all "{(.+?)}"
                                   "foo{...}bar{.....}{..}baz{....}frob"
                                   (list "[" 'how-many " dots]"))
     "foo[3 dots]bar[5 dots][2 dots]baz[4 dots]frob"
     T
     
    -* (let ((qp-regex (cl-ppcre:create-scanner "[\\x80-\\xff]")))
    +* (let ((qp-regex (create-scanner "[\\x80-\\xff]")))
         (defun encode-quoted-printable (string)
    -      "Convert 8-bit string to quoted-printable representation.
    +      "Converts 8-bit string to quoted-printable representation.
     Version using SIMPLE-CALLS keyword argument."
           ;; ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there
           (flet ((convert (match)
                    (format nil "=~2,'0x" (char-code (char match 0)))))
    -        (cl-ppcre:regex-replace-all qp-regex string #'convert
    +        (regex-replace-all qp-regex string #'convert
                                         :simple-calls t))))
     
     Converted ENCODE-QUOTED-PRINTABLE.
    @@ -1197,7 +1046,7 @@ T
         (format nil "~A" (length first-register)))
     HOW-MANY
     
    -* (cl-ppcre:regex-replace-all "{(.+?)}"
    +* (regex-replace-all "{(.+?)}"
                                   "foo{...}bar{.....}{..}baz{....}frob"
                                   (list "[" 'how-many " dots]")
                                   :simple-calls t)
    @@ -1206,86 +1055,111 @@ HOW-MANY
     T
     
    -


    [Function] -
    regex-apropos regex &optional packages &key case-insensitive => list +

    Modifying scanner behaviour

    -

    -Like APROPOS -but searches for interned symbols which match the regular expression -regex. The output is implementation-dependent. If -case-insensitive is true (which is the default) -and regex isn't already a scanner, a -case-insensitive scanner is used. -

    -Here are examples for CMUCL: +


    [Special variable] +
    *property-resolver* +


    This is the designator for a function responsible +for resolving named properties like \p{Number}. If +CL-PPCRE encounters a \p or a \P it expects +to see an opening curly brace immediately afterwards and will then +read everything following that brace until it sees a closing curly +brace. The resolver function will be called with this string and must +return a corresponding unary test function which accepts a character +as its argument and returns a true value if and only if the character +has the named property. If the resolver returns NIL +instead, it signals that a property of that name is unknown.
    -* *package*
    -#<The COMMON-LISP-USER package, 16/21 internal, 0/9 external>
    +* (labels ((char-code-odd-p (char)
    +             (oddp (char-code char)))
    +           (char-code-even-p (char)
    +             (evenp (char-code char)))
    +           (resolver (name)
    +             (cond ((string= name "odd") #'char-code-odd-p)
    +                   ((string= name "even") #'char-code-even-p)
    +                   ((string= name "true") (constantly t))
    +                   (t (error "Can't resolve ~S." name)))))
    +    (let ((*property-resolver* #'resolver))
    +      ;; quiz question - why do we need CREATE-SCANNER here?
    +      (list (regex-replace-all (create-scanner "\\p{odd}") "abcd" "+")
    +            (regex-replace-all (create-scanner "\\p{even}") "abcd" "+")
    +            (regex-replace-all (create-scanner "\\p{true}") "abcd" "+"))))
    +("+b+d" "a+c+" "++++")
    +
    +If the value +of *PROPERTY-RESOLVER* +is NIL (which is the default), \p and \P in regex +strings will simply be treated like p or P +as in CL-PPCRE 1.4.1 and earlier. Note that this does not affect +the validity of (:PROPERTY <name>) +parts in S-expression syntax. +
    -* (defun foo (n &optional (k 0)) (+ 3 n k)) -FOO -* (defparameter foo "bar") -FOO +


    [Accessor] +
    parse-tree-synonym symbol => parse-tree +
    (setf (parse-tree-synonym symbol) new-parse-tree)
    -* (defparameter |foobar| 42) -|foobar| +


    +Any symbol (unless it's a keyword with a special meaning in parse +trees) can be made a "synonym", i.e. an abbreviation, for another parse +tree by this accessor. PARSE-TREE-SYNONYM returns NIL if symbol isn't a synonym yet. +
    +* (parse-string "a*b+")
    +(:SEQUENCE (:GREEDY-REPETITION 0 NIL #\a) (:GREEDY-REPETITION 1 NIL #\b))
     
    -* (defparameter fooboo 43)
    -FOOBOO
    +* (defun my-repetition (char min)
    +    `(:greedy-repetition ,min nil ,char))
    +MY-REPETITION
     
    -* (defclass frobar () ())
    -#<STANDARD-CLASS FROBAR {4874E625}>
    +* (setf (parse-tree-synonym 'a*) (my-repetition #\a 0))
    +(:GREEDY-REPETITION 0 NIL #\a)
     
    -* (cl-ppcre:regex-apropos "foo(?:bar)?")
    -FOO [variable] value: "bar"
    -    [compiled function] (N &OPTIONAL (K 0))
    -FOOBOO [variable] value: 43
    -|foobar| [variable] value: 42
    +* (setf (parse-tree-synonym 'b+) (my-repetition #\b 1))
    +(:GREEDY-REPETITION 1 NIL #\b)
     
    -* (cl-ppcre:regex-apropos "(?:foo|fro)bar")
    -PCL::|COMMON-LISP-USER::FROBAR class predicate| [compiled closure]
    -FROBAR [class] #<STANDARD-CLASS FROBAR {4874E625}>
    -|foobar| [variable] value: 42
    +* (let ((scanner (create-scanner '(:sequence a* b+))))
    +    (dolist (string '("ab" "b" "aab" "a" "x"))
    +      (print (scan scanner string)))
    +    (values))
    +0
    +0
    +0
    +NIL
    +NIL
     
    -* (cl-ppcre:regex-apropos "(?:foo|fro)bar" 'cl-user)
    -FROBAR [class] #<STANDARD-CLASS FROBAR {4874E625}>
    -|foobar| [variable] value: 42
    +* (parse-tree-synonym 'a*)
    +(:GREEDY-REPETITION 0 NIL #\a)
     
    -* (cl-ppcre:regex-apropos "(?:foo|fro)bar" '(pcl ext))
    -PCL::|COMMON-LISP-USER::FROBAR class predicate| [compiled closure]
    -
    -* (cl-ppcre:regex-apropos "foo")
    -FOO [variable] value: "bar"
    -    [compiled function] (N &OPTIONAL (K 0))
    -FOOBOO [variable] value: 43
    -|foobar| [variable] value: 42
    -
    -* (cl-ppcre:regex-apropos "foo" nil :case-insensitive nil)
    -|foobar| [variable] value: 42
    +* (parse-tree-synonym 'a+)
    +NIL
     
    +


    [Macro] +
    define-parse-tree-synonym name parse-tree => parse-tree - - -


    [Function] -
    regex-apropos-list regex &optional packages &key upcase => list - -


    -Like APROPOS-LIST -but searches for interned symbols which match the regular expression -regex. If case-insensitive is -true (which is the default) and regex isn't -already a scanner, a case-insensitive scanner is used. -

    -Example (continued from above): +


    +This is a convenience macro for parse tree synonyms defined as
    -* (cl-ppcre:regex-apropos-list "foo(?:bar)?")
    -(|foobar| FOOBOO FOO)
    +(defmacro define-parse-tree-synonym (name parse-tree)
    +  `(eval-when (:compile-toplevel :load-toplevel :execute)
    +     (setf (parse-tree-synonym ',name) ',parse-tree)))
    +
    + +so you can write code like this: + +
    +(define-parse-tree-synonym a-z
    +  (:char-class (:range #\a #\z) (:range #\A #\Z)))
    +
    +(define-parse-tree-synonym a-z*
    +  (:greedy-repetition 0 nil a-z))
    +
    +(defun ascii-char-tester (string)
    +  (scan '(:sequence :start-anchor a-z* :end-anchor)
    +        string))
     


    [Special variable] @@ -1296,40 +1170,15 @@ account all characters of your CL implementation or only those the CHAR-CODE of which is not larger than its value. The default is -CHAR-CODE-LIMIT, +CHAR-CODE-LIMIT, and you might see significant speed and space improvements during -scanner creation if, say, your target strings only contain ISO-8859-1 -characters and you're using an implementation like AllegroCL, -CLISP, LispWorks, or SBCL where CHAR-CODE-LIMIT has a value -much higher than 256. The test suite will -automatically set *REGEX-CHAR-CODE-LIMIT* to 256 while -you're running the default test. -

    -Here's an example with LispWorks: - -

    -CL-USER 23 > (time (cl-ppcre:create-scanner "[3\\D]"))
    -Timing the evaluation of (CL-PPCRE:CREATE-SCANNER "[3\\D]")
    -
    -user time    =      0.443
    -system time  =      0.001
    -Elapsed time =   0:00:01
    -Allocation   = 546600 bytes standard / 2162611 bytes fixlen
    -0 Page faults
    -#<closure 20654AF2>
    -
    -CL-USER 24 > (time (let ((cl-ppcre:*regex-char-code-limit* 256)) (cl-ppcre:create-scanner "[3\\D]")))
    -Timing the evaluation of (LET ((CL-PPCRE:*REGEX-CHAR-CODE-LIMIT* 256)) (CL-PPCRE:CREATE-SCANNER "[3\\D]"))
    -
    -user time    =      0.000
    -system time  =      0.000
    -Elapsed time =   0:00:00
    -Allocation   = 3336 bytes standard / 8338 bytes fixlen
    -0 Page faults
    -#<closure 206569DA>
    -
    +scanner creation if, say, your target strings only +contain ISO-8859-1 +characters and you're using a Lisp implementation +where CHAR-CODE-LIMIT has a value much higher +than 256. The test suite will automatically +set *REGEX-CHAR-CODE-LIMIT* to 256 while you're running +the default test.

    Note: Due to the nature of LOAD-TIME-VALUE and the compiler macro for SCAN and other functions, some @@ -1366,6 +1215,29 @@ lexical environment at load time or at compile time so be careful to which value *USE-BMH-MATCHERS* is bound at that time.

    +


    [Special variable]
    *optimize-char-classes* +


    +Whether character classes should be compiled into look-ups into O(1) +data structures. This is usually fast but will be costly in terms of +scanner creation time and might be costly in terms of size if +*REGEX-CHAR-CODE-LIMIT* +is high. This value will be used as the kind +keyword argument +to CREATE-OPTIMIZED-TEST-FUNCTION +- see there for the possible non-NIL values. The default +value (NIL) should usually be fine unless you're sure +that you absolutely have to optimize some character classes for speed. +

    +Note: Due to the nature +of LOAD-TIME-VALUE +and the compiler macro for SCAN +and other functions, some scanners might be created in +a null +lexical environment at load time or at compile time so be careful +to which value *OPTIMIZE-CHAR-CLASSES* is bound at that +time. +

    +


    [Special variable]
    *allow-quoting* @@ -1380,19 +1252,19 @@ href="#ppcre-syntax-error">syntax error messages will complain about the converted string and not about the original regex string.

    -* (cl-ppcre:scan "^a+$" "a+")
    +* (scan "^a+$" "a+")
     NIL
     
    -* (let ((cl-ppcre:*allow-quoting* t))
    +* (let ((*allow-quoting* t))
         ;;we use CREATE-SCANNER because of Lisps like SBCL that don't have an interpreter
    -    (cl-ppcre:scan (cl-ppcre:create-scanner "^\\Qa+\\E$") "a+"))
    +    (scan (create-scanner "^\\Qa+\\E$") "a+"))
     0
     2
     #()
     #()
     
    -* (let ((cl-ppcre:*allow-quoting* t))
    -    (cl-ppcre:scan (cl-ppcre:create-scanner "\\Qa()\\E(?#comment\\Q)a**b") "()ab"))
    +* (let ((*allow-quoting* t))
    +    (scan (create-scanner "\\Qa()\\E(?#comment\\Q)a**b") "()ab"))
     
     Quantifier '*' not allowed at position 19 in string "a\\(\\)(?#commentQ)a**b"
     
    @@ -1403,10 +1275,10 @@ function. Also note that the second example might be easier to understand (and Lisp-ier) if you write it like this:
    -* (cl-ppcre:scan '(:sequence :start-anchor
    -                             "a+" ;; no quoting necessary
    -                             :end-anchor)
    -                 "a+")
    +* (scan '(:sequence :start-anchor
    +                    "a+" ;; no quoting necessary
    +                    :end-anchor)
    +        "a+")
     0
     2
     #()
    @@ -1434,39 +1306,32 @@ CL-PPCRE will support (?<name>"<regex>") and AllegroCL. name is has to start with a letter and can contain only alphanumeric characters or minus sign.  Names of registers are matched case-sensitively.
     The parse tree syntax is not affected by the *ALLOW-NAMED-REGISTERS* switch, :NAMED-REGISTER and :BACK-REFERENCE forms are always resolved as expected. There are also no restrictions on register names in this syntax except that they have to be strings.
     
    -

    -Examples: -

     ;; Perl compatible mode (*ALLOW-NAMED-REGISTERS* is NIL)
    -* (cl-ppcre:create-scanner "(?<reg>.*)")
    +* (create-scanner "(?<reg>.*)")
     Character 'r' may not follow '(?<' at position 3 in string "(?<reg>)"
     
     ;; just unescapes "\\k"
    -* (cl-ppcre::parse-string "\\k<reg>")
    +* (parse-string "\\k<reg>")
     "k<reg>"
    -
    -
    -* (setq cl-ppcre:*allow-named-registers* t)
    +* (setq *allow-named-registers* t)
     T
     
    -* (cl-ppcre:create-scanner "((?<small>[a-z]*)(?<big>[A-Z]*))")
    +* (create-scanner "((?<small>[a-z]*)(?<big>[A-Z]*))")
     #<CLOSURE (LAMBDA (STRING CL-PPCRE::START CL-PPCRE::END)) {AD75BFD}>
     (NIL "small" "big")
     
     ;; the scanner doesn't capture any information about named groups -
     ;; you have to store the second value returned from CREATE-SCANNER yourself
    -* (cl-ppcre:scan * "aaaBBB")
    +* (scan * "aaaBBB")
     0
     6
     #(0 0 3)
     #(6 3 6)
    -
    -
     ;; parse tree syntax
    -* (cl-ppcre::parse-string "((?<small>[a-z]*)(?<big>[A-Z]*))")
    +* (parse-string "((?<small>[a-z]*)(?<big>[A-Z]*))")
     (:REGISTER
      (:SEQUENCE
       (:NAMED-REGISTER "small"
    @@ -1474,61 +1339,54 @@ T
       (:NAMED-REGISTER "big"
        (:GREEDY-REPETITION 0 NIL (:CHAR-CLASS (:RANGE #\A #\Z))))))
     
    -* (cl-ppcre:create-scanner *)
    +* (create-scanner *)
     #<CLOSURE (LAMBDA (STRING CL-PPCRE::START CL-PPCRE::END)) {B158E3D}>
     (NIL "small" "big")
    -
    -
     ;; multiple-choice back-reference
    -* (cl-ppcre:scan "^(?<reg>[ab])(?<reg>[12])\\k<reg>\\k<reg>$" "a1aa")
    +* (scan "^(?<reg>[ab])(?<reg>[12])\\k<reg>\\k<reg>$" "a1aa")
     0
     4
     #(0 1)
     #(1 2)
     
    -* (cl-ppcre:scan "^(?<reg>[ab])(?<reg>[12])\\k<reg>\\k<reg>$" "a22a")
    +* (scan "^(?<reg>[ab])(?<reg>[12])\\k<reg>\\k<reg>$" "a22a")
     0
     4
     #(0 1)
     #(1 2)
    -
    - -
     ;; demonstrating most-recently-seen-register-first property of back-reference;
     ;; "greedy" regex (analogous to "aa?")
    -* (cl-ppcre:scan "^(?<reg>)(?<reg>a)(\\k<reg>)" "a")
    +* (scan "^(?<reg>)(?<reg>a)(\\k<reg>)" "a")
     0
     1
     #(0 0 1)
     #(0 1 1)
     
    -* (cl-ppcre:scan "^(?<reg>)(?<reg>a)(\\k<reg>)" "aa")
    +* (scan "^(?<reg>)(?<reg>a)(\\k<reg>)" "aa")
     0
     2
     #(0 0 1)
     #(0 1 2)
    -
    -
     ;; switched groups
     ;; "lazy" regex (analogous to "aa??")
    -* (cl-ppcre:scan "^(?<reg>a)(?<reg>)(\\k<reg>)" "a")
    +* (scan "^(?<reg>a)(?<reg>)(\\k<reg>)" "a")
     0
     1
     #(0 1 1)
     #(1 1 1)
     
     ;; scanner ignores the second "a"
    -* (cl-ppcre:scan "^(?<reg>a)(?<reg>)(\\k<reg>)" "aa")
    +* (scan "^(?<reg>a)(?<reg>)(\\k<reg>)" "aa")
     0
     1
     #(0 1 1)
     #(1 1 1)
     
     ;; "aa" will be matched only when forced by adding "$" at the end
    -* (cl-ppcre:scan "^(?<reg>a)(?<reg>)(\\k<reg>)$" "aa")
    +* (scan "^(?<reg>a)(?<reg>)(\\k<reg>)$" "aa")
     0
     2
     #(0 1 1)
    @@ -1543,6 +1401,56 @@ to which value *ALLOW-NAMED-REGISTERS* is bound at that
     time.
    +

    Miscellaneous

    + +


    [Function] +
    parse-string string => parse-tree + +


    Converts the regex +string string into a parse tree. +Note that the result is usually one possible way of creating an +equivalent parse tree and not necessarily the "canonical" one. +Specifically, the parse tree might contain redundant parts which are +supposed to be excised when a scanner is created. +
    + +


    [Function]
    create-optimized-test-function test-function &key start end kind => function +


    + +Given a unary test function test-function which is +applicable to characters returns a function which yields the same +boolean results for all characters with character codes +from start to (excluding) end. +If kind +is NIL, test-function will simply be +returned. Otherwise, kind should be one of: +
    +
    :HASH-TABLE
    +
    The function builds a hash table representing all characters which +satisfy the test and returns a closure which checks if a character is +in that hash table.
    +
    :CHARSET
    +
    Instead of a hash table the function uses a "charset" +which is a data structure using non-linear hashing and optimized to +represent (sparse) sets of characters in a fast and space-efficient +way (contributed by Nikodemus Siivola).
    +
    :CHARMAP
    +
    Instead of a hash table the function uses a bit vector to +represent the set of characters.
    +
    +You can also use :HASH-TABLE* or :CHARSET* +which are like :HASH-TABLE and :CHARSET but +use the complement of the set if the set contains more than half of +all characters between start +and end. This saves space but needs an additional +pass across all characters to create the data structure. There is no +corresponding :CHARMAP* kind as the bit vectors are +already created to cover the smallest possible interval which contains +either the set or its complement. +

    +See also *OPTIMIZE-CHAR-CLASSES*. +

    +


    [Function]
    quote-meta-chars string => string' @@ -1556,10 +1464,94 @@ backslash similar to Perl's quotemeta function. It always returns a href="http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#fresh">fresh string.

    -* (cl-ppcre:quote-meta-chars "[a-z]*")
    +* (quote-meta-chars "[a-z]*")
     "\\[a\\-z\\]\\*"
     
    +


    [Function] +
    regex-apropos regex &optional packages &key case-insensitive => list + +


    +Like APROPOS +but searches for interned symbols which match the regular expression +regex. The output is implementation-dependent. If +case-insensitive is true (which is the default) +and regex isn't already a scanner, a +case-insensitive scanner is used. +

    +Here are examples for CMUCL: + +

    +* *package*
    +#<The COMMON-LISP-USER package, 16/21 internal, 0/9 external>
    +
    +* (defun foo (n &optional (k 0)) (+ 3 n k))
    +FOO
    +
    +* (defparameter foo "bar")
    +FOO
    +
    +* (defparameter |foobar| 42)
    +|foobar|
    +
    +* (defparameter fooboo 43)
    +FOOBOO
    +
    +* (defclass frobar () ())
    +#<STANDARD-CLASS FROBAR {4874E625}>
    +
    +* (regex-apropos "foo(?:bar)?")
    +FOO [variable] value: "bar"
    +    [compiled function] (N &OPTIONAL (K 0))
    +FOOBOO [variable] value: 43
    +|foobar| [variable] value: 42
    +
    +* (regex-apropos "(?:foo|fro)bar")
    +PCL::|COMMON-LISP-USER::FROBAR class predicate| [compiled closure]
    +FROBAR [class] #<STANDARD-CLASS FROBAR {4874E625}>
    +|foobar| [variable] value: 42
    +
    +* (regex-apropos "(?:foo|fro)bar" 'cl-user)
    +FROBAR [class] #<STANDARD-CLASS FROBAR {4874E625}>
    +|foobar| [variable] value: 42
    +
    +* (regex-apropos "(?:foo|fro)bar" '(pcl ext))
    +PCL::|COMMON-LISP-USER::FROBAR class predicate| [compiled closure]
    +
    +* (regex-apropos "foo")
    +FOO [variable] value: "bar"
    +    [compiled function] (N &OPTIONAL (K 0))
    +FOOBOO [variable] value: 43
    +|foobar| [variable] value: 42
    +
    +* (regex-apropos "foo" nil :case-insensitive nil)
    +|foobar| [variable] value: 42
    +
    + + + + +


    [Function] +
    regex-apropos-list regex &optional packages &key upcase => list + +


    +Like APROPOS-LIST +but searches for interned symbols which match the regular expression +regex. If case-insensitive is +true (which is the default) and regex isn't +already a scanner, a case-insensitive scanner is used. +

    +Example (continued from above): + +

    +* (regex-apropos-list "foo(?:bar)?")
    +(|foobar| FOOBOO FOO)
    +
    + +

    Conditions

    +


    [Condition type]
    ppcre-error @@ -1602,19 +1594,19 @@ where the parser was happy and not the position where it gave up.

     * (handler-case
    -    (cl-ppcre:scan "foo**x" "fooox")
    -    (cl-ppcre:ppcre-syntax-error (condition)
    +    (scan "foo**x" "fooox")
    +    (ppcre-syntax-error (condition)
           (format t "Houston, we've got a problem with the string ~S:~%~
                      Looks like something went wrong at position ~A.~%~
                      The last message we received was \"~?\"."
    -              (cl-ppcre:ppcre-syntax-error-string condition)
    -              (cl-ppcre:ppcre-syntax-error-pos condition)
    +              (ppcre-syntax-error-string condition)
    +              (ppcre-syntax-error-pos condition)
                   (simple-condition-format-control condition)
                   (simple-condition-format-arguments condition))
           (values)))
     Houston, we've got a problem with the string "foo**x":
     Looks like something went wrong at position 4.
    -The last message we received was "Quantifier '*' not allowed".
    +The last message we received was "Quantifier '*' not allowed.".
     
    @@ -1643,6 +1635,39 @@ occurred (or NIL if the error happened while trying to convert a parse tree). +
     

    Unicode properties

    + +You can add support for Unicode properties to CL-PPCRE by loading +the CL-PPCRE-UNICODE system: +
    +(asdf:oos 'asdf:load-op :cl-ppcre-unicode)
    +
    +This will automatically +install UNICODE-PROPERTY-RESOLVER +as your property resolver. +

    +See the CL-UNICODE +documentation for information about the supported Unicode properties +and how they are named. + +


    [Function]
    unicode-property-resolver property-name => function-or-nil +


    +A property +resolver which understands Unicode properties using +CL-UNICODE's PROPERTY-TEST +function. This resolver is automatically installed +in *PROPERTY-RESOLVER* +when the CL-PPCRE-UNICODE system is loaded. +
    +* (scan-to-strings "\\p{Script:Latin}+" "0+AB_*")
    +"AB"
    +#()
    +
    +Note that this symbol is exported from +the CL-PPCRE-UNICODE package and not from +the CL-PPCRE package. +
    +
     

    Filters

    @@ -1674,41 +1699,43 @@ to the outcome of the matching process.

    The filter function can access the following special variables from its code body: -

      +
      -
    • CL-PPCRE::*STRING*: The target (a string) of the -current matching process. +
      CL-PPCRE::*STRING*
      +
      The target (a string) of the current matching process.
      -
    • CL-PPCRE::*START-POS* and -CL-PPCRE::*END-POS*: The start and end (integers) indices +
      CL-PPCRE::*START-POS* and +CL-PPCRE::*END-POS*
      +
      The start and end (integers) indices of the current matching process. These correspond to the -START and END keyword parameters of SCAN. +START and END keyword parameters +of SCAN.
      -
    • CL-PPCRE::*REAL-START-POS*: The initial starting +
      CL-PPCRE::*REAL-START-POS*
      +
      The initial starting position. This is only relevant for repeated scans (as in DO-SCANS) where CL-PPCRE::*START-POS* will be moved forward while CL-PPCRE::*REAL-START-POS* won't. For normal scans the -value of this variable is NIL. +value of this variable is NIL.
      -
    • CL-PPCRE::*REG-STARTS* and -CL-PPCRE::*REG-ENDS*: Two simple vectors which denote the +
      CL-PPCRE::*REG-STARTS* and +CL-PPCRE::*REG-ENDS*
      +
      Two simple vectors which denote the start and end indices of registers within the regular expression. The first register is indexed by 0. If a register hasn't matched yet, then its corresponding entry in CL-PPCRE::*REG-STARTS* is -NIL. +NIL.
      -
    + These variables should be considered read-only. Do not change these values unless you really know what you're doing!

    Note that the names of the variables are not exported from the -CL-PPCRE package because there's currently no guarantee -that they will be available in future releases. -

    -Here are some filter examples: +CL-PPCRE package because there's no explicit guarantee +that they will be available in future releases. (Although after so +many years it is very unlikely that they'll go away...)

     * (defun my-info-filter (pos)
         "Show some info about the matching process."
    @@ -1821,64 +1848,6 @@ For more ideas about what you can do with filters see this
     thread on the mailing list.
     
    -
     

    Testing CL-PPCRE

    - -CL-PPCRE comes with a comprehensive test suite most of which is stolen -from the PCRE library. You can use -it like this: - -
    -* (mk:compile-system "cl-ppcre-test")
    -; Loading #p"/home/edi/cl-ppcre/cl-ppcre.system".
    -; Loading #p"/home/edi/cl-ppcre/packages.x86f".
    -; Loading #p"/home/edi/cl-ppcre/specials.x86f".
    -; Loading #p"/home/edi/cl-ppcre/util.x86f".
    -; Loading #p"/home/edi/cl-ppcre/errors.x86f".
    -; Loading #p"/home/edi/cl-ppcre/lexer.x86f".
    -; Loading #p"/home/edi/cl-ppcre/parser.x86f".
    -; Loading #p"/home/edi/cl-ppcre/regex-class.x86f".
    -; Loading #p"/home/edi/cl-ppcre/convert.x86f".
    -; Loading #p"/home/edi/cl-ppcre/optimize.x86f".
    -; Loading #p"/home/edi/cl-ppcre/closures.x86f".
    -; Loading #p"/home/edi/cl-ppcre/repetition-closures.x86f".
    -; Loading #p"/home/edi/cl-ppcre/scanner.x86f".
    -; Loading #p"/home/edi/cl-ppcre/api.x86f".
    -; Loading #p"/home/edi/cl-ppcre/ppcre-tests.x86f".
    -NIL
    -
    -* (cl-ppcre-test:test)
    -
    -;; ....
    -;; (a list of incompatibilities with Perl)
    -
    - -(If you're not using MK:DEFSYSTEM or asdf, it suffices to build -CL-PPCRE and then compile and load the file -ppcre-tests.lisp.) -

    -With LispWorks, SCL, and SBCL (starting from version 0.8.4.8) you can also call -CL-PPCRE-TEST:TEST with a keyword argument argument -THREADED which - in addition to the usual tests - will -also check whether the scanners created by CL-PPCRE are thread-safe. -

    -Note that the file testdata provided with CL-PPCRE -was created on a Linux system with Perl 5.8.0. You can (and you -should if you're on Mac OS or Windows) create your own -testdata with the Perl script -perltest.pl: - -

    -edi@bird:~/cl-ppcre > perl perltest.pl < testinput > testdata
    -
    - -Of course you can also create your own tests - the format accepted by -perltest.pl should be rather clear from looking at the -file testinput. Note that the target strings are wrapped -in double quotes and then fed to Perl's eval so you can -use ugly Perl constructs like, say, a@{['b' x 10]}c which -will result in the target string -"abbbbbbbbbbc". -
     

    Compatibility with Perl

    Depending on your Perl version you might encounter a couple of small @@ -1886,28 +1855,28 @@ incompatibilities with Perl most of which aren't due to CL-PPCRE:

    Empty strings instead of undef in $1, $2, etc.

    -(Cf. case #629 of testdata.) +(Cf. case #629 of perltestdata.) This is a bug in Perl 5.6.1 and earlier which has been fixed in 5.8.0.

    Strange scoping of embedded modifiers

    -(Cf. case #430 of testdata.) +(Cf. case #430 of perltestdata.) This is a bug in Perl 5.6.1 and earlier which has been fixed in 5.8.0.

    Inconsistent capturing of $1, $2, etc.

    -(Cf. case #662 of testdata.) +(Cf. case #662 of perltestdata.) This is a bug in Perl which hasn't been fixed yet.

    Captured groups not available outside of look-aheads and look-behinds

    -(Cf. case #1439 of testdata.) +(Cf. case #1439 of perltestdata.) Well, OK, this ain't a Perl bug. I just can't quite understand why captured groups should only be seen within the scope of a look-ahead or look-behind. For the moment, CL-PPCRE and Perl agree to @@ -1915,13 +1884,22 @@ disagree... :)

    Alternations don't always work from left to right

    -(Cf. case #790 of testdata.) I +(Cf. case #790 of perltestdata.) I also think this a Perl bug but I currently have lost the drive to report it. +

    Different names for Unicode properties

    + +The names of Unicode properties are derived +from CL-UNICODE and might +differ slightly from the names in Perl. Most of them should be +identical, though. +Also, CL-UNICODE is based on +Unicode 5.1 while your installed Perl version might be not. +

    "\r" doesn't work with MCL

    -(Cf. case #9 of testdata.) For +(Cf. case #9 of perltestdata.) For some strange reason that I don't understand MCL translates #\Return to (CODE-CHAR 10) while MacPerl translates "\r" to (CODE-CHAR @@ -1936,412 +1914,8 @@ to decide whether a character matches Perl's you might encounter differences between Perl and CL-PPCRE when matching non-ASCII characters. -
     

    Performance

    - -

    Benchmarking

    - -The CL-PPCRE test suite can also be used for -benchmarking purposes: If you call perltest.pl with a -command line argument, it will be interpreted as the minimum number of seconds -each test should run. Perl will time its tests accordingly and create -output which, when fed to CL-PPCRE-TEST:TEST, will result -in a benchmark. Here's an example: - -
    -edi@bird:~/cl-ppcre > echo "/((a{0,5}){0,5})*[c]/
    -aaaaaaaaaaaac
    -
    -/((a{0,5})*)*[c]/
    -aaaaaaaaaaaac" | perl perltest.pl .5 > timedata
    -1
    -2
    -
    -edi@bird:~/cl-ppcre > cmucl -quiet
    -; Loading #p"/home/edi/.cmucl-init".
    -
    -* (mk:compile-system "cl-ppcre-test")
    -; Loading #p"/home/edi/cl-ppcre/cl-ppcre.system".
    -; Loading #p"/home/edi/cl-ppcre/packages.x86f".
    -; Loading #p"/home/edi/cl-ppcre/specials.x86f".
    -; Loading #p"/home/edi/cl-ppcre/util.x86f".
    -; Loading #p"/home/edi/cl-ppcre/errors.x86f".
    -; Loading #p"/home/edi/cl-ppcre/lexer.x86f".
    -; Loading #p"/home/edi/cl-ppcre/parser.x86f".
    -; Loading #p"/home/edi/cl-ppcre/regex-class.x86f".
    -; Loading #p"/home/edi/cl-ppcre/convert.x86f".
    -; Loading #p"/home/edi/cl-ppcre/optimize.x86f".
    -; Loading #p"/home/edi/cl-ppcre/closures.x86f".
    -; Loading #p"/home/edi/cl-ppcre/repetition-closures.x86f".
    -; Loading #p"/home/edi/cl-ppcre/scanner.x86f".
    -; Loading #p"/home/edi/cl-ppcre/api.x86f".
    -; Loading #p"/home/edi/cl-ppcre/ppcre-tests.x86f".
    -NIL
    -
    -* (cl-ppcre-test:test :file-name "/home/edi/cl-ppcre/timedata")
    -   1: 0.5559 (1000000 repetitions, Perl: 4.5330 seconds, CL-PPCRE: 2.5200 seconds)
    -   2: 0.4573 (1000000 repetitions, Perl: 4.5922 seconds, CL-PPCRE: 2.1000 seconds)
    -NIL
    -
    - -We gave two test cases to perltest.pl and asked it to repeat those tests often enough so that it takes at least 0.5 seconds to run each of them. In both cases, CMUCL was about twice as fast as Perl. -

    -Here are some more benchmarks (done with Perl 5.6.1 and CMUCL 18d+ in 2002): -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Test caseRepetitionsPerl (sec)CL-PPCRE (sec)Ratio CL-PPCRE/Perl
    "@{['x' x 100]}" =~ /(.)*/s1000000.13940.07000.5022
    "@{['x' x 1000]}" =~ /(.)*/s1000000.16280.06000.3685
    "@{['x' x 10000]}" =~ /(.)*/s1000000.50710.06000.1183
    "@{['x' x 100000]}" =~ /(.)*/s100000.39020.00000.0000
    "@{['x' x 100]}" =~ /.*/1000000.15200.08000.5262
    "@{['x' x 1000]}" =~ /.*/1000000.37860.54001.4263
    "@{['x' x 10000]}" =~ /.*/100000.27090.51001.8826
    "@{['x' x 100000]}" =~ /.*/10000.27340.51001.8656
    "@{['x' x 100]}" =~ /.*/s1000000.13200.03000.2274
    "@{['x' x 1000]}" =~ /.*/s1000000.16340.03000.1836
    "@{['x' x 10000]}" =~ /.*/s1000000.53040.03000.0566
    "@{['x' x 100000]}" =~ /.*/s100000.39660.00000.0000
    "@{['x' x 100]}" =~ /x*/1000000.15070.09000.5970
    "@{['x' x 1000]}" =~ /x*/1000000.37820.63001.6658
    "@{['x' x 10000]}" =~ /x*/100000.27300.60002.1981
    "@{['x' x 100000]}" =~ /x*/10000.27080.59002.1790
    "@{['x' x 100]}" =~ /[xy]*/1000000.26370.15000.5688
    "@{['x' x 1000]}" =~ /[xy]*/100000.14490.12000.8282
    "@{['x' x 10000]}" =~ /[xy]*/10000.13440.11000.8185
    "@{['x' x 100000]}" =~ /[xy]*/1000.13550.12000.8857
    "@{['x' x 100]}" =~ /(.)*/1000000.15230.11000.7220
    "@{['x' x 1000]}" =~ /(.)*/1000000.37350.57001.5262
    "@{['x' x 10000]}" =~ /(.)*/100000.27350.51001.8647
    "@{['x' x 100000]}" =~ /(.)*/10000.25980.50001.9242
    "@{['x' x 100]}" =~ /(x)*/1000000.15650.13000.8307
    "@{['x' x 1000]}" =~ /(x)*/1000000.37830.66001.7446
    "@{['x' x 10000]}" =~ /(x)*/100000.27200.60002.2055
    "@{['x' x 100000]}" =~ /(x)*/10000.27250.60002.2020
    "@{['x' x 100]}" =~ /(y|x)*/100000.24110.10000.4147
    "@{['x' x 1000]}" =~ /(y|x)*/10000.23130.09000.3891
    "@{['x' x 10000]}" =~ /(y|x)*/1000.23360.09000.3852
    "@{['x' x 100000]}" =~ /(y|x)*/100.41650.09000.2161
    "@{['x' x 100]}" =~ /([xy])*/1000000.26780.18000.6721
    "@{['x' x 1000]}" =~ /([xy])*/100000.14590.12000.8227
    "@{['x' x 10000]}" =~ /([xy])*/10000.13720.11000.8017
    "@{['x' x 100000]}" =~ /([xy])*/1000.13580.11000.8098
    "@{['x' x 100]}" =~ /((x){2})*/100000.10730.04000.3727
    "@{['x' x 1000]}" =~ /((x){2})*/100000.91460.24000.2624
    "@{['x' x 10000]}" =~ /((x){2})*/10000.90200.23000.2550
    "@{['x' x 100000]}" =~ /((x){2})*/1000.89830.23000.2560
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}FOOBARBAZ" =~ /[a-z]*FOOBARBAZ/1000000.28290.23000.8129
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}FOOBARBAZ" =~ /[a-z]*FOOBARBAZ/100000.18590.17000.9143
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}FOOBARBAZ" =~ /[a-z]*FOOBARBAZ/10000.14200.17001.1968
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /[a-z]*FOOBARBAZ/10000000.91960.46000.5002
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /[a-z]*FOOBARBAZ/1000000.21660.25001.1542
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /[a-z]*FOOBARBAZ/100000.14650.23001.5696
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}FOOBARBAZ" =~ /([a-z])*FOOBARBAZ/1000000.29170.26000.8915
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}FOOBARBAZ" =~ /([a-z])*FOOBARBAZ/100000.18110.18000.9942
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}FOOBARBAZ" =~ /([a-z])*FOOBARBAZ/10000.14240.16001.1233
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /([a-z])*FOOBARBAZ/10000000.91540.74000.8083
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /([a-z])*FOOBARBAZ/1000000.21700.28001.2901
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /([a-z])*FOOBARBAZ/100000.14970.23001.5360
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}FOOBARBAZ" =~ /([a-z]|ab)*FOOBARBAZ/100000.43590.15000.3441
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}FOOBARBAZ" =~ /([a-z]|ab)*FOOBARBAZ/10000.54560.15000.2749
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}FOOBARBAZ" =~ /([a-z]|ab)*FOOBARBAZ/100.20390.06000.2943
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /([a-z]|ab)*FOOBARBAZ/10000000.93110.74000.7947
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /([a-z]|ab)*FOOBARBAZ/1000000.21620.27001.2489
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /([a-z]|ab)*FOOBARBAZ/100000.14880.23001.5455
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /[a-z]*FOOBARBAZ/i10000.15550.00000.0000
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /[a-z]*FOOBARBAZ/i100.14410.00000.0000
    "@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /[a-z]*FOOBARBAZ/i1013.71500.01000.0007
    - -

    -As you might have noticed, Perl shines if it can reduce significant -parts of the matching process to cases where it can advance through -the target string one character at a time. This leads to C code where -you can very efficiently test and increment a pointer into a string in -a tight loop and can hardly be beaten with CL. In almost all other -cases, the CMUCL/CL-PPCRE combination is usually faster than Perl - -sometimes a lot faster. -

    -As most of the examples above were chosen to make Perl look good -here's another benchmark - the -result of running perltest.pl against the -full testdata file with a time -limit of 0.1 seconds, CL-PPCRE 0.1.2 on CMUCL 18e-pre -vs. Perl 5.6.1. CL-PPCRE is faster than Perl in 1511 of 1545 -cases - in 1045 cases it's more than twice as fast. -

    -Note that Perl as well as CL-PPCRE keep the rightmost matches in -registers - keep that in mind if you benchmark against other regex -implementations. Also note that CL-PPCRE-TEST:TEST -automatically skips test cases where Perl and CL-PPCRE don't agree. - -

    Other performance issues

    - -While the scanners created by CL-PPCRE are pretty fast, the process -which creates scanners from Perl regex strings and parse trees isn't -that speedy and conses a lot. It is recommended that you store and -re-use scanners if possible. The DO-macros will do this -for you automatically. -

    -However, beginning with version 0.5.2, CL-PPCRE uses a compiler -macro and LOAD-TIME-VALUE -to make sure that the scanner is only built once if the first argument -to SCAN, SCAN-TO-STRINGS, SPLIT, -REGEX-REPLACE, or REGEX-REPLACE-ALL is a constant -form. (But see the notes for *REGEX-CHAR-CODE-LIMIT* and -*USE-BMH-MATCHERS*.) -

    -Here's an example of its effect - -

    -* (trace cl-ppcre::convert)
    -(CL-PPCRE::CONVERT)
    -* (defun foo (string) (cl-ppcre:scan "(?s).*" string))
    -FOO
    -* (time (foo "The quick brown fox"))
    -Compiling LAMBDA NIL: 
    -Compiling Top-Level Form: 
    -
    -  0: (CL-PPCRE::CONVERT #<lambda-list-unavailable>)
    -  0: CL-PPCRE::CONVERT returned
    -       #<CL-PPCRE::SEQ {48B033C5}>
    -       0
    -       #<CL-PPCRE::EVERYTHING {48B031D5}>
    -Evaluation took:
    -  0.0 seconds of real time
    -  0.00293 seconds of user run time
    -  9.77e-4 seconds of system run time
    -  0 page faults and
    -  11,408 bytes consed.
    -0
    -19
    -#()
    -#()
    -* (time (foo "The quick brown fox"))
    -Compiling LAMBDA NIL: 
    -Compiling Top-Level Form: 
    -
    -  0: (CL-PPCRE::CONVERT #<lambda-list-unavailable>)
    -  0: CL-PPCRE::CONVERT returned
    -       #<CL-PPCRE::SEQ {48B14C4D}>
    -       0
    -       #<CL-PPCRE::EVERYTHING {48B14B65}>
    -Evaluation took:
    -  0.0 seconds of real time
    -  0.00293 seconds of user run time
    -  0.0 seconds of system run time
    -  0 page faults and
    -  10,960 bytes consed.
    -0
    -19
    -#()
    -#()
    -* (compile 'foo)
    -  0: (CL-PPCRE::CONVERT #<lambda-list-unavailable>)
    -  0: CL-PPCRE::CONVERT returned
    -       #<CL-PPCRE::SEQ {48B1FEC5}>
    -       0
    -       #<CL-PPCRE::EVERYTHING {48B1FDDD}>
    -Compiling LAMBDA (STRING): 
    -Compiling Top-Level Form: 
    -FOO
    -NIL
    -NIL
    -* (time (foo "The quick brown fox"))
    -Compiling LAMBDA NIL: 
    -Compiling Top-Level Form: 
    -
    -Evaluation took:
    -  0.0 seconds of real time
    -  0.0 seconds of user run time
    -  0.0 seconds of system run time
    -  0 page faults and
    -  0 bytes consed.
    -0
    -19
    -#()
    -#()
    -* (time (foo "The quick brown fox"))
    -Compiling LAMBDA NIL: 
    -Compiling Top-Level Form: 
    -
    -Evaluation took:
    -  0.0 seconds of real time
    -  0.0 seconds of user run time
    -  0.0 seconds of system run time
    -  0 page faults and
    -  0 bytes consed.
    -0
    -19
    -#()
    -#()
    -* 
    -
    - -

    -Of course, the usual rules for creating efficient regular expressions -apply to CL-PPCRE as well although it can optimize a couple of cases -itself. The most important rule is probably that you shouldn't use -capturing groups if you don't need the captured information, i.e. use -"(?:a|b)*" instead of -"(a|b)*" if you don't need to refer to the -register. (In fact, in this particular case CL-PPCRE will be able to -optimize away the register group, but it won't if you replace -"a|b" with, say, -"a|bc".) -

    -Another point worth mentioning is that you definitely should use -single-line mode if you have long strings without -#\Newline (or where you don't care about the line breaks) -and plan to use regular expressions like -".*". See the benchmarks -for comparisons between single-line mode and normal mode with such -target strings. -

    -Another thing to consider is that, for performance reasons, CL-PPCRE -assumes that most of the target strings you're trying to match are simple -strings and coerces non-simple strings to simple strings before -scanning them. If you plan on working with non-simple strings mostly, -you might consider modifying the CL-PPCRE source code. This is easy: -Change all occurrences of SCHAR to CHAR and -redefine the macro in util.lisp where the coercion takes -place - that's all. -
     

    Bugs and problems

    -

    Stack overflow

    - -CL-PPCRE can optimize away a lot of unnecessary backtracking but -sometimes this simply isn't possible. With complicated regular -expressions and long strings this might lead to stack overflows -depending on your machine and your CL implementation. -

    -Here's one example with CLISP: - -

    -[1]> (defun target (n) (concatenate 'string (make-string n :initial-element #\a) "b"))
    -TARGET
    -
    -[2]> (cl-ppcre:scan "a*" (target 1000))
    -0 ;
    -1000 ;
    -#() ;
    -#()
    -
    -[3]> (cl-ppcre:scan "(?:a|b)*" (target 1000))
    -0 ;
    -1001 ;
    -#() ;
    -#()
    -
    -[4]> (cl-ppcre:scan "(a|b)*" (target 1000))
    -0 ;
    -1001 ;
    -#(1000) ;
    -#(1001)
    -
    -[5]> (cl-ppcre:scan "(a|b)*" (target 10000))
    -0 ;
    -10001 ;
    -#(10000) ;
    -#(10001)
    -
    -[6]> (cl-ppcre:scan "(a|b)*" (target 100000))
    -0 ;
    -100001 ;
    -#(100000) ;
    -#(100001)
    -
    -[7]> (cl-ppcre:scan "(a|b)*" (target 1000000))
    -0 ;
    -1000001 ;
    -#(1000000) ;
    -#(1000001)
    -
    -;; No problem until now - but...
    -
    -[8]> (cl-ppcre:scan "(a|)*" (target 100000))
    -*** - Lisp stack overflow. RESET
    -
    -[9]> (cl-ppcre:scan "(a|)*" (target 3200))
    -*** - Lisp stack overflow. RESET
    -
    - -

    -With CMUCL the situation is better and worse at the same time. It will -take a lot longer until CMUCL gives up but if it gives up the whole -Lisp image will silently die (at least on my machine): -

    -[Note: This was true for CMUCL 18e - CMUCL 19a behaves in a much nicer way and gives you a chance to recover.] - -

    -* (defun target (n) (concatenate 'string (make-string n :initial-element #\a) "b"))
    -TARGET
    -
    -* (cl-ppcre:scan "(a|)*" (target 3200))
    -0
    -3200
    -#(3200)
    -#(3200)
    -
    -* (cl-ppcre:scan "(a|)*" (target 10000))
    -0
    -10000
    -#(10000)
    -#(10000)
    -
    -* (cl-ppcre:scan "(a|)*" (target 100000))
    -0
    -100000
    -#(100000)
    -#(100000)
    -
    -* (cl-ppcre:scan "(a|)*" (target 1000000))
    -0
    -1000000
    -#(1000000)
    -#(1000000)
    -
    -;; No problem until now - but...
    -
    -* (cl-ppcre:scan "(a|)*" (target 10000000))
    -edi@bird:~ >
    -
    - -This behaviour can be changed with very conservative optimization settings but that'll make CL-PPCRE crawl compared to Perl. - -

    -You might want to compare this to the way Perl handles the same situation. It might lie to you: - -

    -edi@bird:~ > perl -le '$_="a" x 32766 . "b"; /(a|)*/; print $1'
    -
    -edi@bird:~ > perl -le '$_="a" x 32767 . "b"; /(a|)*/; print $1'
    -a
    -
    - -Or it might warn you before it's lying to you: -
    -edi@bird:~ > perl -lwe '$_="a" x 32767 . "b"; /(a|)*/; print $1'
    -Complex regular subexpression recursion limit (32766) exceeded at -e line 1.
    -a
    -
    - -Or it might simply die: -
    -edi@bird:~ > /opt/perl-5.8/bin/perl -lwe '$_="a" x 32767 . "b"; /(a|)*/; print $1'
    -Segmentation fault
    -
    - -Your mileage may vary, of course... -

    "\Q" doesn't work, or does it?

    In Perl the following code works as expected, i.e. it prints 1. @@ -2356,9 +1930,9 @@ print 1 If you try to do something similar in CL-PPCRE, you get an error:
    -* (let ((cl-ppcre:*allow-quoting* t)
    +* (let ((*allow-quoting* t)
             (a "\\E*"))
    -    (cl-ppcre:scan (concatenate 'string "(?:\\Q" a "\\E){2}") "\\E*\\E*"))
    +    (scan (concatenate 'string "(?:\\Q" a "\\E){2}") "\\E*\\E*"))
     Quantifier '*' not allowed at position 3 in string "(?:*\\E){2}"
     
    @@ -2380,9 +1954,7 @@ try CL-INTERPOL or use QUOTE-META-CHARS:
     * (let ((a "\\E*"))
    -    (cl-ppcre:scan (concatenate 'string
    -                                "(?:" (cl-ppcre:quote-meta-chars a) "){2}")
    -                   "\\E*\\E*"))
    +    (scan (concatenate 'string "(?:" (quote-meta-chars a) "){2}") "\\E*\\E*"))
     0
     6
     #()
    @@ -2391,8 +1963,7 @@ href="#quote-meta-chars">QUOTE-META-CHARS:
     Or, even better and Lisp-ier, use the S-expression syntax instead - no need for quoting in this case:
     
     * (let ((a "\\E*"))
    -    (cl-ppcre:scan `(:greedy-repetition 2 2 ,a)
    -                   "\\E*\\E*"))
    +    (scan `(:greedy-repetition 2 2 ,a) "\\E*\\E*"))
     0
     6
     #()
    @@ -2403,11 +1974,11 @@ Or, even better and Lisp-ier, use the S-expression sy
     
     
     * (let ((a "y\\y"))
    -    (cl-ppcre:scan a a))
    +    (scan a a))
     NIL
     
    -You didn't expect this to yield NIL, did you? Shouldn't something like (CL-PPCRE:SCAN A A) always return a true value? No, because the first and the second argument to SCAN are handled differently: The first argument is fed to CL-PPCRE's parser and is treated like a Perl regular expression. In particular, the parser "sees" \y and converts it to y because \y has no special meaning in regular expressions. So, the regular expression is the constant string "yy". But the second argument isn't converted - it is left as is, i.e. it's equivalent to Perl's 'y\y'. In other words, this example would be equivalent to the Perl code +You didn't expect this to yield NIL, did you? Shouldn't something like (SCAN A A) always return a true value? No, because the first and the second argument to SCAN are handled differently: The first argument is fed to CL-PPCRE's parser and is treated like a Perl regular expression. In particular, the parser "sees" \y and converts it to y because \y has no special meaning in regular expressions. So, the regular expression is the constant string "yy". But the second argument isn't converted - it is left as is, i.e. it's equivalent to Perl's 'y\y'. In other words, this example would be equivalent to the Perl code
     'y\y' =~ /y\y/;
    @@ -2424,16 +1995,6 @@ which should explain why it doesn't match.
     

    Still confused? You might want to try CL-INTERPOL. -
     

    Remarks

    - -The sample output from CMUCL and CLISP has been slightly edited to -increase readability. -

    -All test cases and benchmarks in this document where performed on an -IBM Thinkpad T23 laptop (Pentium III 1.2 GHz, -768 MB RAM) running Gentoo -Linux 1.1a. -
     

    AllegroCL compatibility mode

    Since autumn 2004
  • The AllegroCL engine doesn't offer parse tree synonyms and filters. -
  • The AllegroCL engine will choke on some regular expressions involving curly braces that are accepted by Perl and CL-PPCRE's native engine. -
  • The AllegroCL engine's case-folding mode switch (which is used instead of CL-PPCRE's :CASE-INSENSITIVE keyword parameter) is currently only effective for ASCII characters. -
  • The AllegroCL engine doesn't support quoting of metacharacters. +
  • The AllegroCL engine will choke on some regular expressions involving curly braces that are accepted by Perl and CL-PPCRE's native engine. +
  • The AllegroCL engine's case-folding mode switch (which is used instead of CL-PPCRE's :CASE-INSENSITIVE keyword parameter) is currently only effective for ASCII characters. +
  • The AllegroCL engine doesn't support quoting of metacharacters.
  • In AllegroCL compatibility mode compiled regular expressions (as returned by CREATE-SCANNER) aren't functions but structures. +
  • The AllegroCL engine doesn't support named properties.
-For more details about the AllegroCL engine and possible deviations from CL-PPCRE see the documentation at the Franz Inc. website. +For more details about the AllegroCL engine and possible deviations from CL-PPCRE see the documentation at the Franz Inc. website.

To use the AllegroCL compatibility mode you have to

@@ -2479,7 +2041,7 @@ To use the AllegroCL compatibility mode you have to
 
 
 

Acknowledgements

-Although I didn't use their code I was heavily inspired by looking at +Although I didn't use their code, I was heavily inspired by looking at the Scheme/CL regex implementations of Dorai Sitaram and mailing list as well as the output of Perl's use re "debug" pragma have been very helpful in optimizing the scanners created by CL-PPCRE. -

The asdf system definitions were kindly provided by Marco -Baringer. Hannu Koivisto provided patches to make the -.system files more usable. Thanks to Kevin Rosenberg and -Douglas Crosher for pointing out how to be friendly to case-sensitive -ACL images. Thanks to Karsten Poeck and JP Massar for their help in -making CL-PPCRE work with Corman Lisp. JP Massar and Kent M. Pitman -also helped to improve/fix the test suite and the compiler macro. Nikodemus Siivola provided the -fast charset implementation in charset.lisp. See the ChangeLog for several -other people who helped with bug reports or patches. +

The list of people who participated in this project in one way or +the other has grown too long to maintain it here. See +the ChangeLog for all +the people who helped with patches, bug reports, or in other ways. +Thanks to all of them!

-Thanks to the guys at "Café Olé" in Hamburg -where I wrote most of the code and thanks to my wife for lending me -her PowerBook to test CL-PPCRE with MCL and OpenMCL. +Thanks to the guys at +"Café +Olé" +in Hamburg where I +wrote most of the 0.1.0 release and thanks to my wife for lending +me her PowerBook to test early versions of CL-PPCRE with MCL and +OpenMCL.

-$Header: /usr/local/cvsrep/cl-ppcre/doc/index.html,v 1.171 2008/07/03 10:06:17 edi Exp $ +$Header: /usr/local/cvsrep/cl-ppcre/doc/index.html,v 1.191 2008/07/23 02:14:09 edi Exp $

BACK TO MY HOMEPAGE diff --git a/errors.lisp b/errors.lisp index 839d284..436ceb6 100644 --- a/errors.lisp +++ b/errors.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/errors.lisp,v 1.18 2008/06/25 14:04:27 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/errors.lisp,v 1.21 2008/07/06 18:12:04 edi Exp $ ;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. @@ -27,7 +27,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (defvar *syntax-error-string* nil "The string which caused the syntax error.") @@ -69,16 +69,16 @@ parse tree).") (:documentation "Signaled when CL-PPCRE functions are invoked with wrong arguments.")) -(defmacro signal-ppcre-syntax-error* (pos format-control &rest format-arguments) +(defmacro signal-syntax-error* (pos format-control &rest format-arguments) `(error 'ppcre-syntax-error :pos ,pos :format-control ,format-control :format-arguments (list ,@format-arguments))) -(defmacro signal-ppcre-syntax-error (format-control &rest format-arguments) - `(signal-ppcre-syntax-error* nil ,format-control ,@format-arguments)) +(defmacro signal-syntax-error (format-control &rest format-arguments) + `(signal-syntax-error* nil ,format-control ,@format-arguments)) -(defmacro signal-ppcre-invocation-error (format-control &rest format-arguments) +(defmacro signal-invocation-error (format-control &rest format-arguments) `(error 'ppcre-invocation-error :format-control ,format-control :format-arguments (list ,@format-arguments))) diff --git a/lexer.lisp b/lexer.lisp index 1462ad9..6a88ed3 100644 --- a/lexer.lisp +++ b/lexer.lisp @@ -1,12 +1,12 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/lexer.lisp,v 1.28 2008/06/25 14:04:27 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/lexer.lisp,v 1.34 2008/07/06 22:36:30 edi Exp $ ;;; The lexer's responsibility is to convert the regex string into a ;;; sequence of tokens which are in turn consumed by the parser. ;;; ;;; The lexer is aware of Perl's 'extended mode' and it also 'knows' ;;; (with a little help from the parser) how many register groups it -;;; has opened so far. (The latter is necessary for interpreting +;;; has opened so far. (The latter is necessary for interpreting ;;; strings like "\\10" correctly.) ;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. @@ -35,7 +35,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (declaim (inline map-char-to-special-class)) (defun map-char-to-special-char-class (chr) @@ -56,27 +56,18 @@ their associated character classes." ((#\S) :non-whitespace-char-class))) -(locally - (declare #.*standard-optimize-settings*) - (defstruct (lexer (:constructor make-lexer-internal)) - "LEXER structures are used to hold the regex string which is +(defstruct (lexer (:constructor make-lexer-internal)) + "LEXER structures are used to hold the regex string which is currently lexed and to keep track of the lexer's state." - (str "" - :type string - :read-only t) - (len 0 - :type fixnum - :read-only t) - (reg 0 - :type fixnum) - (pos 0 - :type fixnum) - (last-pos nil - :type list))) + (str "" :type string :read-only t) + (len 0 :type fixnum :read-only t) + (reg 0 :type fixnum) + (pos 0 :type fixnum) + (last-pos nil :type list)) (defun make-lexer (string) (declare (inline make-lexer-internal) - #-genera (type string string)) + #-:genera (string string)) (make-lexer-internal :str (maybe-coerce-to-simple-string string) :len (length string))) @@ -101,12 +92,10 @@ Does not respect extended mode." (declare #.*standard-optimize-settings*) "Returns the next character which is to be examined and updates the POS slot. Does not respect extended mode." - (cond ((end-of-string-p lexer) - nil) - (t - (prog1 - (schar (lexer-str lexer) (lexer-pos lexer)) - (incf (lexer-pos lexer)))))) + (cond ((end-of-string-p lexer) nil) + (t (prog1 + (schar (lexer-str lexer) (lexer-pos lexer)) + (incf (lexer-pos lexer)))))) (defun next-char (lexer) (declare #.*standard-optimize-settings*) @@ -135,9 +124,7 @@ nested comments are skipped if applicable." while (and skip-char (char/= skip-char #\))) finally (return skip-char)) - (signal-ppcre-syntax-error* - error-pos - "Comment group not closed"))) + (signal-syntax-error* error-pos "Comment group not closed."))) (setq next-char (next-char-non-extended lexer))) (t ;; undo effect of previous INCF if we didn't see a # @@ -177,7 +164,7 @@ nested comments are skipped if applicable." "Moves (LEXER-POS LEXER) back to the last position stored in \(LEXER-LAST-POS LEXER) and pops the LAST-POS stack." (unless (lexer-last-pos lexer) - (signal-ppcre-syntax-error "LAST-POS stack of LEXER ~A is empty" lexer)) + (signal-syntax-error "LAST-POS stack of LEXER ~A is empty." lexer)) (setf (lexer-pos lexer) (pop (lexer-last-pos lexer))) nil) @@ -232,19 +219,16 @@ the corresponding number started within the regex string." (let ((code (logand #o377 (the fixnum (or number 0))))) (or (and (< code char-code-limit) (code-char code)) - (signal-ppcre-syntax-error* - error-pos - "No character for hex-code ~X" - number)))) + (signal-syntax-error* error-pos "No character for hex-code ~X." number)))) (defun unescape-char (lexer) (declare #.*standard-optimize-settings*) - "Convert the characters(s) following a backslash into a token + "Convert the characters\(s) following a backslash into a token which is returned. This function is to be called when the backslash has already been consumed. Special character classes like \\W are handled elsewhere." (when (end-of-string-p lexer) - (signal-ppcre-syntax-error "String ends with backslash")) + (signal-syntax-error "String ends with backslash.")) (let ((chr (next-char-non-extended lexer))) (case chr ((#\E) @@ -257,9 +241,7 @@ handled elsewhere." ;; \cx means control-x in Perl (let ((next-char (next-char-non-extended lexer))) (unless next-char - (signal-ppcre-syntax-error* - (lexer-pos lexer) - "Character missing after '\\c' at position ~A")) + (signal-syntax-error* (lexer-pos lexer) "Character missing after '\\c' at position ~A.")) (code-char (logxor #x40 (char-code (char-upcase next-char)))))) ((#\x) ;; \x should be followed by a hexadecimal char code, @@ -295,12 +277,28 @@ handled elsewhere." ;; all other characters aren't affected by a backslash chr)))) -(defun collect-char-class (lexer) +(defun read-char-property (lexer first-char) (declare #.*standard-optimize-settings*) + (unless (eql (next-char-non-extended lexer) #\{) + (signal-syntax-error* (lexer-pos lexer) "Expected left brace after \\~A." first-char)) + (let ((name (with-output-to-string (out nil :element-type + #+:lispworks 'lw:simple-char #-:lispworks 'character) + (loop + (let ((char (or (next-char-non-extended lexer) + (signal-syntax-error "Unexpected EOF after \\~A{." first-char)))) + (when (char= char #\}) + (return)) + (write-char char out)))))) + (list (if (char= first-char #\p) :property :inverted-property) + ;; we must reverse here because of what PARSE-STRING does + (nreverse name)))) + +(defun collect-char-class (lexer) "Reads and consumes characters from regex string until a right -bracket is seen. Assembles them into a list \(which is returned) of +bracket is seen. Assembles them into a list \(which is returned) of characters, character ranges, like \(:RANGE #\\A #\\E) for a-e, and tokens representing special character classes." + (declare #.*standard-optimize-settings*) (let ((start-pos (lexer-pos lexer)) ; remember start for error message hyphen-seen last-char @@ -309,72 +307,85 @@ tokens representing special character classes." "Do the right thing with character C depending on whether we're inside a range or not." (cond ((and hyphen-seen last-char) - (setf (car list) (list :range last-char c) - last-char nil)) + (setf (car list) (list :range last-char c) + last-char nil)) (t - (push c list) - (setq last-char c))) + (push c list) + (setq last-char c))) (setq hyphen-seen nil))) (loop for first = t then nil for c = (next-char-non-extended lexer) ;; leave loop if at end of string while c do (cond - ((char= c #\\) - ;; we've seen a backslash - (let ((next-char (next-char-non-extended lexer))) - (case next-char - ((#\d #\D #\w #\W #\s #\S) - ;; a special character class - (push (map-char-to-special-char-class next-char) list) - ;; if the last character was a hyphen - ;; just collect it literally - (when hyphen-seen - (push #\- list)) - ;; if the next character is a hyphen do the same - (when (looking-at-p lexer #\-) - (push #\- list) - (incf (lexer-pos lexer))) - (setq hyphen-seen nil)) - ((#\E) - ;; if \Q quoting is on we ignore \E, - ;; otherwise it's just a plain #\E - (unless *allow-quoting* - (handle-char #\E))) - (otherwise - ;; otherwise unescape the following character(s) - (decf (lexer-pos lexer)) - (handle-char (unescape-char lexer)))))) - (first - ;; the first character must not be a right bracket - ;; and isn't treated specially if it's a hyphen - (handle-char c)) - ((char= c #\]) - ;; end of character class - ;; make sure we collect a pending hyphen - (when hyphen-seen - (setq hyphen-seen nil) - (handle-char #\-)) - ;; reverse the list to preserve the order intended - ;; by the author of the regex string - (return-from collect-char-class (nreverse list))) - ((and (char= c #\-) - last-char - (not hyphen-seen)) - ;; if the last character was 'just a character' - ;; we expect to be in the middle of a range - (setq hyphen-seen t)) - ((char= c #\-) - ;; otherwise this is just an ordinary hyphen + ((char= c #\\) + ;; we've seen a backslash + (let ((next-char (next-char-non-extended lexer))) + (case next-char + ((#\d #\D #\w #\W #\s #\S) + ;; a special character class + (push (map-char-to-special-char-class next-char) list) + ;; if the last character was a hyphen + ;; just collect it literally + (when hyphen-seen + (push #\- list)) + ;; if the next character is a hyphen do the same + (when (looking-at-p lexer #\-) + (push #\- list) + (incf (lexer-pos lexer))) + (setq hyphen-seen nil)) + ((#\P #\p) + ;; maybe a character property + (cond ((null *property-resolver*) + (handle-char next-char)) + (t + (push (read-char-property lexer next-char) list) + ;; if the last character was a hyphen + ;; just collect it literally + (when hyphen-seen + (push #\- list)) + ;; if the next character is a hyphen do the same + (when (looking-at-p lexer #\-) + (push #\- list) + (incf (lexer-pos lexer))) + (setq hyphen-seen nil)))) + ((#\E) + ;; if \Q quoting is on we ignore \E, + ;; otherwise it's just a plain #\E + (unless *allow-quoting* + (handle-char #\E))) + (otherwise + ;; otherwise unescape the following character(s) + (decf (lexer-pos lexer)) + (handle-char (unescape-char lexer)))))) + (first + ;; the first character must not be a right bracket + ;; and isn't treated specially if it's a hyphen + (handle-char c)) + ((char= c #\]) + ;; end of character class + ;; make sure we collect a pending hyphen + (when hyphen-seen + (setq hyphen-seen nil) (handle-char #\-)) - (t - ;; default case - just collect the character - (handle-char c)))) + ;; reverse the list to preserve the order intended + ;; by the author of the regex string + (return-from collect-char-class (nreverse list))) + ((and (char= c #\-) + last-char + (not hyphen-seen)) + ;; if the last character was 'just a character' + ;; we expect to be in the middle of a range + (setq hyphen-seen t)) + ((char= c #\-) + ;; otherwise this is just an ordinary hyphen + (handle-char #\-)) + (t + ;; default case - just collect the character + (handle-char c)))) ;; we can only exit the loop normally if we've reached the end ;; of the regex string without seeing a right bracket - (signal-ppcre-syntax-error* - start-pos - "Missing right bracket to close character class")))) + (signal-syntax-error* start-pos "Missing right bracket to close character class.")))) (defun maybe-parse-flags (lexer) (declare #.*standard-optimize-settings*) @@ -387,7 +398,7 @@ the behaviour of the lexer itself via the special variable (loop with set = t for chr = (next-char-non-extended lexer) unless chr - do (signal-ppcre-syntax-error "Unexpected end of string") + do (signal-syntax-error "Unexpected end of string.") while (find chr "-imsx" :test #'char=) ;; the first #\- will invert the meaning of all modifiers ;; following it @@ -473,9 +484,7 @@ closing #\> will also be consumed." :test #'char=))) (unless end-name ;; there has to be > somewhere, syntax error otherwise - (signal-ppcre-syntax-error* - (1- (lexer-pos lexer)) - "Opening #\< in named group has no closing #\>")) + (signal-syntax-error* (1- (lexer-pos lexer)) "Opening #\< in named group has no closing #\>.")) (let ((name (subseq (lexer-str lexer) (lexer-pos lexer) end-name))) @@ -484,9 +493,7 @@ closing #\> will also be consumed." (char= #\- char))) name) ;; register name can contain only alphanumeric characters or #\- - (signal-ppcre-syntax-error* - (lexer-pos lexer) - "Invalid character in named register group")) + (signal-syntax-error* (lexer-pos lexer) "Invalid character in named register group.")) ;; advance lexer beyond "" part (setf (lexer-pos lexer) (1+ end-name)) name))) @@ -518,10 +525,7 @@ closing #\> will also be consumed." ((#\+ #\*) ;; quantifiers will always be consumend by ;; GET-QUANTIFIER, they must not appear here - (signal-ppcre-syntax-error* - (1- (lexer-pos lexer)) - "Quantifier '~A' not allowed" - next-char)) + (signal-syntax-error* (1- (lexer-pos lexer)) "Quantifier '~A' not allowed." next-char)) ((#\{) ;; left brace isn't a special character in it's own ;; right but we must check if what follows might @@ -530,12 +534,11 @@ closing #\> will also be consumed." (this-last-pos (lexer-last-pos lexer))) (unget-token lexer) (when (get-quantifier lexer) - (signal-ppcre-syntax-error* - (car this-last-pos) - "Quantifier '~A' not allowed" - (subseq (lexer-str lexer) - (car this-last-pos) - (lexer-pos lexer)))) + (signal-syntax-error* (car this-last-pos) + "Quantifier '~A' not allowed." + (subseq (lexer-str lexer) + (car this-last-pos) + (lexer-pos lexer)))) (setf (lexer-pos lexer) this-pos (lexer-last-pos lexer) this-last-pos) next-char)) @@ -580,7 +583,7 @@ closing #\> will also be consumed." (let* ((old-pos (decf (lexer-pos lexer))) ;; ...so let's get the whole number first (backref-number (get-number lexer))) - (declare (type fixnum backref-number)) + (declare (fixnum backref-number)) (cond ((and (> backref-number (lexer-reg lexer)) (<= 10 backref-number)) ;; \10 and higher are treated as octal @@ -603,6 +606,10 @@ closing #\> will also be consumed." (let ((old-pos (decf (lexer-pos lexer)))) (make-char-from-code (get-number lexer :radix 8 :max-length 3) old-pos))) + ((#\P #\p) + ;; might be a named property + (cond (*property-resolver* (read-char-property lexer next-char)) + (t next-char))) (otherwise ;; in all other cases just unescape the ;; character @@ -622,17 +629,15 @@ closing #\> will also be consumed." ;; or a closing parenthesis are following (when (and flags (not (find next-char ":)" :test #'char=))) - (signal-ppcre-syntax-error* - (car (lexer-last-pos lexer)) - "Sequence '~A' not recognized" - (subseq (lexer-str lexer) - (car (lexer-last-pos lexer)) - (lexer-pos lexer)))) + (signal-syntax-error* (car (lexer-last-pos lexer)) + "Sequence '~A' not recognized." + (subseq (lexer-str lexer) + (car (lexer-last-pos lexer)) + (lexer-pos lexer)))) (case next-char ((nil) ;; syntax error - (signal-ppcre-syntax-error - "End of string following '(?'")) + (signal-syntax-error "End of string following '(?'.")) ((#\)) ;; an empty group except for the flags ;; (if there are any) @@ -664,10 +669,9 @@ closing #\> will also be consumed." ;; we have encountered a named group ;; are we supporting register naming? (unless *allow-named-registers* - (signal-ppcre-syntax-error* - (1- (lexer-pos lexer)) - "Character '~A' may not follow '(?<'" - next-char)) + (signal-syntax-error* (1- (lexer-pos lexer)) + "Character '~A' may not follow '(?<'." + next-char)) ;; put the letter back (decf (lexer-pos lexer)) ;; named group @@ -685,19 +689,16 @@ closing #\> will also be consumed." :void) ((nil) ;; syntax error - (signal-ppcre-syntax-error - "End of string following '(?<'")) + (signal-syntax-error "End of string following '(?<'.")) (t ;; also syntax error - (signal-ppcre-syntax-error* - (1- (lexer-pos lexer)) - "Character '~A' may not follow '(?<'" - next-char )))))) + (signal-syntax-error* (1- (lexer-pos lexer)) + "Character '~A' may not follow '(?<'." + next-char )))))) (otherwise - (signal-ppcre-syntax-error* - (1- (lexer-pos lexer)) - "Character '~A' may not follow '(?'" - next-char))))) + (signal-syntax-error* (1- (lexer-pos lexer)) + "Character '~A' may not follow '(?'." + next-char))))) (t ;; if next-char was not #\? (this is within ;; the first COND), we've just seen an opening diff --git a/load.lisp b/load.lisp deleted file mode 100644 index 09289fb..0000000 --- a/load.lisp +++ /dev/null @@ -1,67 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/load.lisp,v 1.16 2008/06/25 14:04:27 edi Exp $ - -;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package :cl-user) - -(let ((cl-ppcre-base-directory - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - must-compile) - (with-compilation-unit () - (dolist (file '("packages" - "specials" - "util" - "errors" - #-:use-acl-regexp2-engine "lexer" - #-:use-acl-regexp2-engine "parser" - #-:use-acl-regexp2-engine "regex-class" - #-:use-acl-regexp2-engine "convert" - #-:use-acl-regexp2-engine "optimize" - #-:use-acl-regexp2-engine "closures" - #-:use-acl-regexp2-engine "repetition-closures" - #-:use-acl-regexp2-engine "scanner" - "api" - "ppcre-tests")) - (let ((pathname (make-pathname :name file :type "lisp" :version nil - :defaults cl-ppcre-base-directory))) - ;; don't use COMPILE-FILE in Corman Lisp, it's broken - LOAD - ;; will yield compiled functions anyway - #-:cormanlisp - (let ((compiled-pathname (compile-file-pathname pathname))) - (unless (and (not must-compile) - (probe-file compiled-pathname) - (< (file-write-date pathname) - (file-write-date compiled-pathname))) - (setq must-compile t) - (compile-file pathname)) - (setq pathname compiled-pathname)) - (load pathname))))) - - - diff --git a/optimize.lisp b/optimize.lisp index 12c7256..70ca118 100644 --- a/optimize.lisp +++ b/optimize.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/optimize.lisp,v 1.31 2008/06/25 14:04:27 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/optimize.lisp,v 1.35 2008/07/06 18:12:04 edi Exp $ ;;; This file contains optimizations which can be applied to converted ;;; parse trees. @@ -30,7 +30,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (defgeneric flatten (regex) (declare #.*standard-optimize-settings*) @@ -96,8 +96,7 @@ operation on REGEX.")) alternation) ((cdr choices) (first choices)) - (t (signal-ppcre-syntax-error - "Encountered alternation without choices."))))) + (t (signal-syntax-error "Encountered alternation without choices."))))) (defmethod flatten ((branch branch)) (declare #.*standard-optimize-settings*) @@ -143,7 +142,7 @@ operation on REGEX.")) collector-start (collector-length 0) skip) - (declare (type fixnum collector-length)) + (declare (fixnum collector-length)) (loop (let ((elements-rest (cdr curr-point))) (unless elements-rest @@ -394,7 +393,7 @@ function called by END-STRIN.)")) concatenated-string concatenated-start (concatenated-length 0)) - (declare (type fixnum concatenated-length)) + (declare (fixnum concatenated-length)) (loop for element in (reverse (elements seq)) ;; remember the case-(in)sensitivity of the last relevant ;; STR object @@ -429,7 +428,7 @@ function called by END-STRIN.)")) concatenated-start nil)) (let ((len (len element-end)) (str (str element-end))) - (declare (type fixnum len)) + (declare (fixnum len)) (incf concatenated-length len) (loop for i of-type fixnum downfrom (1- len) to 0 do (vector-push-extend (char str i) diff --git a/packages.lisp b/packages.lisp index 9c5e862..e7a44f6 100644 --- a/packages.lisp +++ b/packages.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/packages.lisp,v 1.24 2008/06/25 14:04:27 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/packages.lisp,v 1.38 2008/07/22 23:54:59 edi Exp $ ;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. @@ -29,78 +29,40 @@ (in-package :cl-user) -#-:cormanlisp -(defpackage #:cl-ppcre - (:nicknames #:ppcre) - #+genera (:shadowing-import-from #:common-lisp #:lambda #:simple-string #:string) - (:use #-genera #:cl #+genera #:future-common-lisp) - (:export #:create-scanner - #:parse-tree-synonym - #:define-parse-tree-synonym - #:scan - #:scan-to-strings - #:do-scans - #:do-matches - #:do-matches-as-strings - #:all-matches - #:all-matches-as-strings - #:split - #:regex-replace - #:regex-replace-all - #:regex-apropos - #:regex-apropos-list - #:quote-meta-chars - #:*regex-char-code-limit* - #:*use-bmh-matchers* - #:*allow-quoting* - #:*allow-named-registers* - #:ppcre-error - #:ppcre-invocation-error - #:ppcre-syntax-error - #:ppcre-syntax-error-string - #:ppcre-syntax-error-pos - #:register-groups-bind - #:do-register-groups)) - -#+:cormanlisp -(defpackage "CL-PPCRE" - (:nicknames "PPCRE") - (:use "CL") - (:export "CREATE-SCANNER" - "PARSE-TREE-SYNONYM" - "DEFINE-PARSE-TREE-SYNONYM" - "SCAN" - "SCAN-TO-STRINGS" - "DO-SCANS" - "DO-MATCHES" - "DO-MATCHES-AS-STRINGS" - "ALL-MATCHES" - "ALL-MATCHES-AS-STRINGS" - "SPLIT" - "REGEX-REPLACE" - "REGEX-REPLACE-ALL" - "REGEX-APROPOS" - "REGEX-APROPOS-LIST" - "QUOTE-META-CHARS" - "*REGEX-CHAR-CODE-LIMIT*" - "*USE-BMH-MATCHERS*" - "*ALLOW-QUOTING*" - "*ALLOW-NAMED-REGISTERS*" - "PPCRE-ERROR" - "PPCRE-INVOCATION-ERROR" - "PPCRE-SYNTAX-ERROR" - "PPCRE-SYNTAX-ERROR-STRING" - "PPCRE-SYNTAX-ERROR-POS" - "REGISTER-GROUPS-BIND" - "DO-REGISTER-GROUPS")) - -#-:cormanlisp -(defpackage #:cl-ppcre-test - #+genera (:shadowing-import-from #:common-lisp #:lambda) - (:use #-genera #:cl #+genera #:future-common-lisp #:cl-ppcre) - (:export #:test)) - -#+:cormanlisp -(defpackage "CL-PPCRE-TEST" - (:use "CL" "CL-PPCRE") - (:export "TEST")) +(defpackage :cl-ppcre + (:nicknames :ppcre) + #+:genera + (:shadowing-import-from :common-lisp :lambda :simple-string :string) + (:use #-:genera :cl #+:genera :future-common-lisp) + (:shadow :digit-char-p :defconstant) + (:export :parse-string + :create-scanner + :create-optimized-test-function + :parse-tree-synonym + :define-parse-tree-synonym + :scan + :scan-to-strings + :do-scans + :do-matches + :do-matches-as-strings + :all-matches + :all-matches-as-strings + :split + :regex-replace + :regex-replace-all + :regex-apropos + :regex-apropos-list + :quote-meta-chars + :*regex-char-code-limit* + :*use-bmh-matchers* + :*allow-quoting* + :*allow-named-registers* + :*optimize-char-classes* + :*property-resolver* + :ppcre-error + :ppcre-invocation-error + :ppcre-syntax-error + :ppcre-syntax-error-string + :ppcre-syntax-error-pos + :register-groups-bind + :do-register-groups)) diff --git a/parser.lisp b/parser.lisp index 9fd0820..1bce65e 100644 --- a/parser.lisp +++ b/parser.lisp @@ -1,11 +1,11 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/parser.lisp,v 1.25 2008/06/25 14:04:28 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/parser.lisp,v 1.30 2008/07/06 18:12:05 edi Exp $ ;;; The parser will - with the help of the lexer - parse a regex ;;; string and convert it into a "parse tree" (see docs for details -;;; about the syntax of these trees). Note that the lexer might return -;;; illegal parse trees. It is assumed that the conversion process -;;; later on will track them down. +;;; about the syntax of these trees). Note that the lexer might +;;; return illegal parse trees. It is assumed that the conversion +;;; process later on will track them down. ;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. @@ -33,10 +33,9 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (defun group (lexer) - (declare #.*standard-optimize-settings*) "Parses and consumes a . The productions are: -> \"\(\"\")\" \"\(?:\"\")\" @@ -53,6 +52,7 @@ The productions are: -> \"\(\"\")\" where is parsed by the lexer function MAYBE-PARSE-FLAGS. Will return or \( ) where is one of six keywords - see source for details." + (declare #.*standard-optimize-settings*) (multiple-value-bind (open-token flags) (get-token lexer) (cond ((eq open-token :open-paren-paren) @@ -65,7 +65,7 @@ Will return or \( ) where (number (try-number lexer :no-whitespace-p t)) ;; make changes to extended-mode-p local (*extended-mode-p* *extended-mode-p*)) - (declare (type fixnum open-paren-pos)) + (declare (fixnum open-paren-pos)) (cond (number ;; condition is a number (i.e. refers to a ;; back-reference) @@ -73,13 +73,11 @@ Will return or \( ) where (reg-expr (reg-expr lexer)) (close-token (get-token lexer))) (unless (eq inner-close-token :close-paren) - (signal-ppcre-syntax-error* - (+ open-paren-pos 2) - "Opening paren has no matching closing paren")) + (signal-syntax-error* (+ open-paren-pos 2) + "Opening paren has no matching closing paren.")) (unless (eq close-token :close-paren) - (signal-ppcre-syntax-error* - open-paren-pos - "Opening paren has no matching closing paren")) + (signal-syntax-error* open-paren-pos + "Opening paren has no matching closing paren.")) (list :branch number reg-expr))) (t ;; condition must be a full regex (actually a @@ -94,9 +92,8 @@ Will return or \( ) where (reg-expr (reg-expr lexer)) (close-token (get-token lexer))) (unless (eq close-token :close-paren) - (signal-ppcre-syntax-error* - open-paren-pos - "Opening paren has no matching closing paren")) + (signal-syntax-error* open-paren-pos + "Opening paren has no matching closing paren.")) (list :branch inner-reg-expr reg-expr)))))) ((member open-token '(:open-paren :open-paren-colon @@ -124,9 +121,8 @@ Will return or \( ) where (unless (eq close-token :close-paren) ;; the token following must be the closing ;; parenthesis or this is a syntax error - (signal-ppcre-syntax-error* - open-paren-pos - "Opening paren has no matching closing paren")) + (signal-syntax-error* open-paren-pos + "Opening paren has no matching closing paren.")) (if flags ;; if the lexer has returned a list of flags this must ;; have been the "(?:"")" production @@ -160,11 +156,11 @@ Will return or \( ) where open-token)))) (defun greedy-quant (lexer) - (declare #.*standard-optimize-settings*) "Parses and consumes a . The productions are: -> | where is parsed by the lexer function GET-QUANTIFIER. Will return or (:GREEDY-REPETITION )." + (declare #.*standard-optimize-settings*) (let* ((group (group lexer)) (token (get-quantifier lexer))) (if token @@ -174,11 +170,11 @@ Will return or (:GREEDY-REPETITION )." group))) (defun quant (lexer) - (declare #.*standard-optimize-settings*) "Parses and consumes a . The productions are: -> | \"?\". Will return the returned by GREEDY-QUANT and optionally change :GREEDY-REPETITION to :NON-GREEDY-REPETITION." + (declare #.*standard-optimize-settings*) (let* ((greedy-quant (greedy-quant lexer)) (pos (lexer-pos lexer)) (next-char (next-char lexer))) @@ -189,10 +185,10 @@ change :GREEDY-REPETITION to :NON-GREEDY-REPETITION." greedy-quant)) (defun seq (lexer) - (declare #.*standard-optimize-settings*) "Parses and consumes a . The productions are: -> | . Will return or (:SEQUENCE )." + (declare #.*standard-optimize-settings*) (flet ((make-array-from-two-chars (char1 char2) (let ((string (make-array 2 :element-type 'character @@ -254,10 +250,10 @@ Will return or (:SEQUENCE )." :void))) (defun reg-expr (lexer) - (declare #.*standard-optimize-settings*) "Parses and consumes a , a complete regular expression. The productions are: -> | \"|\". Will return or (:ALTERNATION )." + (declare #.*standard-optimize-settings*) (let ((pos (lexer-pos lexer))) (case (next-char lexer) ((nil) @@ -299,6 +295,8 @@ Will return or (:ALTERNATION )." seq))))))) (defun reverse-strings (parse-tree) + "Recursively walks through PARSE-TREE and destructively reverses all +strings in it." (declare #.*standard-optimize-settings*) (cond ((stringp parse-tree) (nreverse parse-tree)) @@ -311,13 +309,11 @@ Will return or (:ALTERNATION )." (t parse-tree))) (defun parse-string (string) - (declare #.*standard-optimize-settings*) "Translate the regex string STRING into a parse tree." + (declare #.*standard-optimize-settings*) (let* ((lexer (make-lexer string)) (parse-tree (reverse-strings (reg-expr lexer)))) ;; check whether we've consumed the whole regex string (if (end-of-string-p lexer) parse-tree - (signal-ppcre-syntax-error* - (lexer-pos lexer) - "Expected end of string")))) + (signal-syntax-error* (lexer-pos lexer) "Expected end of string.")))) diff --git a/ppcre-tests.lisp b/ppcre-tests.lisp deleted file mode 100644 index 25cb6c1..0000000 --- a/ppcre-tests.lisp +++ /dev/null @@ -1,269 +0,0 @@ -;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/ppcre-tests.lisp,v 1.36 2008/06/25 14:04:28 edi Exp $ - -;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. - -;;; Redistribution and use in source and binary forms, with or without -;;; modification, are permitted provided that the following conditions -;;; are met: - -;;; * Redistributions of source code must retain the above copyright -;;; notice, this list of conditions and the following disclaimer. - -;;; * Redistributions in binary form must reproduce the above -;;; copyright notice, this list of conditions and the following -;;; disclaimer in the documentation and/or other materials -;;; provided with the distribution. - -;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED -;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(in-package #:cl-ppcre-test) - -(defparameter *cl-ppcre-test-base-directory* - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - -(defun full-gc () - "Start a full garbage collection." - ;; what are the corresponding values for MCL and OpenMCL? - #+:allegro (excl:gc t) - #+(or :cmu :scl) (ext:gc :full t) - #+:ecl (si:gc t) - #+:clisp (ext:gc) - #+:cormanlisp (loop for i from 0 to 3 do (cormanlisp:gc i)) - #+:lispworks4 (hcl:mark-and-sweep 3) - #+:lispworks5 (hcl:gc-generation #+:lispworks-32bit 3 #+:lispworks-64bit :blocking-gen-num) - #+:sbcl (sb-ext:gc :full t)) - -;; warning: ugly code ahead!! -;; this is just a quick hack for testing purposes - -(defun time-regex (factor regex string - &key case-insensitive-mode - multi-line-mode - single-line-mode - extended-mode) - (declare #.ppcre::*standard-optimize-settings*) - "Auxiliary function used by TEST to benchmark a regex scanner -against Perl timings." - (declare (type string string)) - (let* ((scanner (create-scanner regex - :case-insensitive-mode case-insensitive-mode - :multi-line-mode multi-line-mode - :single-line-mode single-line-mode - :extended-mode extended-mode)) - ;; make sure GC doesn't invalidate our benchmarking - (dummy (full-gc)) - (start (get-internal-real-time))) - (declare (ignore dummy)) - (dotimes (i factor) - (funcall scanner string 0 (length string))) - (float (/ (- (get-internal-real-time) start) internal-time-units-per-second)))) - -#+(or scl - lispworks - (and sbcl sb-thread)) -(defun threaded-scan (scanner target-string &key (threads 10) (repetitions 5000)) - (declare #.ppcre::*standard-optimize-settings*) - "Auxiliary function used by TEST to check whether SCANNER is thread-safe." - (full-gc) - (let ((collector (make-array threads)) - (counter 0)) - (loop for i below threads - do (let* ((j i) - (fn - (lambda () - (let ((r (random repetitions))) - (loop for k below repetitions - if (= k r) - do (setf (aref collector j) - (let ((result - (multiple-value-list - (cl-ppcre:scan scanner target-string)))) - (unless (cdr result) - (setq result '(nil nil #() #()))) - result)) - else - do (cl-ppcre:scan scanner target-string)) - (incf counter))))) - #+scl (thread:thread-create fn) - #+lispworks (mp:process-run-function "" nil fn) - #+(and sbcl sb-thread) (sb-thread:make-thread fn))) - (loop while (< counter threads) - do (sleep .1)) - (destructuring-bind (first-start first-end first-reg-starts first-reg-ends) - (aref collector 0) - (loop for (start end reg-starts reg-ends) across collector - if (or (not (eql first-start start)) - (not (eql first-end end)) - (/= (length first-reg-starts) (length reg-starts)) - (/= (length first-reg-ends) (length reg-ends)) - (loop for first-reg-start across first-reg-starts - for reg-start across reg-starts - thereis (not (eql first-reg-start reg-start))) - (loop for first-reg-end across first-reg-ends - for reg-end across reg-ends - thereis (not (eql first-reg-end reg-end)))) - do (return (format nil "~&Inconsistent results during multi-threading")))))) - -(defun create-string-from-input (input) - (cond ((or (null input) - (stringp input)) - input) - (t - (cl-ppcre::string-list-to-simple-string - (loop for element in input - if (stringp element) - collect element - else - collect (string (code-char element))))))) - -(defun test (&key (file-name - (make-pathname :name "testdata" - :type nil :version nil - :defaults *cl-ppcre-test-base-directory*) - file-name-provided-p) - threaded) - (declare #.ppcre::*standard-optimize-settings*) - (declare (ignorable threaded)) - "Loop through all test cases in FILE-NAME and print report. Only in -LispWorks and SCL: If THREADED is true, also test whether the scanners -work multi-threaded." - (with-open-file (stream file-name - #+(or :allegro :clisp :scl :sbcl) - :external-format - #+(or :allegro :clisp :scl :sbcl) - (if file-name-provided-p - :default - #+(or :allegro :scl :sbcl) :iso-8859-1 - #+:clisp charset:iso-8859-1)) - (loop with testcount of-type fixnum = 0 - with *regex-char-code-limit* = (if file-name-provided-p - *regex-char-code-limit* - ;; the standard test suite - ;; doesn't need Unicode - ;; support - 256) - with *allow-quoting* = (if file-name-provided-p - *allow-quoting* - t) - for input-line = (read stream nil nil) - for (counter info-string regex - case-insensitive-mode multi-line-mode - single-line-mode extended-mode - string perl-error factor - perl-time ex-result ex-subs) = input-line - while input-line - do (let ((info-string (create-string-from-input info-string)) - (regex (create-string-from-input regex)) - (string (create-string-from-input string)) - (ex-result (create-string-from-input ex-result)) - (ex-subs (mapcar #'create-string-from-input ex-subs)) - (errors '())) - ;; provide some visual feedback for slow CL - ;; implementations; suggested by JP Massar - (incf testcount) - #+(or scl - lispworks - (and sbcl sb-thread)) - (when threaded - (format t "Test #~A (ID ~A)~%" testcount counter) - (force-output)) - (unless #-(or scl - lispworks - (and sbcl sb-thread)) - nil - #+(or scl - lispworks - (and sbcl sb-thread)) - threaded - (when (zerop (mod testcount 10)) - (format t ".") - (force-output)) - (when (zerop (mod testcount 100)) - (terpri))) - (handler-case - (let* ((*use-bmh-matchers* (if (and (> factor 1) (plusp perl-time)) - *use-bmh-matchers* - ;; if we only check for - ;; correctness we don't - ;; care about speed that - ;; match (but rather - ;; about space - ;; constraints of the - ;; trial versions) - nil)) - (scanner (create-scanner regex - :case-insensitive-mode case-insensitive-mode - :multi-line-mode multi-line-mode - :single-line-mode single-line-mode - :extended-mode extended-mode))) - (multiple-value-bind (result1 result2 sub-starts sub-ends) - (scan scanner string) - (cond (perl-error - (push (format nil - "~&expected an error but got a result") - errors)) - (t - (when (not (eq result1 ex-result)) - (if result1 - (let ((result (subseq string result1 result2))) - (unless (string= result ex-result) - (push (format nil - "~&expected ~S but got ~S" - ex-result result) - errors)) - (setq sub-starts (coerce sub-starts 'list) - sub-ends (coerce sub-ends 'list)) - (loop for i from 0 - for ex-sub in ex-subs - for sub-start = (nth i sub-starts) - for sub-end = (nth i sub-ends) - for sub = (if (and sub-start sub-end) - (subseq string sub-start sub-end) - nil) - unless (string= ex-sub sub) - do (push (format nil - "~&\\~A: expected ~S but got ~S" - (1+ i) ex-sub sub) errors))) - (push (format nil - "~&expected ~S but got ~S" - ex-result result1) - errors))))) - #+(or scl - lispworks - (and sbcl sb-thread)) - (when threaded - (let ((thread-result (threaded-scan scanner string))) - (when thread-result - (push thread-result errors)))))) - (condition (msg) - (unless perl-error - (push (format nil "~&got an unexpected error: '~A'" msg) - errors)))) - (setq errors (nreverse errors)) - (cond (errors - (when (or (<= factor 1) (zerop perl-time)) - (format t "~&~4@A (~A):~{~& ~A~}~%" - counter info-string errors))) - ((and (> factor 1) (plusp perl-time)) - (let ((result (time-regex factor regex string - :case-insensitive-mode case-insensitive-mode - :multi-line-mode multi-line-mode - :single-line-mode single-line-mode - :extended-mode extended-mode))) - (format t "~&~4@A: ~,4F (~A repetitions, Perl: ~,4F seconds, CL-PPCRE: ~,4F seconds)" counter - (float (/ result perl-time)) factor perl-time result) - #+:cormanlisp (force-output *standard-output*))) - (t nil)))) - (values))) diff --git a/regex-class-util.lisp b/regex-class-util.lisp new file mode 100644 index 0000000..086f504 --- /dev/null +++ b/regex-class-util.lisp @@ -0,0 +1,555 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class-util.lisp,v 1.8 2008/07/22 22:38:05 edi Exp $ + +;;; This file contains some utility methods for REGEX objects. + +;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-ppcre) + +;;; The following four methods allow a VOID object to behave like a +;;; zero-length STR object (only readers needed) + +(defmethod len ((void void)) + (declare #.*standard-optimize-settings*) + 0) + +(defmethod str ((void void)) + (declare #.*standard-optimize-settings*) + "") + +(defmethod skip ((void void)) + (declare #.*standard-optimize-settings*) + nil) + +(defmethod start-of-end-string-p ((void void)) + (declare #.*standard-optimize-settings*) + nil) + +(defgeneric case-mode (regex old-case-mode) + (declare #.*standard-optimize-settings*) + (:documentation "Utility function used by the optimizer (see GATHER-STRINGS). +Returns a keyword denoting the case-(in)sensitivity of a STR or its +second argument if the STR has length 0. Returns NIL for REGEX objects +which are not of type STR.")) + +(defmethod case-mode ((str str) old-case-mode) + (declare #.*standard-optimize-settings*) + (cond ((zerop (len str)) + old-case-mode) + ((case-insensitive-p str) + :case-insensitive) + (t + :case-sensitive))) + +(defmethod case-mode ((regex regex) old-case-mode) + (declare #.*standard-optimize-settings*) + (declare (ignore old-case-mode)) + nil) + +(defgeneric copy-regex (regex) + (declare #.*standard-optimize-settings*) + (:documentation "Implements a deep copy of a REGEX object.")) + +(defmethod copy-regex ((anchor anchor)) + (declare #.*standard-optimize-settings*) + (make-instance 'anchor + :startp (startp anchor) + :multi-line-p (multi-line-p anchor) + :no-newline-p (no-newline-p anchor))) + +(defmethod copy-regex ((everything everything)) + (declare #.*standard-optimize-settings*) + (make-instance 'everything + :single-line-p (single-line-p everything))) + +(defmethod copy-regex ((word-boundary word-boundary)) + (declare #.*standard-optimize-settings*) + (make-instance 'word-boundary + :negatedp (negatedp word-boundary))) + +(defmethod copy-regex ((void void)) + (declare #.*standard-optimize-settings*) + (make-instance 'void)) + +(defmethod copy-regex ((lookahead lookahead)) + (declare #.*standard-optimize-settings*) + (make-instance 'lookahead + :regex (copy-regex (regex lookahead)) + :positivep (positivep lookahead))) + +(defmethod copy-regex ((seq seq)) + (declare #.*standard-optimize-settings*) + (make-instance 'seq + :elements (mapcar #'copy-regex (elements seq)))) + +(defmethod copy-regex ((alternation alternation)) + (declare #.*standard-optimize-settings*) + (make-instance 'alternation + :choices (mapcar #'copy-regex (choices alternation)))) + +(defmethod copy-regex ((branch branch)) + (declare #.*standard-optimize-settings*) + (with-slots (test) + branch + (make-instance 'branch + :test (if (typep test 'regex) + (copy-regex test) + test) + :then-regex (copy-regex (then-regex branch)) + :else-regex (copy-regex (else-regex branch))))) + +(defmethod copy-regex ((lookbehind lookbehind)) + (declare #.*standard-optimize-settings*) + (make-instance 'lookbehind + :regex (copy-regex (regex lookbehind)) + :positivep (positivep lookbehind) + :len (len lookbehind))) + +(defmethod copy-regex ((repetition repetition)) + (declare #.*standard-optimize-settings*) + (make-instance 'repetition + :regex (copy-regex (regex repetition)) + :greedyp (greedyp repetition) + :minimum (minimum repetition) + :maximum (maximum repetition) + :min-len (min-len repetition) + :len (len repetition) + :contains-register-p (contains-register-p repetition))) + +(defmethod copy-regex ((register register)) + (declare #.*standard-optimize-settings*) + (make-instance 'register + :regex (copy-regex (regex register)) + :num (num register) + :name (name register))) + +(defmethod copy-regex ((standalone standalone)) + (declare #.*standard-optimize-settings*) + (make-instance 'standalone + :regex (copy-regex (regex standalone)))) + +(defmethod copy-regex ((back-reference back-reference)) + (declare #.*standard-optimize-settings*) + (make-instance 'back-reference + :num (num back-reference) + :case-insensitive-p (case-insensitive-p back-reference))) + +(defmethod copy-regex ((char-class char-class)) + (declare #.*standard-optimize-settings*) + (make-instance 'char-class + :test-function (test-function char-class))) + +(defmethod copy-regex ((str str)) + (declare #.*standard-optimize-settings*) + (make-instance 'str + :str (str str) + :case-insensitive-p (case-insensitive-p str))) + +(defmethod copy-regex ((filter filter)) + (declare #.*standard-optimize-settings*) + (make-instance 'filter + :fn (fn filter) + :len (len filter))) + +;;; Note that COPY-REGEX and REMOVE-REGISTERS could have easily been +;;; wrapped into one function. Maybe in the next release... + +;;; Further note that this function is used by CONVERT to factor out +;;; complicated repetitions, i.e. cases like +;;; (a)* -> (?:a*(a))? +;;; This won't work for, say, +;;; ((a)|(b))* -> (?:(?:a|b)*((a)|(b)))? +;;; and therefore we stop REGISTER removal once we see an ALTERNATION. + +(defgeneric remove-registers (regex) + (declare #.*standard-optimize-settings*) + (:documentation "Returns a deep copy of a REGEX (see COPY-REGEX) and +optionally removes embedded REGISTER objects if possible and if the +special variable REMOVE-REGISTERS-P is true.")) + +(defmethod remove-registers ((register register)) + (declare #.*standard-optimize-settings*) + (declare (special remove-registers-p reg-seen)) + (cond (remove-registers-p + (remove-registers (regex register))) + (t + ;; mark REG-SEEN as true so enclosing REPETITION objects + ;; (see method below) know if they contain a register or not + (setq reg-seen t) + (copy-regex register)))) + +(defmethod remove-registers ((repetition repetition)) + (declare #.*standard-optimize-settings*) + (let* (reg-seen + (inner-regex (remove-registers (regex repetition)))) + ;; REMOVE-REGISTERS will set REG-SEEN (see method above) if + ;; (REGEX REPETITION) contains a REGISTER + (declare (special reg-seen)) + (make-instance 'repetition + :regex inner-regex + :greedyp (greedyp repetition) + :minimum (minimum repetition) + :maximum (maximum repetition) + :min-len (min-len repetition) + :len (len repetition) + :contains-register-p reg-seen))) + +(defmethod remove-registers ((standalone standalone)) + (declare #.*standard-optimize-settings*) + (make-instance 'standalone + :regex (remove-registers (regex standalone)))) + +(defmethod remove-registers ((lookahead lookahead)) + (declare #.*standard-optimize-settings*) + (make-instance 'lookahead + :regex (remove-registers (regex lookahead)) + :positivep (positivep lookahead))) + +(defmethod remove-registers ((lookbehind lookbehind)) + (declare #.*standard-optimize-settings*) + (make-instance 'lookbehind + :regex (remove-registers (regex lookbehind)) + :positivep (positivep lookbehind) + :len (len lookbehind))) + +(defmethod remove-registers ((branch branch)) + (declare #.*standard-optimize-settings*) + (with-slots (test) + branch + (make-instance 'branch + :test (if (typep test 'regex) + (remove-registers test) + test) + :then-regex (remove-registers (then-regex branch)) + :else-regex (remove-registers (else-regex branch))))) + +(defmethod remove-registers ((alternation alternation)) + (declare #.*standard-optimize-settings*) + (declare (special remove-registers-p)) + ;; an ALTERNATION, so we can't remove REGISTER objects further down + (setq remove-registers-p nil) + (copy-regex alternation)) + +(defmethod remove-registers ((regex regex)) + (declare #.*standard-optimize-settings*) + (copy-regex regex)) + +(defmethod remove-registers ((seq seq)) + (declare #.*standard-optimize-settings*) + (make-instance 'seq + :elements (mapcar #'remove-registers (elements seq)))) + +(defgeneric everythingp (regex) + (declare #.*standard-optimize-settings*) + (:documentation "Returns an EVERYTHING object if REGEX is equivalent +to this object, otherwise NIL. So, \"(.){1}\" would return true +\(i.e. the object corresponding to \".\", for example.")) + +(defmethod everythingp ((seq seq)) + (declare #.*standard-optimize-settings*) + ;; we might have degenerate cases like (:SEQUENCE :VOID ...) + ;; due to the parsing process + (let ((cleaned-elements (remove-if #'(lambda (element) + (typep element 'void)) + (elements seq)))) + (and (= 1 (length cleaned-elements)) + (everythingp (first cleaned-elements))))) + +(defmethod everythingp ((alternation alternation)) + (declare #.*standard-optimize-settings*) + (with-slots (choices) + alternation + (and (= 1 (length choices)) + ;; this is unlikely to happen for human-generated regexes, + ;; but machine-generated ones might look like this + (everythingp (first choices))))) + +(defmethod everythingp ((repetition repetition)) + (declare #.*standard-optimize-settings*) + (with-slots (maximum minimum regex) + repetition + (and maximum + (= 1 minimum maximum) + ;; treat "{1,1}" like "" + (everythingp regex)))) + +(defmethod everythingp ((register register)) + (declare #.*standard-optimize-settings*) + (everythingp (regex register))) + +(defmethod everythingp ((standalone standalone)) + (declare #.*standard-optimize-settings*) + (everythingp (regex standalone))) + +(defmethod everythingp ((everything everything)) + (declare #.*standard-optimize-settings*) + everything) + +(defmethod everythingp ((regex regex)) + (declare #.*standard-optimize-settings*) + ;; the general case for ANCHOR, BACK-REFERENCE, BRANCH, CHAR-CLASS, + ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY + nil) + +(defgeneric regex-length (regex) + (declare #.*standard-optimize-settings*) + (:documentation "Return the length of REGEX if it is fixed, NIL otherwise.")) + +(defmethod regex-length ((seq seq)) + (declare #.*standard-optimize-settings*) + ;; simply add all inner lengths unless one of them is NIL + (loop for sub-regex in (elements seq) + for len = (regex-length sub-regex) + if (not len) do (return nil) + sum len)) + +(defmethod regex-length ((alternation alternation)) + (declare #.*standard-optimize-settings*) + ;; only return a true value if all inner lengths are non-NIL and + ;; mutually equal + (loop for sub-regex in (choices alternation) + for old-len = nil then len + for len = (regex-length sub-regex) + if (or (not len) + (and old-len (/= len old-len))) do (return nil) + finally (return len))) + +(defmethod regex-length ((branch branch)) + (declare #.*standard-optimize-settings*) + ;; only return a true value if both alternations have a length and + ;; if they're equal + (let ((then-length (regex-length (then-regex branch)))) + (and then-length + (eql then-length (regex-length (else-regex branch))) + then-length))) + +(defmethod regex-length ((repetition repetition)) + (declare #.*standard-optimize-settings*) + ;; we can only compute the length of a REPETITION object if the + ;; number of repetitions is fixed; note that we don't call + ;; REGEX-LENGTH for the inner regex, we assume that the LEN slot is + ;; always set correctly + (with-slots (len minimum maximum) + repetition + (if (and len + (eql minimum maximum)) + (* minimum len) + nil))) + +(defmethod regex-length ((register register)) + (declare #.*standard-optimize-settings*) + (regex-length (regex register))) + +(defmethod regex-length ((standalone standalone)) + (declare #.*standard-optimize-settings*) + (regex-length (regex standalone))) + +(defmethod regex-length ((back-reference back-reference)) + (declare #.*standard-optimize-settings*) + ;; with enough effort we could possibly do better here, but + ;; currently we just give up and return NIL + nil) + +(defmethod regex-length ((char-class char-class)) + (declare #.*standard-optimize-settings*) + 1) + +(defmethod regex-length ((everything everything)) + (declare #.*standard-optimize-settings*) + 1) + +(defmethod regex-length ((str str)) + (declare #.*standard-optimize-settings*) + (len str)) + +(defmethod regex-length ((filter filter)) + (declare #.*standard-optimize-settings*) + (len filter)) + +(defmethod regex-length ((regex regex)) + (declare #.*standard-optimize-settings*) + ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and + ;; WORD-BOUNDARY (which all have zero-length) + 0) + +(defgeneric regex-min-length (regex) + (declare #.*standard-optimize-settings*) + (:documentation "Returns the minimal length of REGEX.")) + +(defmethod regex-min-length ((seq seq)) + (declare #.*standard-optimize-settings*) + ;; simply add all inner minimal lengths + (loop for sub-regex in (elements seq) + for len = (regex-min-length sub-regex) + sum len)) + +(defmethod regex-min-length ((alternation alternation)) + (declare #.*standard-optimize-settings*) + ;; minimal length of an alternation is the minimal length of the + ;; "shortest" element + (loop for sub-regex in (choices alternation) + for len = (regex-min-length sub-regex) + minimize len)) + +(defmethod regex-min-length ((branch branch)) + (declare #.*standard-optimize-settings*) + ;; minimal length of both alternations + (min (regex-min-length (then-regex branch)) + (regex-min-length (else-regex branch)))) + +(defmethod regex-min-length ((repetition repetition)) + (declare #.*standard-optimize-settings*) + ;; obviously the product of the inner minimal length and the minimal + ;; number of repetitions + (* (minimum repetition) (min-len repetition))) + +(defmethod regex-min-length ((register register)) + (declare #.*standard-optimize-settings*) + (regex-min-length (regex register))) + +(defmethod regex-min-length ((standalone standalone)) + (declare #.*standard-optimize-settings*) + (regex-min-length (regex standalone))) + +(defmethod regex-min-length ((char-class char-class)) + (declare #.*standard-optimize-settings*) + 1) + +(defmethod regex-min-length ((everything everything)) + (declare #.*standard-optimize-settings*) + 1) + +(defmethod regex-min-length ((str str)) + (declare #.*standard-optimize-settings*) + (len str)) + +(defmethod regex-min-length ((filter filter)) + (declare #.*standard-optimize-settings*) + (or (len filter) + 0)) + +(defmethod regex-min-length ((regex regex)) + (declare #.*standard-optimize-settings*) + ;; the general case for ANCHOR, BACK-REFERENCE, LOOKAHEAD, + ;; LOOKBEHIND, VOID, and WORD-BOUNDARY + 0) + +(defgeneric compute-offsets (regex start-pos) + (declare #.*standard-optimize-settings*) + (:documentation "Returns the offset the following regex would have +relative to START-POS or NIL if we can't compute it. Sets the OFFSET +slot of REGEX to START-POS if REGEX is a STR. May also affect OFFSET +slots of STR objects further down the tree.")) + +;; note that we're actually only interested in the offset of +;; "top-level" STR objects (see ADVANCE-FN in the SCAN function) so we +;; can stop at variable-length alternations and don't need to descend +;; into repetitions + +(defmethod compute-offsets ((seq seq) start-pos) + (declare #.*standard-optimize-settings*) + (loop for element in (elements seq) + ;; advance offset argument for next call while looping through + ;; the elements + for pos = start-pos then curr-offset + for curr-offset = (compute-offsets element pos) + while curr-offset + finally (return curr-offset))) + +(defmethod compute-offsets ((alternation alternation) start-pos) + (declare #.*standard-optimize-settings*) + (loop for choice in (choices alternation) + for old-offset = nil then curr-offset + for curr-offset = (compute-offsets choice start-pos) + ;; we stop immediately if two alternations don't result in the + ;; same offset + if (or (not curr-offset) + (and old-offset (/= curr-offset old-offset))) + do (return nil) + finally (return curr-offset))) + +(defmethod compute-offsets ((branch branch) start-pos) + (declare #.*standard-optimize-settings*) + ;; only return offset if both alternations have equal value + (let ((then-offset (compute-offsets (then-regex branch) start-pos))) + (and then-offset + (eql then-offset (compute-offsets (else-regex branch) start-pos)) + then-offset))) + +(defmethod compute-offsets ((repetition repetition) start-pos) + (declare #.*standard-optimize-settings*) + ;; no need to descend into the inner regex + (with-slots (len minimum maximum) + repetition + (if (and len + (eq minimum maximum)) + ;; fixed number of repetitions, so we know how to proceed + (+ start-pos (* minimum len)) + ;; otherwise return NIL + nil))) + +(defmethod compute-offsets ((register register) start-pos) + (declare #.*standard-optimize-settings*) + (compute-offsets (regex register) start-pos)) + +(defmethod compute-offsets ((standalone standalone) start-pos) + (declare #.*standard-optimize-settings*) + (compute-offsets (regex standalone) start-pos)) + +(defmethod compute-offsets ((char-class char-class) start-pos) + (declare #.*standard-optimize-settings*) + (1+ start-pos)) + +(defmethod compute-offsets ((everything everything) start-pos) + (declare #.*standard-optimize-settings*) + (1+ start-pos)) + +(defmethod compute-offsets ((str str) start-pos) + (declare #.*standard-optimize-settings*) + (setf (offset str) start-pos) + (+ start-pos (len str))) + +(defmethod compute-offsets ((back-reference back-reference) start-pos) + (declare #.*standard-optimize-settings*) + ;; with enough effort we could possibly do better here, but + ;; currently we just give up and return NIL + (declare (ignore start-pos)) + nil) + +(defmethod compute-offsets ((filter filter) start-pos) + (declare #.*standard-optimize-settings*) + (let ((len (len filter))) + (if len + (+ start-pos len) + nil))) + +(defmethod compute-offsets ((regex regex) start-pos) + (declare #.*standard-optimize-settings*) + ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and + ;; WORD-BOUNDARY (which all have zero-length) + start-pos) diff --git a/regex-class.lisp b/regex-class.lisp index 848cd34..776fb94 100644 --- a/regex-class.lisp +++ b/regex-class.lisp @@ -1,9 +1,8 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class.lisp,v 1.34 2008/07/03 07:44:06 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class.lisp,v 1.42 2008/07/22 22:38:05 edi Exp $ -;;; This file defines the REGEX class and some utility methods for -;;; this class. REGEX objects are used to represent the (transformed) -;;; parse trees internally +;;; This file defines the REGEX class. REGEX objects are used to +;;; represent the (transformed) parse trees internally ;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. @@ -31,244 +30,218 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) -;; Genera need the eval-when, here, or the types created by the class -;; definitions aren't seen by the typep calls later in the file. -(eval-when (:compile-toplevel :load-toplevel :execute) - (locally - (declare #.*standard-optimize-settings*) - (defclass regex () - () - (:documentation "The REGEX base class. All other classes inherit +(defclass regex () + () + (:documentation "The REGEX base class. All other classes inherit from this one.")) +(defclass seq (regex) + ((elements :initarg :elements + :accessor elements + :type cons + :documentation "A list of REGEX objects.")) + (:documentation "SEQ objects represents sequences of regexes. +\(Like \"ab\" is the sequence of \"a\" and \"b\".)")) - (defclass seq (regex) - ((elements :initarg :elements - :accessor elements - :type cons - :documentation "A list of REGEX objects.")) - (:documentation "SEQ objects represents sequences of -regexes. (Like \"ab\" is the sequence of \"a\" and \"b\".)")) +(defclass alternation (regex) + ((choices :initarg :choices + :accessor choices + :type cons + :documentation "A list of REGEX objects")) + (:documentation "ALTERNATION objects represent alternations of +regexes. \(Like \"a|b\" ist the alternation of \"a\" or \"b\".)")) - (defclass alternation (regex) - ((choices :initarg :choices - :accessor choices - :type cons - :documentation "A list of REGEX objects")) - (:documentation "ALTERNATION objects represent alternations of -regexes. (Like \"a|b\" ist the alternation of \"a\" or \"b\".)")) +(defclass lookahead (regex) + ((regex :initarg :regex + :accessor regex + :documentation "The REGEX object we're checking.") + (positivep :initarg :positivep + :reader positivep + :documentation "Whether this assertion is positive.")) + (:documentation "LOOKAHEAD objects represent look-ahead assertions.")) - (defclass lookahead (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The REGEX object we're checking.") - (positivep :initarg :positivep - :reader positivep - :documentation "Whether this assertion is positive.")) - (:documentation "LOOKAHEAD objects represent look-ahead assertions.")) +(defclass lookbehind (regex) + ((regex :initarg :regex + :accessor regex + :documentation "The REGEX object we're checking.") + (positivep :initarg :positivep + :reader positivep + :documentation "Whether this assertion is positive.") + (len :initarg :len + :accessor len + :type fixnum + :documentation "The \(fixed) length of the enclosed regex.")) + (:documentation "LOOKBEHIND objects represent look-behind assertions.")) - (defclass lookbehind (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The REGEX object we're checking.") - (positivep :initarg :positivep - :reader positivep - :documentation "Whether this assertion is positive.") - (len :initarg :len - :accessor len - :type fixnum - :documentation "The (fixed) length of the enclosed regex.")) - (:documentation "LOOKBEHIND objects represent look-behind assertions.")) - - (defclass repetition (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The REGEX that's repeated.") - (greedyp :initarg :greedyp - :reader greedyp - :documentation "Whether the repetition is greedy.") - (minimum :initarg :minimum - :accessor minimum - :type fixnum - :documentation "The minimal number of repetitions.") - (maximum :initarg :maximum - :accessor maximum - :documentation "The maximal number of repetitions. +(defclass repetition (regex) + ((regex :initarg :regex + :accessor regex + :documentation "The REGEX that's repeated.") + (greedyp :initarg :greedyp + :reader greedyp + :documentation "Whether the repetition is greedy.") + (minimum :initarg :minimum + :accessor minimum + :type fixnum + :documentation "The minimal number of repetitions.") + (maximum :initarg :maximum + :accessor maximum + :documentation "The maximal number of repetitions. Can be NIL for unbounded.") - (min-len :initarg :min-len - :reader min-len - :documentation "The minimal length of the enclosed regex.") - (len :initarg :len - :reader len - :documentation "The length of the enclosed regex. NIL -if unknown.") - (min-rest :initform 0 - :accessor min-rest - :type fixnum - :documentation "The minimal number of characters which must -appear after this repetition.") - (contains-register-p :initarg :contains-register-p - :reader contains-register-p - :documentation "If the regex contains a register.")) - (:documentation "REPETITION objects represent repetitions of regexes.")) + (min-len :initarg :min-len + :reader min-len + :documentation "The minimal length of the enclosed regex.") + (len :initarg :len + :reader len + :documentation "The length of the enclosed regex. NIL if +unknown.") + (min-rest :initform 0 + :accessor min-rest + :type fixnum + :documentation "The minimal number of characters which +must appear after this repetition.") + (contains-register-p :initarg :contains-register-p + :reader contains-register-p + :documentation "Whether the regex contains a +register.")) + (:documentation "REPETITION objects represent repetitions of regexes.")) - (defclass register (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The inner regex.") - (num :initarg :num - :reader num - :type fixnum - :documentation "The number of this register, starting from 0. +(defclass register (regex) + ((regex :initarg :regex + :accessor regex + :documentation "The inner regex.") + (num :initarg :num + :reader num + :type fixnum + :documentation "The number of this register, starting from 0. This is the index into *REGS-START* and *REGS-END*.") - (name :initarg :name - :reader name - :documentation "Name of this register or NIL.")) - (:documentation "REGISTER objects represent register groups.")) + (name :initarg :name + :reader name + :documentation "Name of this register or NIL.")) + (:documentation "REGISTER objects represent register groups.")) - (defclass standalone (regex) - ((regex :initarg :regex - :accessor regex - :documentation "The inner regex.")) - (:documentation "A standalone regular expression.")) +(defclass standalone (regex) + ((regex :initarg :regex + :accessor regex + :documentation "The inner regex.")) + (:documentation "A standalone regular expression.")) - (defclass back-reference (regex) - ((num :initarg :num - :accessor num - :type fixnum - :documentation "The number of the register this +(defclass back-reference (regex) + ((num :initarg :num + :accessor num + :type fixnum + :documentation "The number of the register this reference refers to.") - (name :initarg :name - :accessor name - :documentation "The name of the register this + (name :initarg :name + :accessor name + :documentation "The name of the register this reference refers to or NIL.") - (case-insensitive-p :initarg :case-insensitive-p - :reader case-insensitive-p - :documentation "Whether we check + (case-insensitive-p :initarg :case-insensitive-p + :reader case-insensitive-p + :documentation "Whether we check case-insensitively.")) - (:documentation "BACK-REFERENCE objects represent backreferences.")) - (defclass char-class (regex) - ((charset :initarg :charset - :reader charset - :type (or charset null) - :documentation "A charset denoting the characters -in the character class.") - (case-insensitive-p :initarg :case-insensitive-p - :reader case-insensitive-p - :documentation "If the char class -case-insensitive.") - (invertedp :initarg :invertedp - :reader invertedp - :documentation "Whether we mean the inverse of -the char class.") - (word-char-class-p :initarg :word-char-class-p - :reader word-char-class-p - :documentation "Whether this CHAR CLASS -represents the special class WORD-CHAR-CLASS.")) - (:documentation "CHAR-CLASS objects represent character classes.")) + (:documentation "BACK-REFERENCE objects represent backreferences.")) - (defclass str (regex) - ((str :initarg :str - :accessor str - :type string - :documentation "The actual string.") - (len :initform 0 - :accessor len - :type fixnum - :documentation "The length of the string.") - (case-insensitive-p :initarg :case-insensitive-p - :reader case-insensitive-p - :documentation "If we match case-insensitively.") - (offset :initform nil - :accessor offset - :documentation "Offset from the left of the whole +(defclass char-class (regex) + ((test-function :initarg :test-function + :reader test-function + :type (or function symbol nil) + :documentation "A unary function \(accepting a +character) which stands in for the character class and does the work +of checking whether a character belongs to the class.")) + (:documentation "CHAR-CLASS objects represent character classes.")) + +(defclass str (regex) + ((str :initarg :str + :accessor str + :type string + :documentation "The actual string.") + (len :initform 0 + :accessor len + :type fixnum + :documentation "The length of the string.") + (case-insensitive-p :initarg :case-insensitive-p + :reader case-insensitive-p + :documentation "If we match case-insensitively.") + (offset :initform nil + :accessor offset + :documentation "Offset from the left of the whole parse tree. The first regex has offset 0. NIL if unknown, i.e. behind a variable-length regex.") - (skip :initform nil - :initarg :skip - :accessor skip - :documentation "If we can avoid testing for this + (skip :initform nil + :initarg :skip + :accessor skip + :documentation "If we can avoid testing for this string because the SCAN function has done this already.") - (start-of-end-string-p :initform nil - :accessor start-of-end-string-p - :documentation "If this is the unique + (start-of-end-string-p :initform nil + :accessor start-of-end-string-p + :documentation "If this is the unique STR which starts END-STRING (a slot of MATCHER).")) - (:documentation "STR objects represent string.")) + (:documentation "STR objects represent string.")) - (defclass anchor (regex) - ((startp :initarg :startp - :reader startp - :documentation "Whether this is a \"start anchor\".") - (multi-line-p :initarg :multi-line-p - :reader multi-line-p - :documentation "Whether we're in multi-line mode, +(defclass anchor (regex) + ((startp :initarg :startp + :reader startp + :documentation "Whether this is a \"start anchor\".") + (multi-line-p :initarg :multi-line-p + :initform nil + :reader multi-line-p + :documentation "Whether we're in multi-line mode, i.e. whether each #\\Newline is surrounded by anchors.") - (no-newline-p :initarg :no-newline-p - :reader no-newline-p - :documentation "Whether we ignore #\\Newline at the end.")) - (:documentation "ANCHOR objects represent anchors like \"^\" or \"$\".")) + (no-newline-p :initarg :no-newline-p + :initform nil + :reader no-newline-p + :documentation "Whether we ignore #\\Newline at the end.")) + (:documentation "ANCHOR objects represent anchors like \"^\" or \"$\".")) - (defclass everything (regex) - ((single-line-p :initarg :single-line-p - :reader single-line-p - :documentation "Whether we're in single-line mode, +(defclass everything (regex) + ((single-line-p :initarg :single-line-p + :reader single-line-p + :documentation "Whether we're in single-line mode, i.e. whether we also match #\\Newline.")) - (:documentation "EVERYTHING objects represent regexes matching + (:documentation "EVERYTHING objects represent regexes matching \"everything\", i.e. dots.")) - (defclass word-boundary (regex) - ((negatedp :initarg :negatedp - :reader negatedp - :documentation "Whether we mean the opposite, +(defclass word-boundary (regex) + ((negatedp :initarg :negatedp + :reader negatedp + :documentation "Whether we mean the opposite, i.e. no word-boundary.")) - (:documentation "WORD-BOUNDARY objects represent word-boundary assertions.")) + (:documentation "WORD-BOUNDARY objects represent word-boundary assertions.")) - (defclass branch (regex) - ((test :initarg :test - :accessor test - :documentation "The test of this branch, one of +(defclass branch (regex) + ((test :initarg :test + :accessor test + :documentation "The test of this branch, one of LOOKAHEAD, LOOKBEHIND, or a number.") - (then-regex :initarg :then-regex - :accessor then-regex - :documentation "The regex that's to be matched if the + (then-regex :initarg :then-regex + :accessor then-regex + :documentation "The regex that's to be matched if the test succeeds.") - (else-regex :initarg :else-regex - :initform (make-instance 'void) - :accessor else-regex - :documentation "The regex that's to be matched if the + (else-regex :initarg :else-regex + :initform (make-instance 'void) + :accessor else-regex + :documentation "The regex that's to be matched if the test fails.")) - (:documentation "BRANCH objects represent Perl's conditional regular + (:documentation "BRANCH objects represent Perl's conditional regular expressions.")) - (defclass filter (regex) - ((fn :initarg :fn - :accessor fn - :type (or function symbol) - :documentation "The user-defined function.") - (len :initarg :len - :reader len - :documentation "The fixed length of this filter or NIL.")) - (:documentation "FILTER objects represent arbitrary functions +(defclass filter (regex) + ((fn :initarg :fn + :accessor fn + :type (or function symbol) + :documentation "The user-defined function.") + (len :initarg :len + :reader len + :documentation "The fixed length of this filter or NIL.")) + (:documentation "FILTER objects represent arbitrary functions defined by the user.")) - (defclass void (regex) - () - (:documentation "VOID objects represent empty regular expressions.")))) - -(defmethod initialize-instance :after ((char-class char-class) &rest init-args) - (declare #.*standard-optimize-settings*) - "Make large charsets smaller, if possible." - (let ((set (getf init-args :charset))) - (when (and set - (> *regex-char-code-limit* 256) - (> (charset-count set) - (/ *regex-char-code-limit* 2))) - (setf (slot-value char-class 'set) - (merge-set (make-charset) set) - (slot-value char-class 'invertedp) - (not (slot-value char-class 'invertedp)))))) +(defclass void (regex) + () + (:documentation "VOID objects represent empty regular expressions.")) (defmethod initialize-instance :after ((str str) &rest init-args) (declare #.*standard-optimize-settings*) @@ -279,528 +252,3 @@ defined by the user.")) (setf (slot-value str 'str) (coerce str-slot 'simple-string)))) (setf (len str) (length (str str)))) -;;; The following four methods allow a VOID object to behave like a -;;; zero-length STR object (only readers needed) - -(defmethod len ((void void)) - (declare #.*standard-optimize-settings*) - 0) - -(defmethod str ((void void)) - (declare #.*standard-optimize-settings*) - "") - -(defmethod skip ((void void)) - (declare #.*standard-optimize-settings*) - nil) - -(defmethod start-of-end-string-p ((void void)) - (declare #.*standard-optimize-settings*) - nil) - -(defgeneric case-mode (regex old-case-mode) - (declare #.*standard-optimize-settings*) - (:documentation "Utility function used by the optimizer (see GATHER-STRINGS). -Returns a keyword denoting the case-(in)sensitivity of a STR or its -second argument if the STR has length 0. Returns NIL for REGEX objects -which are not of type STR.")) - -(defmethod case-mode ((str str) old-case-mode) - (declare #.*standard-optimize-settings*) - (cond ((zerop (len str)) - old-case-mode) - ((case-insensitive-p str) - :case-insensitive) - (t - :case-sensitive))) - -(defmethod case-mode ((regex regex) old-case-mode) - (declare #.*standard-optimize-settings*) - (declare (ignore old-case-mode)) - nil) - -(defgeneric copy-regex (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Implements a deep copy of a REGEX object.")) - -(defmethod copy-regex ((anchor anchor)) - (declare #.*standard-optimize-settings*) - (make-instance 'anchor - :startp (startp anchor) - :multi-line-p (multi-line-p anchor) - :no-newline-p (no-newline-p anchor))) - -(defmethod copy-regex ((everything everything)) - (declare #.*standard-optimize-settings*) - (make-instance 'everything - :single-line-p (single-line-p everything))) - -(defmethod copy-regex ((word-boundary word-boundary)) - (declare #.*standard-optimize-settings*) - (make-instance 'word-boundary - :negatedp (negatedp word-boundary))) - -(defmethod copy-regex ((void void)) - (declare #.*standard-optimize-settings*) - (make-instance 'void)) - -(defmethod copy-regex ((lookahead lookahead)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookahead - :regex (copy-regex (regex lookahead)) - :positivep (positivep lookahead))) - -(defmethod copy-regex ((seq seq)) - (declare #.*standard-optimize-settings*) - (make-instance 'seq - :elements (mapcar #'copy-regex (elements seq)))) - -(defmethod copy-regex ((alternation alternation)) - (declare #.*standard-optimize-settings*) - (make-instance 'alternation - :choices (mapcar #'copy-regex (choices alternation)))) - -(defmethod copy-regex ((branch branch)) - (declare #.*standard-optimize-settings*) - (with-slots (test) - branch - (make-instance 'branch - :test (if (typep test 'regex) - (copy-regex test) - test) - :then-regex (copy-regex (then-regex branch)) - :else-regex (copy-regex (else-regex branch))))) - -(defmethod copy-regex ((lookbehind lookbehind)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookbehind - :regex (copy-regex (regex lookbehind)) - :positivep (positivep lookbehind) - :len (len lookbehind))) - -(defmethod copy-regex ((repetition repetition)) - (declare #.*standard-optimize-settings*) - (make-instance 'repetition - :regex (copy-regex (regex repetition)) - :greedyp (greedyp repetition) - :minimum (minimum repetition) - :maximum (maximum repetition) - :min-len (min-len repetition) - :len (len repetition) - :contains-register-p (contains-register-p repetition))) - -(defmethod copy-regex ((register register)) - (declare #.*standard-optimize-settings*) - (make-instance 'register - :regex (copy-regex (regex register)) - :num (num register) - :name (name register))) - -(defmethod copy-regex ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (make-instance 'standalone - :regex (copy-regex (regex standalone)))) - -(defmethod copy-regex ((back-reference back-reference)) - (declare #.*standard-optimize-settings*) - (make-instance 'back-reference - :num (num back-reference) - :case-insensitive-p (case-insensitive-p back-reference))) - -(defmethod copy-regex ((char-class char-class)) - (declare #.*standard-optimize-settings*) - (make-instance 'char-class - :charset (charset char-class) - :case-insensitive-p (case-insensitive-p char-class) - :invertedp (invertedp char-class) - :word-char-class-p (word-char-class-p char-class))) - -(defmethod copy-regex ((str str)) - (declare #.*standard-optimize-settings*) - (make-instance 'str - :str (str str) - :case-insensitive-p (case-insensitive-p str))) - -(defmethod copy-regex ((filter filter)) - (declare #.*standard-optimize-settings*) - (make-instance 'filter - :fn (fn filter) - :len (len filter))) - -;;; Note that COPY-REGEX and REMOVE-REGISTERS could have easily been -;;; wrapped into one function. Maybe in the next release... - -;;; Further note that this function is used by CONVERT to factor out -;;; complicated repetitions, i.e. cases like -;;; (a)* -> (?:a*(a))? -;;; This won't work for, say, -;;; ((a)|(b))* -> (?:(?:a|b)*((a)|(b)))? -;;; and therefore we stop REGISTER removal once we see an ALTERNATION. - -(defgeneric remove-registers (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Returns a deep copy of a REGEX (see COPY-REGEX) and -optionally removes embedded REGISTER objects if possible and if the -special variable REMOVE-REGISTERS-P is true.")) - -(defmethod remove-registers ((register register)) - (declare #.*standard-optimize-settings*) - (declare (special remove-registers-p reg-seen)) - (cond (remove-registers-p - (remove-registers (regex register))) - (t - ;; mark REG-SEEN as true so enclosing REPETITION objects - ;; (see method below) know if they contain a register or not - (setq reg-seen t) - (copy-regex register)))) - -(defmethod remove-registers ((repetition repetition)) - (declare #.*standard-optimize-settings*) - (let* (reg-seen - (inner-regex (remove-registers (regex repetition)))) - ;; REMOVE-REGISTERS will set REG-SEEN (see method above) if - ;; (REGEX REPETITION) contains a REGISTER - (declare (special reg-seen)) - (make-instance 'repetition - :regex inner-regex - :greedyp (greedyp repetition) - :minimum (minimum repetition) - :maximum (maximum repetition) - :min-len (min-len repetition) - :len (len repetition) - :contains-register-p reg-seen))) - -(defmethod remove-registers ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (make-instance 'standalone - :regex (remove-registers (regex standalone)))) - -(defmethod remove-registers ((lookahead lookahead)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookahead - :regex (remove-registers (regex lookahead)) - :positivep (positivep lookahead))) - -(defmethod remove-registers ((lookbehind lookbehind)) - (declare #.*standard-optimize-settings*) - (make-instance 'lookbehind - :regex (remove-registers (regex lookbehind)) - :positivep (positivep lookbehind) - :len (len lookbehind))) - -(defmethod remove-registers ((branch branch)) - (declare #.*standard-optimize-settings*) - (with-slots (test) - branch - (make-instance 'branch - :test (if (typep test 'regex) - (remove-registers test) - test) - :then-regex (remove-registers (then-regex branch)) - :else-regex (remove-registers (else-regex branch))))) - -(defmethod remove-registers ((alternation alternation)) - (declare #.*standard-optimize-settings*) - (declare (special remove-registers-p)) - ;; an ALTERNATION, so we can't remove REGISTER objects further down - (setq remove-registers-p nil) - (copy-regex alternation)) - -(defmethod remove-registers ((regex regex)) - (declare #.*standard-optimize-settings*) - (copy-regex regex)) - -(defmethod remove-registers ((seq seq)) - (declare #.*standard-optimize-settings*) - (make-instance 'seq - :elements (mapcar #'remove-registers (elements seq)))) - -(defgeneric everythingp (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Returns an EVERYTHING object if REGEX is equivalent -to this object, otherwise NIL. So, \"(.){1}\" would return true -(i.e. the object corresponding to \".\", for example.")) - -(defmethod everythingp ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; we might have degenerate cases like (:SEQUENCE :VOID ...) - ;; due to the parsing process - (let ((cleaned-elements (remove-if #'(lambda (element) - (typep element 'void)) - (elements seq)))) - (and (= 1 (length cleaned-elements)) - (everythingp (first cleaned-elements))))) - -(defmethod everythingp ((alternation alternation)) - (declare #.*standard-optimize-settings*) - (with-slots (choices) - alternation - (and (= 1 (length choices)) - ;; this is unlikely to happen for human-generated regexes, - ;; but machine-generated ones might look like this - (everythingp (first choices))))) - -(defmethod everythingp ((repetition repetition)) - (declare #.*standard-optimize-settings*) - (with-slots (maximum minimum regex) - repetition - (and maximum - (= 1 minimum maximum) - ;; treat "{1,1}" like "" - (everythingp regex)))) - -(defmethod everythingp ((register register)) - (declare #.*standard-optimize-settings*) - (everythingp (regex register))) - -(defmethod everythingp ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (everythingp (regex standalone))) - -(defmethod everythingp ((everything everything)) - (declare #.*standard-optimize-settings*) - everything) - -(defmethod everythingp ((regex regex)) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, BACK-REFERENCE, BRANCH, CHAR-CLASS, - ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY - nil) - -(defgeneric regex-length (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Return the length of REGEX if it is fixed, NIL otherwise.")) - -(defmethod regex-length ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; simply add all inner lengths unless one of them is NIL - (loop for sub-regex in (elements seq) - for len = (regex-length sub-regex) - if (not len) do (return nil) - sum len)) - -(defmethod regex-length ((alternation alternation)) - (declare #.*standard-optimize-settings*) - ;; only return a true value if all inner lengths are non-NIL and - ;; mutually equal - (loop for sub-regex in (choices alternation) - for old-len = nil then len - for len = (regex-length sub-regex) - if (or (not len) - (and old-len (/= len old-len))) do (return nil) - finally (return len))) - -(defmethod regex-length ((branch branch)) - (declare #.*standard-optimize-settings*) - ;; only return a true value if both alternations have a length and - ;; if they're equal - (let ((then-length (regex-length (then-regex branch)))) - (and then-length - (eql then-length (regex-length (else-regex branch))) - then-length))) - -(defmethod regex-length ((repetition repetition)) - (declare #.*standard-optimize-settings*) - ;; we can only compute the length of a REPETITION object if the - ;; number of repetitions is fixed; note that we don't call - ;; REGEX-LENGTH for the inner regex, we assume that the LEN slot is - ;; always set correctly - (with-slots (len minimum maximum) - repetition - (if (and len - (eql minimum maximum)) - (* minimum len) - nil))) - -(defmethod regex-length ((register register)) - (declare #.*standard-optimize-settings*) - (regex-length (regex register))) - -(defmethod regex-length ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (regex-length (regex standalone))) - -(defmethod regex-length ((back-reference back-reference)) - (declare #.*standard-optimize-settings*) - ;; with enough effort we could possibly do better here, but - ;; currently we just give up and return NIL - nil) - -(defmethod regex-length ((char-class char-class)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-length ((everything everything)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-length ((str str)) - (declare #.*standard-optimize-settings*) - (len str)) - -(defmethod regex-length ((filter filter)) - (declare #.*standard-optimize-settings*) - (len filter)) - -(defmethod regex-length ((regex regex)) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and - ;; WORD-BOUNDARY (which all have zero-length) - 0) - -(defgeneric regex-min-length (regex) - (declare #.*standard-optimize-settings*) - (:documentation "Returns the minimal length of REGEX.")) - -(defmethod regex-min-length ((seq seq)) - (declare #.*standard-optimize-settings*) - ;; simply add all inner minimal lengths - (loop for sub-regex in (elements seq) - for len = (regex-min-length sub-regex) - sum len)) - -(defmethod regex-min-length ((alternation alternation)) - (declare #.*standard-optimize-settings*) - ;; minimal length of an alternation is the minimal length of the - ;; "shortest" element - (loop for sub-regex in (choices alternation) - for len = (regex-min-length sub-regex) - minimize len)) - -(defmethod regex-min-length ((branch branch)) - (declare #.*standard-optimize-settings*) - ;; minimal length of both alternations - (min (regex-min-length (then-regex branch)) - (regex-min-length (else-regex branch)))) - -(defmethod regex-min-length ((repetition repetition)) - (declare #.*standard-optimize-settings*) - ;; obviously the product of the inner minimal length and the minimal - ;; number of repetitions - (* (minimum repetition) (min-len repetition))) - -(defmethod regex-min-length ((register register)) - (declare #.*standard-optimize-settings*) - (regex-min-length (regex register))) - -(defmethod regex-min-length ((standalone standalone)) - (declare #.*standard-optimize-settings*) - (regex-min-length (regex standalone))) - -(defmethod regex-min-length ((char-class char-class)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-min-length ((everything everything)) - (declare #.*standard-optimize-settings*) - 1) - -(defmethod regex-min-length ((str str)) - (declare #.*standard-optimize-settings*) - (len str)) - -(defmethod regex-min-length ((filter filter)) - (declare #.*standard-optimize-settings*) - (or (len filter) - 0)) - -(defmethod regex-min-length ((regex regex)) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, BACK-REFERENCE, LOOKAHEAD, - ;; LOOKBEHIND, VOID, and WORD-BOUNDARY - 0) - -(defgeneric compute-offsets (regex start-pos) - (declare #.*standard-optimize-settings*) - (:documentation "Returns the offset the following regex would have -relative to START-POS or NIL if we can't compute it. Sets the OFFSET -slot of REGEX to START-POS if REGEX is a STR. May also affect OFFSET -slots of STR objects further down the tree.")) - -;; note that we're actually only interested in the offset of -;; "top-level" STR objects (see ADVANCE-FN in the SCAN function) so we -;; can stop at variable-length alternations and don't need to descend -;; into repetitions - -(defmethod compute-offsets ((seq seq) start-pos) - (declare #.*standard-optimize-settings*) - (loop for element in (elements seq) - ;; advance offset argument for next call while looping through - ;; the elements - for pos = start-pos then curr-offset - for curr-offset = (compute-offsets element pos) - while curr-offset - finally (return curr-offset))) - -(defmethod compute-offsets ((alternation alternation) start-pos) - (declare #.*standard-optimize-settings*) - (loop for choice in (choices alternation) - for old-offset = nil then curr-offset - for curr-offset = (compute-offsets choice start-pos) - ;; we stop immediately if two alternations don't result in the - ;; same offset - if (or (not curr-offset) - (and old-offset (/= curr-offset old-offset))) - do (return nil) - finally (return curr-offset))) - -(defmethod compute-offsets ((branch branch) start-pos) - (declare #.*standard-optimize-settings*) - ;; only return offset if both alternations have equal value - (let ((then-offset (compute-offsets (then-regex branch) start-pos))) - (and then-offset - (eql then-offset (compute-offsets (else-regex branch) start-pos)) - then-offset))) - -(defmethod compute-offsets ((repetition repetition) start-pos) - (declare #.*standard-optimize-settings*) - ;; no need to descend into the inner regex - (with-slots (len minimum maximum) - repetition - (if (and len - (eq minimum maximum)) - ;; fixed number of repetitions, so we know how to proceed - (+ start-pos (* minimum len)) - ;; otherwise return NIL - nil))) - -(defmethod compute-offsets ((register register) start-pos) - (declare #.*standard-optimize-settings*) - (compute-offsets (regex register) start-pos)) - -(defmethod compute-offsets ((standalone standalone) start-pos) - (declare #.*standard-optimize-settings*) - (compute-offsets (regex standalone) start-pos)) - -(defmethod compute-offsets ((char-class char-class) start-pos) - (declare #.*standard-optimize-settings*) - (1+ start-pos)) - -(defmethod compute-offsets ((everything everything) start-pos) - (declare #.*standard-optimize-settings*) - (1+ start-pos)) - -(defmethod compute-offsets ((str str) start-pos) - (declare #.*standard-optimize-settings*) - (setf (offset str) start-pos) - (+ start-pos (len str))) - -(defmethod compute-offsets ((back-reference back-reference) start-pos) - (declare #.*standard-optimize-settings*) - ;; with enough effort we could possibly do better here, but - ;; currently we just give up and return NIL - (declare (ignore start-pos)) - nil) - -(defmethod compute-offsets ((filter filter) start-pos) - (declare #.*standard-optimize-settings*) - (let ((len (len filter))) - (if len - (+ start-pos len) - nil))) - -(defmethod compute-offsets ((regex regex) start-pos) - (declare #.*standard-optimize-settings*) - ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and - ;; WORD-BOUNDARY (which all have zero-length) - start-pos) diff --git a/repetition-closures.lisp b/repetition-closures.lisp index 1d5216b..bf5959c 100644 --- a/repetition-closures.lisp +++ b/repetition-closures.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/repetition-closures.lisp,v 1.29 2008/06/25 14:04:28 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/repetition-closures.lisp,v 1.33 2008/07/06 18:12:05 edi Exp $ ;;; This is actually a part of closures.lisp which we put into a ;;; separate file because it is rather complex. We only deal with @@ -33,7 +33,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (defmacro incf-after (place &optional (delta 1) &environment env) "Utility macro inspired by C's \"place++\", i.e. first return the @@ -58,7 +58,7 @@ CHECK-CURR-POS is a form which checks whether the inner regex of the repetition matches at CURR-POS." `(if maximum (lambda (start-pos) - (declare (type fixnum start-pos maximum)) + (declare (fixnum start-pos maximum)) ;; because we know LEN we know in advance where to stop at the ;; latest; we also take into consideration MIN-REST, i.e. the ;; minimal length of the part behind the repetition @@ -68,7 +68,7 @@ repetition matches at CURR-POS." (+ start-pos (the fixnum (* len maximum))))) (curr-pos start-pos)) - (declare (type fixnum target-end-pos curr-pos)) + (declare (fixnum target-end-pos curr-pos)) (block greedy-constant-length-matcher ;; we use an ugly TAGBODY construct because this might be a ;; tight loop and this version is a bit faster than our LOOP @@ -95,10 +95,10 @@ repetition matches at CURR-POS." ;; basically the same code; it's just a bit easier because we're ;; not bounded by MAXIMUM (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((target-end-pos (1+ (- *end-pos* len min-rest))) (curr-pos start-pos)) - (declare (type fixnum target-end-pos curr-pos)) + (declare (fixnum target-end-pos curr-pos)) (block greedy-constant-length-matcher (tagbody forward-loop @@ -117,20 +117,19 @@ repetition matches at CURR-POS." (go backward-loop))))))) (defun create-greedy-everything-matcher (maximum min-rest next-fn) - (declare #.*standard-optimize-settings*) - (declare (type fixnum min-rest) - (type function next-fn)) "Creates a closure which just matches as far ahead as possible, i.e. a closure for a dot in single-line mode." + (declare #.*standard-optimize-settings*) + (declare (fixnum min-rest) (function next-fn)) (if maximum (lambda (start-pos) - (declare (type fixnum start-pos maximum)) + (declare (fixnum start-pos maximum)) ;; because we know LEN we know in advance where to stop at the ;; latest; we also take into consideration MIN-REST, i.e. the ;; minimal length of the part behind the repetition (let ((target-end-pos (min (+ start-pos maximum) (- *end-pos* min-rest)))) - (declare (type fixnum target-end-pos)) + (declare (fixnum target-end-pos)) ;; start from the highest possible position and go backward ;; until we're able to match the rest of the regex (loop for curr-pos of-type fixnum from target-end-pos downto start-pos @@ -138,18 +137,18 @@ i.e. a closure for a dot in single-line mode." ;; basically the same code; it's just a bit easier because we're ;; not bounded by MAXIMUM (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((target-end-pos (- *end-pos* min-rest))) - (declare (type fixnum target-end-pos)) + (declare (fixnum target-end-pos)) (loop for curr-pos of-type fixnum from target-end-pos downto start-pos thereis (funcall next-fn curr-pos)))))) (defgeneric create-greedy-constant-length-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION is greedy and the minimal number of repetitions is -zero. It is furthermore assumed that the inner regex of REPETITION is -of fixed length and doesn't contain registers.")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION is greedy and the minimal number of +repetitions is zero. It is furthermore assumed that the inner regex +of REPETITION is of fixed length and doesn't contain registers.")) (defmethod create-greedy-constant-length-matcher ((repetition repetition) next-fn) @@ -158,8 +157,8 @@ of fixed length and doesn't contain registers.")) (maximum (maximum repetition)) (regex (regex repetition)) (min-rest (min-rest repetition))) - (declare (type fixnum len min-rest) - (type function next-fn)) + (declare (fixnum len min-rest) + (function next-fn)) (cond ((zerop len) ;; inner regex has zero-length, so we can discard it ;; completely @@ -186,11 +185,8 @@ of fixed length and doesn't contain registers.")) (char-class ;; a character class (insert-char-class-tester (regex (schar *string* curr-pos)) - (if (invertedp regex) - (greedy-constant-length-closure - (not (char-class-test))) - (greedy-constant-length-closure - (char-class-test))))) + (greedy-constant-length-closure + (char-class-test)))) (everything ;; an EVERYTHING object, i.e. a dot (if (single-line-p regex) @@ -202,17 +198,17 @@ of fixed length and doesn't contain registers.")) ;; just checks for immediate success, i.e. NEXT-FN is ;; #'IDENTITY (let ((inner-matcher (create-matcher-aux regex #'identity))) - (declare (type function inner-matcher)) + (declare (function inner-matcher)) (greedy-constant-length-closure (funcall inner-matcher curr-pos))))))))) (defgeneric create-greedy-no-zero-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION is greedy and the minimal number of repetitions is -zero. It is furthermore assumed that the inner regex of REPETITION can -never match a zero-length string (or instead the maximal number of -repetitions is 1).")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION is greedy and the minimal number of +repetitions is zero. It is furthermore assumed that the inner regex +of REPETITION can never match a zero-length string \(or instead the +maximal number of repetitions is 1).")) (defmethod create-greedy-no-zero-matcher ((repetition repetition) next-fn) (declare #.*standard-optimize-settings*) @@ -220,7 +216,7 @@ repetitions is 1).")) ;; REPEAT-MATCHER is part of the closure's environment but it ;; can only be defined after GREEDY-AUX is defined repeat-matcher) - (declare (type function next-fn)) + (declare (function next-fn)) (cond ((eql maximum 1) ;; this is essentially like the next case but with a known @@ -230,7 +226,7 @@ repetitions is 1).")) (setq repeat-matcher (create-matcher-aux (regex repetition) next-fn)) (lambda (start-pos) - (declare (type function repeat-matcher)) + (declare (function repeat-matcher)) (or (funcall repeat-matcher start-pos) (funcall next-fn start-pos)))) (maximum @@ -239,8 +235,8 @@ repetitions is 1).")) ;; repetitions (let ((rep-num (incf-after *rep-num*))) (flet ((greedy-aux (start-pos) - (declare (type fixnum start-pos maximum rep-num) - (type function repeat-matcher)) + (declare (fixnum start-pos maximum rep-num) + (function repeat-matcher)) ;; the actual matcher which first tries to match the ;; inner regex of REPETITION (if we haven't done so ;; too often) and on failure calls NEXT-FN @@ -259,15 +255,15 @@ repetitions is 1).")) ;; the closure we return is just a thin wrapper around ;; GREEDY-AUX to initialize the repetition counter (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (aref *repeat-counters* rep-num) 0) (greedy-aux start-pos))))) (t ;; easier code because we're not bounded by MAXIMUM, but ;; basically the same (flet ((greedy-aux (start-pos) - (declare (type fixnum start-pos) - (type function repeat-matcher)) + (declare (fixnum start-pos) + (function repeat-matcher)) (or (funcall repeat-matcher start-pos) (funcall next-fn start-pos)))) (setq repeat-matcher @@ -276,9 +272,9 @@ repetitions is 1).")) (defgeneric create-greedy-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION is greedy and the minimal number of repetitions is -zero.")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION is greedy and the minimal number of +repetitions is zero.")) (defmethod create-greedy-matcher ((repetition repetition) next-fn) (declare #.*standard-optimize-settings*) @@ -290,8 +286,8 @@ zero.")) ;; REPEAT-MATCHER is part of the closure's environment but it ;; can only be defined after GREEDY-AUX is defined repeat-matcher) - (declare (type fixnum zero-length-num) - (type function next-fn)) + (declare (fixnum zero-length-num) + (function next-fn)) (cond (maximum ;; we make a reservation for our slot in *REPEAT-COUNTERS* @@ -302,8 +298,8 @@ zero.")) ;; the actual matcher which first tries to match the ;; inner regex of REPETITION (if we haven't done so ;; too often) and on failure calls NEXT-FN - (declare (type fixnum start-pos maximum rep-num) - (type function repeat-matcher)) + (declare (fixnum start-pos maximum rep-num) + (function repeat-matcher)) (let ((old-last-pos (svref *last-pos-stores* zero-length-num))) (when (and old-last-pos @@ -333,7 +329,7 @@ zero.")) ;; GREEDY-AUX to initialize the repetition counter and our ;; slot in *LAST-POS-STORES* (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (aref *repeat-counters* rep-num) 0 (svref *last-pos-stores* zero-length-num) nil) (greedy-aux start-pos))))) @@ -341,8 +337,8 @@ zero.")) ;; easier code because we're not bounded by MAXIMUM, but ;; basically the same (flet ((greedy-aux (start-pos) - (declare (type fixnum start-pos) - (type function repeat-matcher)) + (declare (fixnum start-pos) + (function repeat-matcher)) (let ((old-last-pos (svref *last-pos-stores* zero-length-num))) (when (and old-last-pos @@ -356,14 +352,14 @@ zero.")) (setq repeat-matcher (create-matcher-aux (regex repetition) #'greedy-aux)) (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (svref *last-pos-stores* zero-length-num) nil) (greedy-aux start-pos))))))) ;; code for non-greedy repetitions with minimum zero (defmacro non-greedy-constant-length-closure (check-curr-pos) - "This is the template for simple non-greedy repetitions (where + "This is the template for simple non-greedy repetitions \(where simple means that the minimum number of repetitions is zero, that the inner regex to be checked is of fixed length LEN, and that it doesn't contain registers, i.e. there's no need for backtracking). @@ -371,7 +367,7 @@ CHECK-CURR-POS is a form which checks whether the inner regex of the repetition matches at CURR-POS." `(if maximum (lambda (start-pos) - (declare (type fixnum start-pos maximum)) + (declare (fixnum start-pos maximum)) ;; because we know LEN we know in advance where to stop at the ;; latest; we also take into consideration MIN-REST, i.e. the ;; minimal length of the part behind the repetition @@ -389,7 +385,7 @@ repetition matches at CURR-POS." ;; basically the same code; it's just a bit easier because we're ;; not bounded by MAXIMUM (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((target-end-pos (1+ (- *end-pos* len min-rest)))) (loop for curr-pos of-type fixnum from start-pos below target-end-pos @@ -400,10 +396,10 @@ repetition matches at CURR-POS." (defgeneric create-non-greedy-constant-length-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION is non-greedy and the minimal number of repetitions is -zero. It is furthermore assumed that the inner regex of REPETITION is -of fixed length and doesn't contain registers.")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION is non-greedy and the minimal number of +repetitions is zero. It is furthermore assumed that the inner regex +of REPETITION is of fixed length and doesn't contain registers.")) (defmethod create-non-greedy-constant-length-matcher ((repetition repetition) next-fn) (declare #.*standard-optimize-settings*) @@ -411,8 +407,8 @@ of fixed length and doesn't contain registers.")) (maximum (maximum repetition)) (regex (regex repetition)) (min-rest (min-rest repetition))) - (declare (type fixnum len min-rest) - (type function next-fn)) + (declare (fixnum len min-rest) + (function next-fn)) (cond ((zerop len) ;; inner regex has zero-length, so we can discard it ;; completely @@ -439,11 +435,8 @@ of fixed length and doesn't contain registers.")) (char-class ;; a character class (insert-char-class-tester (regex (schar *string* curr-pos)) - (if (invertedp regex) - (non-greedy-constant-length-closure - (not (char-class-test))) - (non-greedy-constant-length-closure - (char-class-test))))) + (non-greedy-constant-length-closure + (char-class-test)))) (everything (if (single-line-p regex) ;; a dot which really can match everything; we rely @@ -458,17 +451,17 @@ of fixed length and doesn't contain registers.")) ;; just checks for immediate success, i.e. NEXT-FN is ;; #'IDENTITY (let ((inner-matcher (create-matcher-aux regex #'identity))) - (declare (type function inner-matcher)) + (declare (function inner-matcher)) (non-greedy-constant-length-closure (funcall inner-matcher curr-pos))))))))) (defgeneric create-non-greedy-no-zero-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION is non-greedy and the minimal number of repetitions is -zero. It is furthermore assumed that the inner regex of REPETITION can -never match a zero-length string (or instead the maximal number of -repetitions is 1).")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION is non-greedy and the minimal number of +repetitions is zero. It is furthermore assumed that the inner regex +of REPETITION can never match a zero-length string \(or instead the +maximal number of repetitions is 1).")) (defmethod create-non-greedy-no-zero-matcher ((repetition repetition) next-fn) (declare #.*standard-optimize-settings*) @@ -476,7 +469,7 @@ repetitions is 1).")) ;; REPEAT-MATCHER is part of the closure's environment but it ;; can only be defined after NON-GREEDY-AUX is defined repeat-matcher) - (declare (type function next-fn)) + (declare (function next-fn)) (cond ((eql maximum 1) ;; this is essentially like the next case but with a known @@ -484,7 +477,7 @@ repetitions is 1).")) (setq repeat-matcher (create-matcher-aux (regex repetition) next-fn)) (lambda (start-pos) - (declare (type function repeat-matcher)) + (declare (function repeat-matcher)) (or (funcall next-fn start-pos) (funcall repeat-matcher start-pos)))) (maximum @@ -496,8 +489,8 @@ repetitions is 1).")) ;; the actual matcher which first calls NEXT-FN and ;; on failure tries to match the inner regex of ;; REPETITION (if we haven't done so too often) - (declare (type fixnum start-pos maximum rep-num) - (type function repeat-matcher)) + (declare (fixnum start-pos maximum rep-num) + (function repeat-matcher)) (or (funcall next-fn start-pos) (and (< (aref *repeat-counters* rep-num) maximum) (incf (aref *repeat-counters* rep-num)) @@ -513,15 +506,15 @@ repetitions is 1).")) ;; the closure we return is just a thin wrapper around ;; NON-GREEDY-AUX to initialize the repetition counter (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (aref *repeat-counters* rep-num) 0) (non-greedy-aux start-pos))))) (t ;; easier code because we're not bounded by MAXIMUM, but ;; basically the same (flet ((non-greedy-aux (start-pos) - (declare (type fixnum start-pos) - (type function repeat-matcher)) + (declare (fixnum start-pos) + (function repeat-matcher)) (or (funcall next-fn start-pos) (funcall repeat-matcher start-pos)))) (setq repeat-matcher @@ -530,9 +523,9 @@ repetitions is 1).")) (defgeneric create-non-greedy-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION is non-greedy and the minimal number of repetitions is -zero.")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION is non-greedy and the minimal number of +repetitions is zero.")) (defmethod create-non-greedy-matcher ((repetition repetition) next-fn) (declare #.*standard-optimize-settings*) @@ -544,8 +537,8 @@ zero.")) ;; REPEAT-MATCHER is part of the closure's environment but it ;; can only be defined after NON-GREEDY-AUX is defined repeat-matcher) - (declare (type fixnum zero-length-num) - (type function next-fn)) + (declare (fixnum zero-length-num) + (function next-fn)) (cond (maximum ;; we make a reservation for our slot in *REPEAT-COUNTERS* @@ -556,8 +549,8 @@ zero.")) ;; the actual matcher which first calls NEXT-FN and ;; on failure tries to match the inner regex of ;; REPETITION (if we haven't done so too often) - (declare (type fixnum start-pos maximum rep-num) - (type function repeat-matcher)) + (declare (fixnum start-pos maximum rep-num) + (function repeat-matcher)) (let ((old-last-pos (svref *last-pos-stores* zero-length-num))) (when (and old-last-pos @@ -587,7 +580,7 @@ zero.")) ;; NON-GREEDY-AUX to initialize the repetition counter and our ;; slot in *LAST-POS-STORES* (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (aref *repeat-counters* rep-num) 0 (svref *last-pos-stores* zero-length-num) nil) (non-greedy-aux start-pos))))) @@ -595,8 +588,8 @@ zero.")) ;; easier code because we're not bounded by MAXIMUM, but ;; basically the same (flet ((non-greedy-aux (start-pos) - (declare (type fixnum start-pos) - (type function repeat-matcher)) + (declare (fixnum start-pos) + (function repeat-matcher)) (let ((old-last-pos (svref *last-pos-stores* zero-length-num))) (when (and old-last-pos @@ -611,7 +604,7 @@ zero.")) (setq repeat-matcher (create-matcher-aux (regex repetition) #'non-greedy-aux)) (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (svref *last-pos-stores* zero-length-num) nil) (non-greedy-aux start-pos))))))) @@ -622,13 +615,13 @@ zero.")) means that the inner regex to be checked is of fixed length LEN, and that it doesn't contain registers, i.e. there's no need for backtracking) and where constant means that MINIMUM is equal to -MAXIMUM. CHECK-CURR-POS is a form which checks whether the inner regex -of the repetition matches at CURR-POS." +MAXIMUM. CHECK-CURR-POS is a form which checks whether the inner +regex of the repetition matches at CURR-POS." `(lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((target-end-pos (+ start-pos (the fixnum (* len repetitions))))) - (declare (type fixnum target-end-pos)) + (declare (fixnum target-end-pos)) ;; first check if we won't go beyond the end of the string (and (>= *end-pos* target-end-pos) ;; then loop through all repetitions step by step @@ -642,10 +635,10 @@ of the repetition matches at CURR-POS." (defgeneric create-constant-repetition-constant-length-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION has a constant number of repetitions. It is -furthermore assumed that the inner regex of REPETITION is of fixed -length and doesn't contain registers.")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION has a constant number of repetitions. +It is furthermore assumed that the inner regex of REPETITION is of +fixed length and doesn't contain registers.")) (defmethod create-constant-repetition-constant-length-matcher ((repetition repetition) next-fn) @@ -653,8 +646,8 @@ length and doesn't contain registers.")) (let ((len (len repetition)) (repetitions (minimum repetition)) (regex (regex repetition))) - (declare (type fixnum len repetitions) - (type function next-fn)) + (declare (fixnum len repetitions) + (function next-fn)) (if (zerop len) ;; if the length is zero it suffices to try once (create-matcher-aux regex next-fn) @@ -676,33 +669,29 @@ length and doesn't contain registers.")) (if (case-insensitive-p regex) (constant-repetition-constant-length-closure (let ((next-pos (+ curr-pos len))) - (declare (type fixnum next-pos)) + (declare (fixnum next-pos)) (and (*string*-equal str curr-pos next-pos 0 len) next-pos))) (constant-repetition-constant-length-closure (let ((next-pos (+ curr-pos len))) - (declare (type fixnum next-pos)) + (declare (fixnum next-pos)) (and (*string*= str curr-pos next-pos 0 len) next-pos))))))) (char-class ;; a character class (insert-char-class-tester (regex (schar *string* curr-pos)) - (if (invertedp regex) - (constant-repetition-constant-length-closure - (and (not (char-class-test)) - (1+ curr-pos))) - (constant-repetition-constant-length-closure - (and (char-class-test) - (1+ curr-pos)))))) + (constant-repetition-constant-length-closure + (and (char-class-test) + (1+ curr-pos))))) (everything (if (single-line-p regex) ;; a dot which really matches everything - we just have to ;; advance the index into *STRING* accordingly and check ;; if we didn't go past the end (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (let ((next-pos (+ start-pos repetitions))) - (declare (type fixnum next-pos)) + (declare (fixnum next-pos)) (and (<= next-pos *end-pos*) (funcall next-fn next-pos)))) ;; a dot which is not in single-line-mode - make sure we @@ -714,14 +703,14 @@ length and doesn't contain registers.")) ;; the general case - we build an inner matcher which just ;; checks for immediate success, i.e. NEXT-FN is #'IDENTITY (let ((inner-matcher (create-matcher-aux regex #'identity))) - (declare (type function inner-matcher)) + (declare (function inner-matcher)) (constant-repetition-constant-length-closure (funcall inner-matcher curr-pos)))))))) (defgeneric create-constant-repetition-matcher (repetition next-fn) (declare #.*standard-optimize-settings*) - (:documentation "Creates a closure which tries to match REPETITION. It is assumed -that REPETITION has a constant number of repetitions.")) + (:documentation "Creates a closure which tries to match REPETITION. +It is assumed that REPETITION has a constant number of repetitions.")) (defmethod create-constant-repetition-matcher ((repetition repetition) next-fn) (declare #.*standard-optimize-settings*) @@ -732,20 +721,20 @@ that REPETITION has a constant number of repetitions.")) ;; REPEAT-MATCHER is part of the closure's environment but it ;; can only be defined after NON-GREEDY-AUX is defined repeat-matcher) - (declare (type fixnum repetitions rep-num) - (type function next-fn)) + (declare (fixnum repetitions rep-num) + (function next-fn)) (if (zerop (min-len repetition)) ;; we make a reservation for our slot in *LAST-POS-STORES* ;; because we have to watch out for needless loops as the inner ;; regex might match zero-length strings (let ((zero-length-num (incf-after *zero-length-num*))) - (declare (type fixnum zero-length-num)) + (declare (fixnum zero-length-num)) (flet ((constant-aux (start-pos) ;; the actual matcher which first calls NEXT-FN and ;; on failure tries to match the inner regex of ;; REPETITION (if we haven't done so too often) - (declare (type fixnum start-pos) - (type function repeat-matcher)) + (declare (fixnum start-pos) + (function repeat-matcher)) (let ((old-last-pos (svref *last-pos-stores* zero-length-num))) (when (and old-last-pos @@ -778,15 +767,15 @@ that REPETITION has a constant number of repetitions.")) ;; the closure we return is just a thin wrapper around ;; CONSTANT-AUX to initialize the repetition counter (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (aref *repeat-counters* rep-num) 0 (aref *last-pos-stores* zero-length-num) nil) (constant-aux start-pos)))) ;; easier code because we don't have to care about zero-length ;; matches but basically the same (flet ((constant-aux (start-pos) - (declare (type fixnum start-pos) - (type function repeat-matcher)) + (declare (fixnum start-pos) + (function repeat-matcher)) (cond ((< (aref *repeat-counters* rep-num) repetitions) (incf (aref *repeat-counters* rep-num)) (prog1 @@ -796,7 +785,7 @@ that REPETITION has a constant number of repetitions.")) (setq repeat-matcher (create-matcher-aux (regex repetition) #'constant-aux)) (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (setf (aref *repeat-counters* rep-num) 0) (constant-aux start-pos)))))) diff --git a/scanner.lisp b/scanner.lisp index c090da1..d899bf1 100644 --- a/scanner.lisp +++ b/scanner.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/scanner.lisp,v 1.29 2008/06/25 14:04:28 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/scanner.lisp,v 1.34 2008/07/06 18:12:05 edi Exp $ ;;; Here the scanner for the actual regex as well as utility scanners ;;; for the constant start and end strings are created. @@ -30,13 +30,13 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) (defmacro bmh-matcher-aux (&key case-insensitive-p) "Auxiliary macro used by CREATE-BMH-MATCHER." (let ((char-compare (if case-insensitive-p 'char-equal 'char=))) `(lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (if (or (minusp start-pos) (> (the fixnum (+ start-pos m)) *end-pos*)) nil @@ -53,21 +53,21 @@ (return-from bmh-matcher (1+ i))))))))) (defun create-bmh-matcher (pattern case-insensitive-p) - (declare #.*standard-optimize-settings*) "Returns a Boyer-Moore-Horspool matcher which searches the (special) simple-string *STRING* for the first occurence of the substring -PATTERN. The search starts at the position START-POS within *STRING* -and stops before *END-POS* is reached. Depending on the second -argument the search is case-insensitive or not. If the special +PATTERN. The search starts at the position START-POS within *STRING* +and stops before *END-POS* is reached. Depending on the second +argument the search is case-insensitive or not. If the special variable *USE-BMH-MATCHERS* is NIL, use the standard SEARCH function -instead. (BMH matchers are faster but need much more space.)" +instead. \(BMH matchers are faster but need much more space.)" + (declare #.*standard-optimize-settings*) ;; see for ;; details (unless *use-bmh-matchers* (let ((test (if case-insensitive-p #'char-equal #'char=))) (return-from create-bmh-matcher (lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (not (minusp start-pos)) (search pattern *string* @@ -78,7 +78,7 @@ instead. (BMH matchers are faster but need much more space.)" (skip (make-array *regex-char-code-limit* :element-type 'fixnum :initial-element m))) - (declare (type fixnum m)) + (declare (fixnum m)) (loop for k of-type fixnum below m if case-insensitive-p do (setf (aref skip (char-code (char-upcase (schar pattern k)))) (- m k 1) @@ -93,29 +93,28 @@ instead. (BMH matchers are faster but need much more space.)" "Auxiliary macro used by CREATE-CHAR-SEARCHER." (let ((char-compare (if case-insensitive-p 'char-equal 'char=))) `(lambda (start-pos) - (declare (type fixnum start-pos)) + (declare (fixnum start-pos)) (and (not (minusp start-pos)) (loop for i of-type fixnum from start-pos below *end-pos* thereis (and (,char-compare (schar *string* i) chr) i)))))) (defun create-char-searcher (chr case-insensitive-p) - (declare #.*standard-optimize-settings*) "Returns a function which searches the (special) simple-string *STRING* for the first occurence of the character CHR. The search starts at the position START-POS within *STRING* and stops before -*END-POS* is reached. Depending on the second argument the search is +*END-POS* is reached. Depending on the second argument the search is case-insensitive or not." + (declare #.*standard-optimize-settings*) (if case-insensitive-p (char-searcher-aux :case-insensitive-p t) (char-searcher-aux))) (declaim (inline newline-skipper)) - (defun newline-skipper (start-pos) - (declare #.*standard-optimize-settings*) - (declare (type fixnum start-pos)) - "Find the next occurence of a character in *STRING* which is behind + "Finds the next occurence of a character in *STRING* which is behind a #\Newline." + (declare #.*standard-optimize-settings*) + (declare (fixnum start-pos)) ;; we can start with (1- START-POS) without testing for (PLUSP ;; START-POS) because we know we'll never call NEWLINE-SKIPPER on ;; the first iteration @@ -127,7 +126,7 @@ a #\Newline." (defmacro insert-advance-fn (advance-fn) "Creates the actual closure returned by CREATE-SCANNER-AUX by replacing '(ADVANCE-FN-DEFINITION) with a suitable definition for -ADVANCE-FN. This is a utility macro used by CREATE-SCANNER-AUX." +ADVANCE-FN. This is a utility macro used by CREATE-SCANNER-AUX." (subst advance-fn '(advance-fn-definition) '(lambda (string start end) @@ -159,8 +158,8 @@ ADVANCE-FN. This is a utility macro used by CREATE-SCANNER-AUX." nil)) ;; we don't need to try further than MAX-END-POS (max-end-pos (- *end-pos* min-len))) - (declare (type fixnum scan-start-pos) - (type function match-fn)) + (declare (fixnum scan-start-pos) + (function match-fn)) ;; definition of ADVANCE-FN will be inserted here by macrology (labels ((advance-fn-definition)) (declare (inline advance-fn)) @@ -185,8 +184,8 @@ ADVANCE-FN. This is a utility macro used by CREATE-SCANNER-AUX." ;; is anchored at the very end of the target string ;; (perhaps modulo a #\Newline) (let ((end-test-pos (- *end-pos* (the fixnum end-string-len)))) - (declare (type fixnum end-test-pos) - (type function end-string-test)) + (declare (fixnum end-test-pos) + (function end-string-test)) (unless (setq *end-string-pos* (funcall end-string-test end-test-pos)) (when (and (= 1 (the fixnum end-anchored-p)) @@ -223,7 +222,7 @@ ADVANCE-FN. This is a utility macro used by CREATE-SCANNER-AUX." (return-from scan nil)) (when starts-with-str (locally - (declare (type fixnum starts-with-len)) + (declare (fixnum starts-with-len)) (cond ((and (case-insensitive-p starts-with) (not (*string*-equal starts-with-str *start-pos* @@ -321,10 +320,10 @@ ADVANCE-FN. This is a utility macro used by CREATE-SCANNER-AUX." rep-num zero-length-num reg-num) - (declare #.*standard-optimize-settings*) - (declare (type fixnum min-len zero-length-num rep-num reg-num)) "Auxiliary function to create and return a scanner \(which is -actually a closure). Used by CREATE-SCANNER." +actually a closure). Used by CREATE-SCANNER." + (declare #.*standard-optimize-settings*) + (declare (fixnum min-len zero-length-num rep-num reg-num)) (let ((starts-with-len (if (typep starts-with 'str) (len starts-with))) (starts-with-everything (typep starts-with 'everything))) @@ -341,8 +340,8 @@ actually a closure). Used by CREATE-SCANNER." ;; left) (insert-advance-fn (advance-fn (pos) - (declare (type fixnum end-string-offset starts-with-len) - (type function start-string-test end-string-test)) + (declare (fixnum end-string-offset starts-with-len) + (function start-string-test end-string-test)) (loop (unless (setq pos (funcall start-string-test pos)) ;; give up completely if we can't find a start string @@ -350,7 +349,7 @@ actually a closure). Used by CREATE-SCANNER." (return-from scan nil)) (locally ;; from here we know that POS is a FIXNUM - (declare (type fixnum pos)) + (declare (fixnum pos)) (when (= pos (- (the fixnum *end-string-pos*) end-string-offset)) ;; if we already found an end string candidate the ;; position of which matches the start string @@ -369,7 +368,7 @@ actually a closure). Used by CREATE-SCANNER." ;; according to the end string candidate (let ((new-pos (- (the fixnum *end-string-pos*) end-string-offset))) - (declare (type fixnum new-pos *end-string-pos*)) + (declare (fixnum new-pos *end-string-pos*)) (cond ((= new-pos pos) ;; if POS and NEW-POS are equal then the ;; two candidates agree so we're fine @@ -394,15 +393,15 @@ actually a closure). Used by CREATE-SCANNER." ;; offset (from the left) (insert-advance-fn (advance-fn (pos) - (declare (type fixnum end-string-offset) - (type function end-string-test)) + (declare (fixnum end-string-offset) + (function end-string-test)) (loop (unless (setq pos (newline-skipper pos)) ;; if we can't find a #\Newline we give up immediately (return-from scan nil)) (locally ;; from here we know that POS is a FIXNUM - (declare (type fixnum pos)) + (declare (fixnum pos)) (when (= pos (- (the fixnum *end-string-pos*) end-string-offset)) ;; if we already found an end string candidate the ;; position of which matches the place behind the @@ -420,7 +419,7 @@ actually a closure). Used by CREATE-SCANNER." ;; according to the end string candidate (let ((new-pos (- (the fixnum *end-string-pos*) end-string-offset))) - (declare (type fixnum new-pos *end-string-pos*)) + (declare (fixnum new-pos *end-string-pos*)) (cond ((= new-pos pos) ;; if POS and NEW-POS are equal then the ;; the end string candidate agrees with @@ -446,7 +445,7 @@ actually a closure). Used by CREATE-SCANNER." ;; information to advance POS (insert-advance-fn (advance-fn (pos) - (declare (type function start-string-test end-string-test)) + (declare (function start-string-test end-string-test)) (unless (setq pos (funcall start-string-test pos)) (return-from scan nil)) (if (<= (the fixnum pos) @@ -463,7 +462,7 @@ actually a closure). Used by CREATE-SCANNER." ;; enough information to advance POS (insert-advance-fn (advance-fn (pos) - (declare (type function end-string-test)) + (declare (function end-string-test)) (unless (setq pos (newline-skipper pos)) (return-from scan nil)) (if (<= (the fixnum pos) @@ -476,7 +475,7 @@ actually a closure). Used by CREATE-SCANNER." ;; just check for constant start string candidate (insert-advance-fn (advance-fn (pos) - (declare (type function start-string-test)) + (declare (function start-string-test)) (unless (setq pos (funcall start-string-test pos)) (return-from scan nil)) pos))) @@ -492,7 +491,7 @@ actually a closure). Used by CREATE-SCANNER." ;; advanced beyond the last one (insert-advance-fn (advance-fn (pos) - (declare (type function end-string-test)) + (declare (function end-string-test)) (if (<= (the fixnum pos) (the fixnum *end-string-pos*)) (return-from advance-fn pos)) diff --git a/specials.lisp b/specials.lisp index b19f49e..6d8604c 100644 --- a/specials.lisp +++ b/specials.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/specials.lisp,v 1.27 2008/07/03 08:13:28 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/specials.lisp,v 1.40 2008/07/23 02:14:06 edi Exp $ ;;; globally declared special variables @@ -29,7 +29,7 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) ;;; special variables used to effect declarations @@ -51,7 +51,7 @@ (defvar *extended-mode-p* nil "Whether the parser will start in extended mode.") -(declaim (type boolean *extended-mode-p*)) +(declaim (boolean *extended-mode-p*)) ;;; special variables used by the SCAN function and the matchers @@ -60,16 +60,16 @@ occur in character classes. Change this value BEFORE creating scanners if you don't need the \(full) Unicode support of implementations like AllegroCL, CLISP, LispWorks, or SBCL.") -(declaim (type fixnum *regex-char-code-limit*)) +(declaim (fixnum *regex-char-code-limit*)) (defvar *string* "" "The string which is currently scanned by SCAN. Will always be coerced to a SIMPLE-STRING.") -(declaim (type simple-string *string*)) +(declaim (simple-string *string*)) (defvar *start-pos* 0 "Where to start scanning within *STRING*.") -(declaim (type fixnum *start-pos*)) +(declaim (fixnum *start-pos*)) (defvar *real-start-pos* nil "The real start of *STRING*. This is for repeated scans and is only used internally.") @@ -77,22 +77,22 @@ Will always be coerced to a SIMPLE-STRING.") (defvar *end-pos* 0 "Where to stop scanning within *STRING*.") -(declaim (type fixnum *end-pos*)) +(declaim (fixnum *end-pos*)) (defvar *reg-starts* (make-array 0) "An array which holds the start positions of the current register candidates.") -(declaim (type simple-vector *reg-starts*)) +(declaim (simple-vector *reg-starts*)) (defvar *regs-maybe-start* (make-array 0) "An array which holds the next start positions of the current register candidates.") -(declaim (type simple-vector *regs-maybe-start*)) +(declaim (simple-vector *regs-maybe-start*)) (defvar *reg-ends* (make-array 0) "An array which holds the end positions of the current register candidates.") -(declaim (type simple-vector *reg-ends*)) +(declaim (simple-vector *reg-ends*)) (defvar *end-string-pos* nil "Start of the next possible end-string candidate.") @@ -100,12 +100,12 @@ of the current register candidates.") (defvar *rep-num* 0 "Counts the number of \"complicated\" repetitions while the matchers are built.") -(declaim (type fixnum *rep-num*)) +(declaim (fixnum *rep-num*)) (defvar *zero-length-num* 0 "Counts the number of repetitions the inner regexes of which may have zero-length while the matchers are built.") -(declaim (type fixnum *zero-length-num*)) +(declaim (fixnum *zero-length-num*)) (defvar *repeat-counters* (make-array 0 :initial-element 0 @@ -118,12 +118,27 @@ repetitive patterns have been tested already.") "An array to keep track of the last positions where we saw repetitive patterns. Only used for patterns which might have zero length.") -(declaim (type simple-vector *last-pos-stores*)) +(declaim (simple-vector *last-pos-stores*)) (defvar *use-bmh-matchers* t "Whether the scanners created by CREATE-SCANNER should use the \(fast but large) Boyer-Moore-Horspool matchers.") +(defvar *optimize-char-classes* nil + "Whether character classes should be compiled into look-ups into +O\(1) data structures. This is usually fast but will be costly in +terms of scanner creation time and might be costly in terms of size if +*REGEX-CHAR-CODE-LIMIT* is high. This value will be used as the :KIND +keyword argument to CREATE-OPTIMIZED-TEST-FUNCTION - see there for the +possible non-NIL values.") + +(defvar *property-resolver* nil + "Should be NIL or a designator for a function which accepts strings +and returns unary character test functions or NIL. This 'resolver' is +intended to handle `character properties' like \\p{IsAlpha}. If +*PROPERTY-RESOLVER* is NIL, then the parser will simply treat \\p and +\\P as #\\p and #\\P as in older versions of CL-PPCRE.") + (defvar *allow-quoting* nil "Whether the parser should support Perl's \\Q and \\E.") diff --git a/lispworks-defsystem.lisp b/test/packages.lisp similarity index 57% rename from lispworks-defsystem.lisp rename to test/packages.lisp index 58ca0c8..c914ee1 100644 --- a/lispworks-defsystem.lisp +++ b/test/packages.lisp @@ -1,9 +1,7 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/lispworks-defsystem.lisp,v 1.4 2008/06/25 14:04:27 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/test/packages.lisp,v 1.3 2008/07/22 12:58:52 edi Exp $ -;;; This system definition for LispWorks was kindly provided by Wade Humeniuk - -;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. +;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. ;;; Redistribution and use in source and binary forms, with or without ;;; modification, are permitted provided that the following conditions @@ -29,29 +27,11 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-user) +(in-package :cl-user) -(defparameter *cl-ppcre-base-directory* - (make-pathname :name nil :type nil :version nil - :defaults (parse-namestring *load-truename*))) - -(defsystem cl-ppcre - (:default-pathname *cl-ppcre-base-directory* - :default-type :lisp-file) - :members ("packages" - "specials" - "util" - "errors" - "lexer" - "parser" - "regex-class" - "convert" - "optimize" - "closures" - "repetition-closures" - "scanner" - "api") - :rules ((:in-order-to :compile :all - (:requires (:load :previous))) - (:in-order-to :load :all - (:requires (:load :previous))))) \ No newline at end of file +(defpackage :cl-ppcre-test + #+genera (:shadowing-import-from :common-lisp :lambda) + (:use #-:genera :cl #+:genera :future-common-lisp :cl-ppcre) + (:import-from :cl-ppcre :*standard-optimize-settings* + :string-list-to-simple-string) + (:export :run-all-tests :unicode-test)) diff --git a/test/perl-tests.lisp b/test/perl-tests.lisp new file mode 100644 index 0000000..be1c275 --- /dev/null +++ b/test/perl-tests.lisp @@ -0,0 +1,150 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/test/perl-tests.lisp,v 1.7 2008/07/22 23:02:04 edi Exp $ + +;;; The tests in this file test CL-PPCRE against testdata generated by +;;; the Perl program `perltest.pl' from the input file `testinput' in +;;; order to check compatibility with Perl and correctness of the +;;; regex engine. + +;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-ppcre-test) + +(defvar *tests-to-skip* '(662 790 1439) + "Some tests we skip because the testdata is generated by a Perl +program and CL-PPCRE differs from Perl for these tests - on purpose.") + +(defun create-string-from-input (input) + "Converts INPUT to a string which can be used in TEST below. The +input file `testdata' encodes strings containing non-printable +characters as lists where those characters are represented by their +character code." + (etypecase input + ((or null string) input) + (list (string-list-to-simple-string + (loop for element in input + if (stringp element) + collect element + else + collect (string (code-char element))))))) + +(defun perl-test (&key (file-name + (make-pathname :name "perltestdata" + :type nil :version nil + :defaults *this-file*) + file-name-provided-p) + (external-format '(:latin-1 :eol-style :lf)) + verbose) + "Loops through all test cases in FILE-NAME and prints a report if +VERBOSE is true. EXTERNAL-FORMAT is the FLEXI-STREAMS external format +which is used to read the file. Returns a true value if all tests +succeeded. + +For the syntax of the tests in FILE-NAME refer to the source code of +this function and to the Perl script perltest.pl which generates such +test files." + (declare #.*standard-optimize-settings*) + (with-open-file (binary-stream file-name :element-type 'flex:octet) + (let ((stream (flex:make-flexi-stream binary-stream :external-format external-format)) + ;; the standard Perl tests don't need full Unicode support + (*regex-char-code-limit* (if file-name-provided-p *regex-char-code-limit* 256)) + ;; we need this for the standard test suite or otherwise we + ;; might get stack overflows + (*optimize-char-classes* (if file-name-provided-p *optimize-char-classes* :charmap)) + ;; we only check for correctness and don't care about speed + ;; that match (but rather about space constraints of the + ;; trial versions) + (*use-bmh-matchers* (if file-name-provided-p *use-bmh-matchers* nil)) + ;; some tests in the Perl suite explicitly check for this + (*allow-quoting* (if file-name-provided-p *allow-quoting* t))) + (do-tests ((format nil "Running tests in file ~S" (file-namestring file-name)) + (not verbose)) + (let ((input-line (or (read stream nil) (done))) + errors) + (destructuring-bind (counter + info-string% + regex% + case-insensitive-mode + multi-line-mode + single-line-mode + extended-mode + target% + perl-error + expected-result% + expected-registers) + input-line + (destructuring-bind (info-string regex target expected-result) + (mapcar 'create-string-from-input + (list info-string% regex% target% expected-result%)) + (setq expected-registers (mapcar 'create-string-from-input expected-registers)) + (unless (find counter *tests-to-skip* :test #'=) + (when verbose + (format t "~&~4D: ~S" counter info-string)) + (let ((scanner + (handler-bind ((error (lambda (condition) + (declare (ignore condition)) + (when perl-error + ;; we expected an + ;; error, so we can + ;; signal success + (return-from test-block))))) + (create-scanner regex + :case-insensitive-mode case-insensitive-mode + :multi-line-mode multi-line-mode + :single-line-mode single-line-mode + :extended-mode extended-mode)))) + (block test-block + (multiple-value-bind (start end reg-starts reg-ends) + (scan scanner target) + (cond (perl-error + (push (format nil "expected an error but got a result.") + errors)) + (t + (when (not (eq start expected-result)) + (if start + (let ((result (subseq target start end))) + (unless (string= result expected-result) + (push (format nil "expected ~S but got ~S." + expected-result result) + errors)) + (setq reg-starts (coerce reg-starts 'list) + reg-ends (coerce reg-ends 'list)) + (loop for i from 0 + for expected-register in expected-registers + for reg-start = (nth i reg-starts) + for reg-end = (nth i reg-ends) + for register = (if (and reg-start reg-end) + (subseq target reg-start reg-end) + nil) + unless (string= expected-register register) + do (push (format nil "\\~A: expected ~S but got ~S." + (1+ i) expected-register register) + errors))) + (push (format nil "expected ~S but got ~S." + expected-result start) + errors)))))) + errors)))))))))) diff --git a/perltest.pl b/test/perltest.pl old mode 100755 new mode 100644 similarity index 90% rename from perltest.pl rename to test/perltest.pl index 8e79287..b49d973 --- a/perltest.pl +++ b/test/perltest.pl @@ -1,4 +1,5 @@ #!/usr/bin/perl +# $Header: /usr/local/cvsrep/cl-ppcre/test/perltest.pl,v 1.1 2008/07/06 21:24:39 edi Exp $ # This is a heavily modified version of the file 'perltest' which # comes with the PCRE library package, which is open source software, @@ -8,8 +9,6 @@ # The PCRE library package is available from # -use Time::HiRes qw(time); - sub string_for_lisp { my(@a, $t, $in_string, $switch); @@ -48,8 +47,6 @@ sub string_for_lisp { } } -$min_time = shift; - NEXT_RE: while (1) { last if !($_ = <>); @@ -132,8 +129,6 @@ if (\$x =~ ${pattern}) { }; END - $times = 1; - $used = 0; $counter++; print STDERR "$counter\n"; @@ -141,18 +136,9 @@ END $error = 't'; } else { $error = 'nil'; - if ($min_time) { - $times = 10; - while (1) { - $used = &$test($times); - last - if $used > $min_time; - $times *= 10; - } - } } - print "($counter $info_string \"$pattern_for_lisp\" $case_insensitive_mode $multi_line_mode $single_line_mode $extended_mode " . string_for_lisp($x) . " $error $times $used "; + print "($counter $info_string \"$pattern_for_lisp\" $case_insensitive_mode $multi_line_mode $single_line_mode $extended_mode " . string_for_lisp($x) . " $error "; if (!@subs) { print 'nil nil'; } else { diff --git a/testdata b/test/perltestdata similarity index 86% rename from testdata rename to test/perltestdata index 925d0ef..f3ba085 100644 --- a/testdata +++ b/test/perltestdata @@ -1,300 +1,300 @@ -(1 "\"the quick brown fox\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "the quick brown fox" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(2 "\"The quick brown FOX\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "The quick brown FOX" nil 1 0 nil nil) -(3 "\"What do you know about the quick brown fox?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about the quick brown fox?" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(4 "\"What do you know about THE QUICK BROWN FOX?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about THE QUICK BROWN FOX?" nil 1 0 nil nil) -(5 "\"the quick brown fox\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "the quick brown fox" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(6 "\"The quick brown FOX\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "The quick brown FOX" nil 1 0 "The quick brown FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(7 "\"What do you know about the quick brown fox?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about the quick brown fox?" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(8 "\"What do you know about THE QUICK BROWN FOX?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about THE QUICK BROWN FOX?" nil 1 0 "THE QUICK BROWN FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(9 "\"abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\" =~ /abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/" "abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz" nil nil nil nil ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") nil 1 0 ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(10 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil 1 0 "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(11 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil 1 0 "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(12 "\"aabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(13 "\"aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(14 "\"aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(15 "\"abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzpqrrrabbxyyyypqAzz" nil 1 0 "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(16 "\"aabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzpqrrrabbxyyyypqAzz" nil 1 0 "aabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(17 "\"aaabcxyzpqrrrabbxyyyypAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(18 "\"aaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(19 "\"aaabcxyzpqrrrabbxyyyypqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(20 "\"aaabcxyzpqrrrabbxyyyypqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(21 "\"aaabcxyzpqrrrabbxyyyypqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(22 "\"aaabcxyzpqrrrabbxyyyypqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(23 "\"aaabcxyzpqrrrabbxyyyypqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(24 "\"aaaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(25 "\"abxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzzpqrrrabbxyyyypqAzz" nil 1 0 "abxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(26 "\"aabxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzzzpqrrrabbxyyyypqAzz" nil 1 0 "aabxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(27 "\"aaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(28 "\"aaaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(29 "\"abcxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzzpqrrrabbxyyyypqAzz" nil 1 0 "abcxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(30 "\"aabcxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzzzpqrrrabbxyyyypqAzz" nil 1 0 "aabcxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(31 "\"aaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(32 "\"aaaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(33 "\"aaaabcxyzzzzpqrrrabbbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" nil 1 0 "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(34 "\"aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" nil 1 0 "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(35 "\"aaabcxyzpqrrrabbxyyyypABzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypABzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(36 "\"aaabcxyzpqrrrabbxyyyypABBzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABBzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypABBzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(37 "\">>>aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>aaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(38 "\">aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">aaaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(39 "\">>>>abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>>abcxyzpqrrrabbxyyyypqAzz" nil 1 0 "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(40 "\"abxyzpqrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrabbxyyyypqAzz" nil 1 0 nil nil) -(41 "\"abxyzpqrrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrrabbxyyyypqAzz" nil 1 0 nil nil) -(42 "\"abxyzpqrrrabxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabxyyyypqAzz" nil 1 0 nil nil) -(43 "\"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz" nil 1 0 nil nil) -(44 "\"aaaabcxyzzzzpqrrrabbbxyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyypqAzz" nil 1 0 nil nil) -(45 "\"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqqAzz" nil 1 0 nil nil) -(46 "\"abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abczz" nil 1 0 "abczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(47 "\"abcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabczz" nil 1 0 "abcabczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(48 "\"zz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "zz" nil 1 0 nil nil) -(49 "\"abcabcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabcabczz" nil 1 0 nil nil) -(50 "\">>abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil ">>abczz" nil 1 0 nil nil) -(51 "\"bc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bc" nil 1 0 "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(52 "\"bbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbc" nil 1 0 "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(53 "\"bbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbc" nil 1 0 "bbbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(54 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(55 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(56 "\"aac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aac" nil 1 0 "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(57 "\"abbbbbbbbbbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbc" nil 1 0 "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(58 "\"bbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbbbbbbbac" nil 1 0 "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(59 "\"aaac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aaac" nil 1 0 nil nil) -(60 "\"abbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbac" nil 1 0 nil nil) -(61 "\"bc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bc" nil 1 0 "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(62 "\"bbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbc" nil 1 0 "bbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(63 "\"bbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbc" nil 1 0 "bbbc" ("bbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(64 "\"bac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(65 "\"bbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(66 "\"aac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aac" nil 1 0 "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(67 "\"abbbbbbbbbbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbc" nil 1 0 "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(68 "\"bbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbbbbbbbbbac" nil 1 0 "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(69 "\"aaac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aaac" nil 1 0 nil nil) -(70 "\"abbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbac" nil 1 0 nil nil) -(71 "\"bbc\" =~ /^(b+|a){1,2}?bc/" "^(b+|a){1,2}?bc" nil nil nil nil "bbc" nil 1 0 "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(72 "\"babc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babc" nil 1 0 "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(73 "\"bbabc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bbabc" nil 1 0 "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(74 "\"bababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababc" nil 1 0 "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(75 "\"bababbc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababbc" nil 1 0 nil nil) -(76 "\"babababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babababc" nil 1 0 nil nil) -(77 "\"babc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babc" nil 1 0 "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(78 "\"bbabc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bbabc" nil 1 0 "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(79 "\"bababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababc" nil 1 0 "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(80 "\"bababbc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababbc" nil 1 0 nil nil) -(81 "\"babababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babababc" nil 1 0 nil nil) -(82 "\"\\x01\\x01\\e;z\" =~ /^\\ca\\cA\\c[\\c{\\c:/" "^\\ca\\cA\\c[\\c{\\c:" nil nil nil nil ("" 1 1 27 ";z") nil 1 0 ("" 1 1 27 ";z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(83 "\"athing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "athing" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(84 "\"bthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "bthing" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(85 "\"]thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "]thing" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(86 "\"cthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "cthing" nil 1 0 "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(87 "\"dthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "dthing" nil 1 0 "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(88 "\"ething\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "ething" nil 1 0 "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(89 "\"fthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "fthing" nil 1 0 nil nil) -(90 "\"[thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "[thing" nil 1 0 nil nil) -(91 "\"\\\\thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "\\thing" nil 1 0 nil nil) -(92 "\"]thing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "]thing" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(93 "\"cthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "cthing" nil 1 0 "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(94 "\"dthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "dthing" nil 1 0 "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(95 "\"ething\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "ething" nil 1 0 "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(96 "\"athing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "athing" nil 1 0 nil nil) -(97 "\"fthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "fthing" nil 1 0 nil nil) -(98 "\"fthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "fthing" nil 1 0 "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(99 "\"[thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "[thing" nil 1 0 "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(100 "\"\\\\thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "\\thing" nil 1 0 "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(101 "\"athing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "athing" nil 1 0 nil nil) -(102 "\"bthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "bthing" nil 1 0 nil nil) -(103 "\"]thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "]thing" nil 1 0 nil nil) -(104 "\"cthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "cthing" nil 1 0 nil nil) -(105 "\"dthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "dthing" nil 1 0 nil nil) -(106 "\"ething\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "ething" nil 1 0 nil nil) -(107 "\"athing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "athing" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(108 "\"fthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "fthing" nil 1 0 "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(109 "\"]thing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "]thing" nil 1 0 nil nil) -(110 "\"cthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "cthing" nil 1 0 nil nil) -(111 "\"dthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "dthing" nil 1 0 nil nil) -(112 "\"ething\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "ething" nil 1 0 nil nil) -(113 ("\"" 129 "\" =~ /^\\" 129 "/") "^\\" nil nil nil nil ("" 129) nil 1 0 ("" 129) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(114 ("\"" 255 "\" =~ /^" 255 "/") "^ÿ" nil nil nil nil ("" 255) nil 1 0 ("" 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(115 "\"0\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "0" nil 1 0 "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(116 "\"1\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(117 "\"2\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "2" nil 1 0 "2" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(118 "\"3\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "3" nil 1 0 "3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(119 "\"4\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "4" nil 1 0 "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(120 "\"5\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "5" nil 1 0 "5" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(121 "\"6\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "6" nil 1 0 "6" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(122 "\"7\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "7" nil 1 0 "7" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(123 "\"8\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "8" nil 1 0 "8" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(124 "\"9\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "9" nil 1 0 "9" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(125 "\"10\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "10" nil 1 0 "10" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(126 "\"100\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "100" nil 1 0 "100" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(127 "\"abc\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "abc" nil 1 0 nil nil) -(128 "\"enter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "enter" nil 1 0 "enter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(129 "\"inter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "inter" nil 1 0 "inter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(130 "\"uponter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "uponter" nil 1 0 "uponter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(131 "\"xxx0\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx0" nil 1 0 "xxx0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(132 "\"xxx1234\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx1234" nil 1 0 "xxx1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(133 "\"xxx\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx" nil 1 0 nil nil) -(134 "\"x123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x123" nil 1 0 "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(135 "\"xx123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil 1 0 "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(136 "\"123456\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123456" nil 1 0 "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(137 "\"123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123" nil 1 0 nil nil) -(138 "\"x1234\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil 1 0 "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(139 "\"x123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x123" nil 1 0 "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(140 "\"xx123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil 1 0 "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(141 "\"123456\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123456" nil 1 0 "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(142 "\"123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123" nil 1 0 nil nil) -(143 "\"x1234\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil 1 0 "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(144 "\"abc!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.uk" nil 1 0 "abc!pqr=apquxz.ixr.zzz.ac.uk" ("abc" "pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(145 "\"!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "!pqr=apquxz.ixr.zzz.ac.uk" nil 1 0 nil nil) -(146 "\"abc!=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!=apquxz.ixr.zzz.ac.uk" nil 1 0 nil nil) -(147 "\"abc!pqr=apquxz:ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz:ixr.zzz.ac.uk" nil 1 0 nil nil) -(148 "\"abc!pqr=apquxz.ixr.zzz.ac.ukk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.ukk" nil 1 0 nil nil) -(149 "\"Well, we need a colon: somewhere\" =~ /:/" ":" nil nil nil nil "Well, we need a colon: somewhere" nil 1 0 ":" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(150 "\"Fail if we don't\" =~ /:/" ":" nil nil nil nil "Fail if we don't" nil 1 0 nil nil) -(151 "\"0abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0abc" nil 1 0 "0abc" ("0abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(152 "\"abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "abc" nil 1 0 "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(153 "\"fed\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed" nil 1 0 "fed" ("fed" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(154 "\"E\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "E" nil 1 0 "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(155 "\"::\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "::" nil 1 0 "::" ("::" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(156 "\"5f03:12C0::932e\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "5f03:12C0::932e" nil 1 0 "5f03:12C0::932e" ("5f03:12C0::932e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(157 "\"fed def\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed def" nil 1 0 "def" ("def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(158 "\"Any old stuff\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old stuff" nil 1 0 "ff" ("ff" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(159 "\"0zzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0zzz" nil 1 0 nil nil) -(160 "\"gzzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "gzzz" nil 1 0 nil nil) -(161 "\"fed\\x20\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed " nil 1 0 nil nil) -(162 "\"Any old rubbish\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old rubbish" nil 1 0 nil nil) -(163 "\".1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3" nil 1 0 ".1.2.3" ("1" "2" "3" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(164 "\"A.12.123.0\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "A.12.123.0" nil 1 0 "A.12.123.0" ("12" "123" "0" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(165 "\".1.2.3333\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3333" nil 1 0 nil nil) -(166 "\"1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1.2.3" nil 1 0 nil nil) -(167 "\"1234.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1234.2.3" nil 1 0 nil nil) -(168 "\"1 IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2(" nil 1 0 "1 IN SOA non-sp1 non-sp2(" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(169 "\"1 IN SOA non-sp1 non-sp2 (\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2 (" nil 1 0 "1 IN SOA non-sp1 non-sp2 (" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(170 "\"1IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1IN SOA non-sp1 non-sp2(" nil 1 0 nil nil) -(171 "\"a.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "a." nil 1 0 "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(172 "\"Z.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "Z." nil 1 0 "Z." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(173 "\"2.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "2." nil 1 0 "2." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(174 "\"ab-c.pq-r.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "ab-c.pq-r." nil 1 0 "ab-c.pq-r." (".pq-r" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(175 "\"sxk.zzz.ac.uk.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "sxk.zzz.ac.uk." nil 1 0 "sxk.zzz.ac.uk." (".uk" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(176 "\"x-.y-.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "x-.y-." nil 1 0 "x-.y-." (".y-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(177 "\"-abc.peq.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "-abc.peq." nil 1 0 nil nil) -(178 "\"*.a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a" nil 1 0 "*.a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(179 "\"*.b0-a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.b0-a" nil 1 0 "*.b0-a" ("0-a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(180 "\"*.c3-b.c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c3-b.c" nil 1 0 "*.c3-b.c" ("3-b" ".c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(181 "\"*.c-a.b-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.b-c" nil 1 0 "*.c-a.b-c" ("-a" ".b-c" "-c" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(182 "\"*.0\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.0" nil 1 0 nil nil) -(183 "\"*.a-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-" nil 1 0 nil nil) -(184 "\"*.a-b.c-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-b.c-" nil 1 0 nil nil) -(185 "\"*.c-a.0-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.0-c" nil 1 0 nil nil) -(186 "\"abde\" =~ /^(?=ab(de))(abd)(e)/" "^(?=ab(de))(abd)(e)" nil nil nil nil "abde" nil 1 0 "abde" ("de" "abd" "e" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(187 "\"abdf\" =~ /^(?!(ab)de|x)(abd)(f)/" "^(?!(ab)de|x)(abd)(f)" nil nil nil nil "abdf" nil 1 0 "abdf" (nil "abd" "f" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(188 "\"abcd\" =~ /^(?=(ab(cd)))(ab)/" "^(?=(ab(cd)))(ab)" nil nil nil nil "abcd" nil 1 0 "ab" ("abcd" "cd" "ab" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(189 "\"a.b.c.d\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.d" nil 1 0 "a.b.c.d" (".d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(190 "\"A.B.C.D\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "A.B.C.D" nil 1 0 "A.B.C.D" (".D" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(191 "\"a.b.c.1.2.3.C\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.1.2.3.C" nil 1 0 "a.b.c.1.2.3.C" (".C" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(192 "\"\\\"1234\\\"\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\"" nil 1 0 "\"1234\"" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(193 "\"\\\"abcd\\\" ;\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"abcd\" ;" nil 1 0 "\"abcd\" ;" (";" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(194 "\"\\\"\\\" ; rhubarb\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"\" ; rhubarb" nil 1 0 "\"\" ; rhubarb" ("; rhubarb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(195 "\"\\\"1234\\\" : things\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\" : things" nil 1 0 nil nil) -(196 "\"\\\" =~ /^$/" "^$" nil nil nil nil "" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(197 "\"ab c\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab c" nil 1 0 "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(198 "\"abc\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "abc" nil 1 0 nil nil) -(199 "\"ab cde\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab cde" nil 1 0 nil nil) -(200 "\"ab c\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab c" nil 1 0 "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(201 "\"abc\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "abc" nil 1 0 nil nil) -(202 "\"ab cde\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab cde" nil 1 0 nil nil) -(203 "\"a bcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a bcd" nil 1 0 "a bcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(204 "\"a b d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a b d" nil 1 0 "a b d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(205 "\"abcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "abcd" nil 1 0 nil nil) -(206 "\"ab d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "ab d" nil 1 0 nil nil) -(207 "\"abcdefhijklm\" =~ /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/" "^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$" nil nil nil nil "abcdefhijklm" nil 1 0 "abcdefhijklm" ("abc" "bc" "c" "def" "ef" "f" "hij" "ij" "j" "klm" "lm" "m" nil nil nil nil)) -(208 "\"abcdefhijklm\" =~ /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/" "^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$" nil nil nil nil "abcdefhijklm" nil 1 0 "abcdefhijklm" ("bc" "c" "ef" "f" "ij" "j" "lm" "m" nil nil nil nil nil nil nil nil)) -(209 "\"a+ Z0+\\x08\\n\\x1d\\x12\" =~ /^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/" "^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]" nil nil nil nil ("a+ Z0+" 8 10 29 18) nil 1 0 ("a+ Z0+" 8 10 29 18) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(210 "\".^\\$(*+)|{?,?}\" =~ /^[.^$|()*+?{,}]+/" "^[.^$|()*+?{,}]+" nil nil nil nil ".^$(*+)|{?,?}" nil 1 0 ".^$(*+)|{?,?}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(211 "\"z\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "z" nil 1 0 "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(212 "\"az\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "az" nil 1 0 "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(213 "\"aaaz\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaz" nil 1 0 "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(214 "\"a\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(215 "\"aa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(216 "\"aaaa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(217 "\"a+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a+" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(218 "\"aa+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa+" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(219 "\"z\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "z" nil 1 0 "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(220 "\"az\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "az" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(221 "\"aaaz\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaz" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(222 "\"a\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(223 "\"aa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(224 "\"aaaa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaa" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(225 "\"a+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a+" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(226 "\"aa+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa+" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(227 "\"az\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "az" nil 1 0 "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(228 "\"aaaz\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaz" nil 1 0 "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(229 "\"aa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(230 "\"aaaa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(231 "\"aa+\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa+" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(232 "\"az\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "az" nil 1 0 "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(233 "\"aaaz\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaz" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(234 "\"aa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(235 "\"aaaa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(236 "\"aa+\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa+" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(237 "\"1234567890\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567890" nil 1 0 "1234567890" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(238 "\"12345678ab\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678ab" nil 1 0 "12345678ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(239 "\"12345678__\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678__" nil 1 0 "12345678__" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(240 "\"1234567\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567" nil 1 0 nil nil) -(241 "\"uoie\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "uoie" nil 1 0 "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(242 "\"1234\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(243 "\"12345\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "12345" nil 1 0 "12345" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(244 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(245 "\"123456\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "123456" nil 1 0 nil nil) -(246 "\"uoie\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "uoie" nil 1 0 "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(247 "\"1234\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(248 "\"12345\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "12345" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(249 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "aaaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(250 "\"123456\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "123456" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(251 "\"abc=abcabc\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=abcabc" nil 1 0 "abc=abcabc" ("abc" "abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(252 "\"def=defdefdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "def=defdefdef" nil 1 0 "def=defdefdef" ("def" "def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(253 "\"abc=defdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=defdef" nil 1 0 nil nil) -(254 "\"abcdefghijkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkcda2" nil 1 0 "abcdefghijkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil)) -(255 "\"abcdefghijkkkkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkkkkcda2" nil 1 0 "abcdefghijkkkkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil)) -(256 "\"cataract cataract23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "cataract cataract23" nil 1 0 "cataract cataract23" ("cataract" "aract" "ract" "" "3" nil nil nil nil nil nil nil nil nil nil nil)) -(257 "\"catatonic catatonic23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "catatonic catatonic23" nil 1 0 "catatonic catatonic23" ("catatonic" "atonic" "tonic" "" "3" nil nil nil nil nil nil nil nil nil nil nil)) -(258 "\"caterpillar caterpillar23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "caterpillar caterpillar23" nil 1 0 "caterpillar caterpillar23" ("caterpillar" "erpillar" nil "" "3" nil nil nil nil nil nil nil nil nil nil nil)) +(1 "\"the quick brown fox\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "the quick brown fox" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(2 "\"The quick brown FOX\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "The quick brown FOX" nil nil nil) +(3 "\"What do you know about the quick brown fox?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about the quick brown fox?" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(4 "\"What do you know about THE QUICK BROWN FOX?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about THE QUICK BROWN FOX?" nil nil nil) +(5 "\"the quick brown fox\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "the quick brown fox" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(6 "\"The quick brown FOX\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "The quick brown FOX" nil "The quick brown FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(7 "\"What do you know about the quick brown fox?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about the quick brown fox?" nil "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(8 "\"What do you know about THE QUICK BROWN FOX?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about THE QUICK BROWN FOX?" nil "THE QUICK BROWN FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(9 "\"abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\" =~ /abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/" "abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz" nil nil nil nil ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") nil ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(10 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(11 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(12 "\"aabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzpqrrrabbxyyyypqAzz" nil "aabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(13 "\"aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzpqrrrabbxyyyypqAzz" nil "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(14 "\"aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzpqrrrabbxyyyypqAzz" nil "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(15 "\"abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzpqrrrabbxyyyypqAzz" nil "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(16 "\"aabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzpqrrrabbxyyyypqAzz" nil "aabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(17 "\"aaabcxyzpqrrrabbxyyyypAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypAzz" nil "aaabcxyzpqrrrabbxyyyypAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(18 "\"aaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqAzz" nil "aaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(19 "\"aaabcxyzpqrrrabbxyyyypqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(20 "\"aaabcxyzpqrrrabbxyyyypqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(21 "\"aaabcxyzpqrrrabbxyyyypqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(22 "\"aaabcxyzpqrrrabbxyyyypqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(23 "\"aaabcxyzpqrrrabbxyyyypqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" nil "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(24 "\"aaaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzpqrrrabbxyyyypqAzz" nil "aaaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(25 "\"abxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzzpqrrrabbxyyyypqAzz" nil "abxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(26 "\"aabxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzzzpqrrrabbxyyyypqAzz" nil "aabxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(27 "\"aaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzzzzpqrrrabbxyyyypqAzz" nil "aaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(28 "\"aaaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzzzzpqrrrabbxyyyypqAzz" nil "aaaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(29 "\"abcxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzzpqrrrabbxyyyypqAzz" nil "abcxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(30 "\"aabcxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzzzpqrrrabbxyyyypqAzz" nil "aabcxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(31 "\"aaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzzzzpqrrrabbxyyyypqAzz" nil "aaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(32 "\"aaaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbxyyyypqAzz" nil "aaaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(33 "\"aaaabcxyzzzzpqrrrabbbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" nil "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(34 "\"aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" nil "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(35 "\"aaabcxyzpqrrrabbxyyyypABzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABzz" nil "aaabcxyzpqrrrabbxyyyypABzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(36 "\"aaabcxyzpqrrrabbxyyyypABBzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABBzz" nil "aaabcxyzpqrrrabbxyyyypABBzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(37 "\">>>aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>aaabxyzpqrrrabbxyyyypqAzz" nil "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(38 "\">aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">aaaabxyzpqrrrabbxyyyypqAzz" nil "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(39 "\">>>>abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>>abcxyzpqrrrabbxyyyypqAzz" nil "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(40 "\"abxyzpqrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrabbxyyyypqAzz" nil nil nil) +(41 "\"abxyzpqrrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrrabbxyyyypqAzz" nil nil nil) +(42 "\"abxyzpqrrrabxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabxyyyypqAzz" nil nil nil) +(43 "\"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz" nil nil nil) +(44 "\"aaaabcxyzzzzpqrrrabbbxyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyypqAzz" nil nil nil) +(45 "\"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqqAzz" nil nil nil) +(46 "\"abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abczz" nil "abczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(47 "\"abcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabczz" nil "abcabczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(48 "\"zz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "zz" nil nil nil) +(49 "\"abcabcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabcabczz" nil nil nil) +(50 "\">>abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil ">>abczz" nil nil nil) +(51 "\"bc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bc" nil "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(52 "\"bbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbc" nil "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(53 "\"bbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbc" nil "bbbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(54 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(55 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(56 "\"aac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aac" nil "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(57 "\"abbbbbbbbbbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbc" nil "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(58 "\"bbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbbbbbbbac" nil "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(59 "\"aaac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aaac" nil nil nil) +(60 "\"abbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbac" nil nil nil) +(61 "\"bc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bc" nil "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(62 "\"bbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbc" nil "bbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(63 "\"bbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbc" nil "bbbc" ("bbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(64 "\"bac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(65 "\"bbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(66 "\"aac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aac" nil "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(67 "\"abbbbbbbbbbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbc" nil "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(68 "\"bbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbbbbbbbbbac" nil "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(69 "\"aaac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aaac" nil nil nil) +(70 "\"abbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbac" nil nil nil) +(71 "\"bbc\" =~ /^(b+|a){1,2}?bc/" "^(b+|a){1,2}?bc" nil nil nil nil "bbc" nil "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(72 "\"babc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babc" nil "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(73 "\"bbabc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bbabc" nil "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(74 "\"bababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababc" nil "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(75 "\"bababbc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababbc" nil nil nil) +(76 "\"babababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babababc" nil nil nil) +(77 "\"babc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babc" nil "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(78 "\"bbabc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bbabc" nil "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(79 "\"bababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababc" nil "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(80 "\"bababbc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababbc" nil nil nil) +(81 "\"babababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babababc" nil nil nil) +(82 "\"\\x01\\x01\\e;z\" =~ /^\\ca\\cA\\c[\\c{\\c:/" "^\\ca\\cA\\c[\\c{\\c:" nil nil nil nil ("" 1 1 27 ";z") nil ("" 1 1 27 ";z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(83 "\"athing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "athing" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(84 "\"bthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "bthing" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(85 "\"]thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "]thing" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(86 "\"cthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "cthing" nil "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(87 "\"dthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "dthing" nil "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(88 "\"ething\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "ething" nil "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(89 "\"fthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "fthing" nil nil nil) +(90 "\"[thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "[thing" nil nil nil) +(91 "\"\\\\thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "\\thing" nil nil nil) +(92 "\"]thing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "]thing" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(93 "\"cthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "cthing" nil "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(94 "\"dthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "dthing" nil "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(95 "\"ething\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "ething" nil "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(96 "\"athing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "athing" nil nil nil) +(97 "\"fthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "fthing" nil nil nil) +(98 "\"fthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "fthing" nil "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(99 "\"[thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "[thing" nil "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(100 "\"\\\\thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "\\thing" nil "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(101 "\"athing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "athing" nil nil nil) +(102 "\"bthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "bthing" nil nil nil) +(103 "\"]thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "]thing" nil nil nil) +(104 "\"cthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "cthing" nil nil nil) +(105 "\"dthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "dthing" nil nil nil) +(106 "\"ething\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "ething" nil nil nil) +(107 "\"athing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "athing" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(108 "\"fthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "fthing" nil "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(109 "\"]thing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "]thing" nil nil nil) +(110 "\"cthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "cthing" nil nil nil) +(111 "\"dthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "dthing" nil nil nil) +(112 "\"ething\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "ething" nil nil nil) +(113 ("\"" 129 "\" =~ /^\\" 129 "/") "^\\" nil nil nil nil ("" 129) nil ("" 129) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(114 ("\"" 255 "\" =~ /^" 255 "/") "^ÿ" nil nil nil nil ("" 255) nil ("" 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(115 "\"0\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "0" nil "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(116 "\"1\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "1" nil "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(117 "\"2\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "2" nil "2" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(118 "\"3\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "3" nil "3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(119 "\"4\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "4" nil "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(120 "\"5\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "5" nil "5" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(121 "\"6\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "6" nil "6" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(122 "\"7\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "7" nil "7" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(123 "\"8\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "8" nil "8" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(124 "\"9\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "9" nil "9" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(125 "\"10\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "10" nil "10" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(126 "\"100\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "100" nil "100" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(127 "\"abc\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "abc" nil nil nil) +(128 "\"enter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "enter" nil "enter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(129 "\"inter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "inter" nil "inter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(130 "\"uponter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "uponter" nil "uponter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(131 "\"xxx0\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx0" nil "xxx0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(132 "\"xxx1234\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx1234" nil "xxx1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(133 "\"xxx\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx" nil nil nil) +(134 "\"x123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x123" nil "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(135 "\"xx123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(136 "\"123456\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123456" nil "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(137 "\"123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123" nil nil nil) +(138 "\"x1234\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(139 "\"x123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x123" nil "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(140 "\"xx123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(141 "\"123456\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123456" nil "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(142 "\"123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123" nil nil nil) +(143 "\"x1234\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(144 "\"abc!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.uk" nil "abc!pqr=apquxz.ixr.zzz.ac.uk" ("abc" "pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(145 "\"!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "!pqr=apquxz.ixr.zzz.ac.uk" nil nil nil) +(146 "\"abc!=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!=apquxz.ixr.zzz.ac.uk" nil nil nil) +(147 "\"abc!pqr=apquxz:ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz:ixr.zzz.ac.uk" nil nil nil) +(148 "\"abc!pqr=apquxz.ixr.zzz.ac.ukk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.ukk" nil nil nil) +(149 "\"Well, we need a colon: somewhere\" =~ /:/" ":" nil nil nil nil "Well, we need a colon: somewhere" nil ":" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(150 "\"Fail if we don't\" =~ /:/" ":" nil nil nil nil "Fail if we don't" nil nil nil) +(151 "\"0abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0abc" nil "0abc" ("0abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(152 "\"abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "abc" nil "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(153 "\"fed\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed" nil "fed" ("fed" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(154 "\"E\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "E" nil "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(155 "\"::\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "::" nil "::" ("::" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(156 "\"5f03:12C0::932e\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "5f03:12C0::932e" nil "5f03:12C0::932e" ("5f03:12C0::932e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(157 "\"fed def\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed def" nil "def" ("def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(158 "\"Any old stuff\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old stuff" nil "ff" ("ff" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(159 "\"0zzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0zzz" nil nil nil) +(160 "\"gzzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "gzzz" nil nil nil) +(161 "\"fed\\x20\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed " nil nil nil) +(162 "\"Any old rubbish\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old rubbish" nil nil nil) +(163 "\".1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3" nil ".1.2.3" ("1" "2" "3" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(164 "\"A.12.123.0\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "A.12.123.0" nil "A.12.123.0" ("12" "123" "0" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(165 "\".1.2.3333\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3333" nil nil nil) +(166 "\"1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1.2.3" nil nil nil) +(167 "\"1234.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1234.2.3" nil nil nil) +(168 "\"1 IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2(" nil "1 IN SOA non-sp1 non-sp2(" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(169 "\"1 IN SOA non-sp1 non-sp2 (\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2 (" nil "1 IN SOA non-sp1 non-sp2 (" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(170 "\"1IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1IN SOA non-sp1 non-sp2(" nil nil nil) +(171 "\"a.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "a." nil "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(172 "\"Z.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "Z." nil "Z." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(173 "\"2.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "2." nil "2." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(174 "\"ab-c.pq-r.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "ab-c.pq-r." nil "ab-c.pq-r." (".pq-r" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(175 "\"sxk.zzz.ac.uk.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "sxk.zzz.ac.uk." nil "sxk.zzz.ac.uk." (".uk" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(176 "\"x-.y-.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "x-.y-." nil "x-.y-." (".y-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(177 "\"-abc.peq.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "-abc.peq." nil nil nil) +(178 "\"*.a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a" nil "*.a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(179 "\"*.b0-a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.b0-a" nil "*.b0-a" ("0-a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(180 "\"*.c3-b.c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c3-b.c" nil "*.c3-b.c" ("3-b" ".c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(181 "\"*.c-a.b-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.b-c" nil "*.c-a.b-c" ("-a" ".b-c" "-c" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(182 "\"*.0\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.0" nil nil nil) +(183 "\"*.a-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-" nil nil nil) +(184 "\"*.a-b.c-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-b.c-" nil nil nil) +(185 "\"*.c-a.0-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.0-c" nil nil nil) +(186 "\"abde\" =~ /^(?=ab(de))(abd)(e)/" "^(?=ab(de))(abd)(e)" nil nil nil nil "abde" nil "abde" ("de" "abd" "e" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(187 "\"abdf\" =~ /^(?!(ab)de|x)(abd)(f)/" "^(?!(ab)de|x)(abd)(f)" nil nil nil nil "abdf" nil "abdf" (nil "abd" "f" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(188 "\"abcd\" =~ /^(?=(ab(cd)))(ab)/" "^(?=(ab(cd)))(ab)" nil nil nil nil "abcd" nil "ab" ("abcd" "cd" "ab" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(189 "\"a.b.c.d\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.d" nil "a.b.c.d" (".d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(190 "\"A.B.C.D\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "A.B.C.D" nil "A.B.C.D" (".D" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(191 "\"a.b.c.1.2.3.C\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.1.2.3.C" nil "a.b.c.1.2.3.C" (".C" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(192 "\"\\\"1234\\\"\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\"" nil "\"1234\"" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(193 "\"\\\"abcd\\\" ;\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"abcd\" ;" nil "\"abcd\" ;" (";" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(194 "\"\\\"\\\" ; rhubarb\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"\" ; rhubarb" nil "\"\" ; rhubarb" ("; rhubarb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(195 "\"\\\"1234\\\" : things\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\" : things" nil nil nil) +(196 "\"\\\" =~ /^$/" "^$" nil nil nil nil "" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(197 "\"ab c\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab c" nil "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(198 "\"abc\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "abc" nil nil nil) +(199 "\"ab cde\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab cde" nil nil nil) +(200 "\"ab c\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab c" nil "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(201 "\"abc\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "abc" nil nil nil) +(202 "\"ab cde\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab cde" nil nil nil) +(203 "\"a bcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a bcd" nil "a bcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(204 "\"a b d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a b d" nil "a b d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(205 "\"abcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "abcd" nil nil nil) +(206 "\"ab d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "ab d" nil nil nil) +(207 "\"abcdefhijklm\" =~ /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/" "^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$" nil nil nil nil "abcdefhijklm" nil "abcdefhijklm" ("abc" "bc" "c" "def" "ef" "f" "hij" "ij" "j" "klm" "lm" "m" nil nil nil nil)) +(208 "\"abcdefhijklm\" =~ /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/" "^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$" nil nil nil nil "abcdefhijklm" nil "abcdefhijklm" ("bc" "c" "ef" "f" "ij" "j" "lm" "m" nil nil nil nil nil nil nil nil)) +(209 "\"a+ Z0+\\x08\\n\\x1d\\x12\" =~ /^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/" "^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]" nil nil nil nil ("a+ Z0+" 8 10 29 18) nil ("a+ Z0+" 8 10 29 18) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(210 "\".^\\$(*+)|{?,?}\" =~ /^[.^$|()*+?{,}]+/" "^[.^$|()*+?{,}]+" nil nil nil nil ".^$(*+)|{?,?}" nil ".^$(*+)|{?,?}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(211 "\"z\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "z" nil "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(212 "\"az\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "az" nil "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(213 "\"aaaz\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaz" nil "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(214 "\"a\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(215 "\"aa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(216 "\"aaaa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(217 "\"a+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a+" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(218 "\"aa+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa+" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(219 "\"z\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "z" nil "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(220 "\"az\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "az" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(221 "\"aaaz\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaz" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(222 "\"a\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(223 "\"aa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(224 "\"aaaa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaa" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(225 "\"a+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a+" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(226 "\"aa+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa+" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(227 "\"az\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "az" nil "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(228 "\"aaaz\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaz" nil "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(229 "\"aa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(230 "\"aaaa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(231 "\"aa+\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa+" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(232 "\"az\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "az" nil "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(233 "\"aaaz\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaz" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(234 "\"aa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(235 "\"aaaa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(236 "\"aa+\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa+" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(237 "\"1234567890\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567890" nil "1234567890" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(238 "\"12345678ab\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678ab" nil "12345678ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(239 "\"12345678__\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678__" nil "12345678__" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(240 "\"1234567\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567" nil nil nil) +(241 "\"uoie\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "uoie" nil "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(242 "\"1234\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(243 "\"12345\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "12345" nil "12345" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(244 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "aaaaa" nil "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(245 "\"123456\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "123456" nil nil nil) +(246 "\"uoie\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "uoie" nil "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(247 "\"1234\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(248 "\"12345\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "12345" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(249 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "aaaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(250 "\"123456\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "123456" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(251 "\"abc=abcabc\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=abcabc" nil "abc=abcabc" ("abc" "abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(252 "\"def=defdefdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "def=defdefdef" nil "def=defdefdef" ("def" "def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(253 "\"abc=defdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=defdef" nil nil nil) +(254 "\"abcdefghijkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkcda2" nil "abcdefghijkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil)) +(255 "\"abcdefghijkkkkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkkkkcda2" nil "abcdefghijkkkkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil)) +(256 "\"cataract cataract23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "cataract cataract23" nil "cataract cataract23" ("cataract" "aract" "ract" "" "3" nil nil nil nil nil nil nil nil nil nil nil)) +(257 "\"catatonic catatonic23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "catatonic catatonic23" nil "catatonic catatonic23" ("catatonic" "atonic" "tonic" "" "3" nil nil nil nil nil nil nil nil nil nil nil)) +(258 "\"caterpillar caterpillar23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "caterpillar caterpillar23" nil "caterpillar caterpillar23" ("caterpillar" "erpillar" nil "" "3" nil nil nil nil nil nil nil nil nil nil nil)) (259 "\"From abcd Mon Sep 01 12:33:02 1997\" =~ -/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/" "^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil 1 0 "From abcd Mon Sep 01 12:33" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(260 "\"From abcd Mon Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil 1 0 "From abcd Mon Sep 01 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(261 "\"From abcd Mon Sep 1 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 1 12:33:02 1997" nil 1 0 "From abcd Mon Sep 1 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(262 "\"From abcd Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Sep 01 12:33:02 1997" nil 1 0 nil nil) +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/" "^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil "From abcd Mon Sep 01 12:33" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(260 "\"From abcd Mon Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil "From abcd Mon Sep 01 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(261 "\"From abcd Mon Sep 1 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 1 12:33:02 1997" nil "From abcd Mon Sep 1 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(262 "\"From abcd Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Sep 01 12:33:02 1997" nil nil nil) (263 "\"12\\n34\" =~ /^12.34/s" "^12.34" nil nil t nil "12 -34" nil 1 0 "12 +34" nil "12 34" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(264 "\"12\\r34\" =~ /^12.34/s" "^12.34" nil nil t nil ("12" 13 "34") nil 1 0 ("12" 13 "34") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(265 "\"the quick brown\\t fox\" =~ /\\w+(?=\\t)/" "\\w+(?=\\t)" nil nil nil nil ("the quick brown" 9 " fox") nil 1 0 "brown" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(266 "\"foobar is foolish see?\" =~ /foo(?!bar)(.*)/" "foo(?!bar)(.*)" nil nil nil nil "foobar is foolish see?" nil 1 0 "foolish see?" ("lish see?" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(267 "\"foobar crowbar etc\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "foobar crowbar etc" nil 1 0 "rowbar etc" (" etc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(268 "\"barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "barrel" nil 1 0 "barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(269 "\"2barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "2barrel" nil 1 0 "2barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(270 "\"A barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "A barrel" nil 1 0 "A barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(271 "\"abc456\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc456" nil 1 0 "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(272 "\"abc123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc123" nil 1 0 nil nil) +(264 "\"12\\r34\" =~ /^12.34/s" "^12.34" nil nil t nil ("12" 13 "34") nil ("12" 13 "34") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(265 "\"the quick brown\\t fox\" =~ /\\w+(?=\\t)/" "\\w+(?=\\t)" nil nil nil nil ("the quick brown" 9 " fox") nil "brown" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(266 "\"foobar is foolish see?\" =~ /foo(?!bar)(.*)/" "foo(?!bar)(.*)" nil nil nil nil "foobar is foolish see?" nil "foolish see?" ("lish see?" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(267 "\"foobar crowbar etc\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "foobar crowbar etc" nil "rowbar etc" (" etc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(268 "\"barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "barrel" nil "barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(269 "\"2barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "2barrel" nil "2barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(270 "\"A barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "A barrel" nil "A barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(271 "\"abc456\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc456" nil "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(272 "\"abc123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc123" nil nil nil) (273 "\"1234\" =~ /^1234(?# test newlines inside)/" "^1234(?# test newlines - inside)" nil nil nil nil "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) + inside)" nil nil nil nil "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (274 "\"1234\" =~ /^1234 #comment in extended re /x" "^1234 #comment in extended re - " nil nil nil t "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) + " nil nil nil t "1234" nil "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (275 "\"abcd\" =~ /#rhubarb abcd/x" "#rhubarb - abcd" nil nil nil t "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(276 "\"abcd\" =~ /^abcd#rhubarb/x" "^abcd#rhubarb" nil nil nil t "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(277 "\"aaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaab" nil 1 0 "aaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(278 "\"aaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(279 "\"aaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaab" nil 1 0 "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(280 "\"aaaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaaab" nil 1 0 "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(281 "\"the abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "the abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(282 "\"abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "abc" nil 1 0 nil nil) -(283 "\"abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(284 "\"the abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "the abc" nil 1 0 nil nil) -(285 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*|b)/" "^[ab]{1,3}(ab*|b)" nil nil nil nil "aabbbbb" nil 1 0 "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(286 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*|b)/" "^[ab]{1,3}?(ab*|b)" nil nil nil nil "aabbbbb" nil 1 0 "aabbbbb" ("abbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(287 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*?|b)/" "^[ab]{1,3}?(ab*?|b)" nil nil nil nil "aabbbbb" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(288 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*?|b)/" "^[ab]{1,3}(ab*?|b)" nil nil nil nil "aabbbbb" nil 1 0 "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) + abcd" nil nil nil t "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(276 "\"abcd\" =~ /^abcd#rhubarb/x" "^abcd#rhubarb" nil nil nil t "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(277 "\"aaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaab" nil "aaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(278 "\"aaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaab" nil "aaaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(279 "\"aaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaab" nil "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(280 "\"aaaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaaab" nil "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(281 "\"the abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "the abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(282 "\"abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "abc" nil nil nil) +(283 "\"abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(284 "\"the abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "the abc" nil nil nil) +(285 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*|b)/" "^[ab]{1,3}(ab*|b)" nil nil nil nil "aabbbbb" nil "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(286 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*|b)/" "^[ab]{1,3}?(ab*|b)" nil nil nil nil "aabbbbb" nil "aabbbbb" ("abbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(287 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*?|b)/" "^[ab]{1,3}?(ab*?|b)" nil nil nil nil "aabbbbb" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(288 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*?|b)/" "^[ab]{1,3}(ab*?|b)" nil nil nil nil "aabbbbb" nil "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (289 "\"Alan Other \" =~ / (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional leading comment @@ -681,7 +681,7 @@ ) (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional trailing comment -" nil nil nil t "Alan Other " nil 1 0 "Alan Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "Alan Other " nil "Alan Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (290 "\"\" =~ / (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional leading comment @@ -1068,7 +1068,7 @@ ) (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional trailing comment -" nil nil nil t "" nil 1 0 "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (291 "\"user\\@dom.ain\" =~ / (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional leading comment @@ -1455,7 +1455,7 @@ ) (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional trailing comment -" nil nil nil t "user@dom.ain" nil 1 0 "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "user@dom.ain" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (292 "\"\\\"A. Other\\\" (a comment)\" =~ / (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional leading comment @@ -1842,7 +1842,7 @@ ) (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional trailing comment -" nil nil nil t "\"A. Other\" (a comment)" nil 1 0 "\"A. Other\" (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "\"A. Other\" (a comment)" nil "\"A. Other\" (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (293 "\"A. Other (a comment)\" =~ / (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional leading comment @@ -2229,7 +2229,7 @@ ) (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional trailing comment -" nil nil nil t "A. Other (a comment)" nil 1 0 " Other (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "A. Other (a comment)" nil " Other (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (294 "\"\\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\" =~ / (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional leading comment @@ -2616,7 +2616,7 @@ ) (?: [\\040\\t] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* \\) )* # optional trailing comment -" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil 1 0 "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (295 "\"A missing angle \" =~ /[\\040\\t]* # Nab whitespace. (?: \\( # ( @@ -4553,7 +4553,7 @@ > # > # name and address ) -" nil nil nil t "Alan Other " nil 1 0 "Alan Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "Alan Other " nil "Alan Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (298 "\"\" =~ /[\\040\\t]* # Nab whitespace. (?: \\( # ( @@ -5716,7 +5716,7 @@ > # > # name and address ) -" nil nil nil t "" nil 1 0 "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (299 "\"user\\@dom.ain\" =~ /[\\040\\t]* # Nab whitespace. (?: \\( # ( @@ -6879,7 +6879,7 @@ > # > # name and address ) -" nil nil nil t "user@dom.ain" nil 1 0 "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "user@dom.ain" nil "user@dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (300 "\"\\\"A. Other\\\" (a comment)\" =~ /[\\040\\t]* # Nab whitespace. (?: \\( # ( @@ -8042,7 +8042,7 @@ > # > # name and address ) -" nil nil nil t "\"A. Other\" (a comment)" nil 1 0 "\"A. Other\" " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "\"A. Other\" (a comment)" nil "\"A. Other\" " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (301 "\"A. Other (a comment)\" =~ /[\\040\\t]* # Nab whitespace. (?: \\( # ( @@ -9205,7 +9205,7 @@ > # > # name and address ) -" nil nil nil t "A. Other (a comment)" nil 1 0 " Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "A. Other (a comment)" nil " Other " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (302 "\"\\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\" =~ /[\\040\\t]* # Nab whitespace. (?: \\( # ( @@ -10368,7 +10368,7 @@ > # > # name and address ) -" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil 1 0 "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (303 "\"A missing angle # > # name and address ) -" nil nil nil t "A missing angle # > # name and address ) -" nil nil nil t "The quick brown fox" nil 1 0 nil nil) -(305 "\"abc\\0def\\00pqr\\000xyz\\0000AB\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") nil 1 0 ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(306 "\"abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc456 abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0ABCDE") nil 1 0 ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(307 "\"abc\\x0def\\x00pqr\\x000xyz\\x0000AB\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") nil 1 0 ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(308 "\"abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc456 abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00ABCDE") nil 1 0 ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(309 "\"\\0A\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 0 "A") nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(310 "\"\\01B\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 1 "B") nil 1 0 ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(311 "\"\\037C\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 31 "C") nil 1 0 ("" 31) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(312 "\"\\0\\0\\0\\0\" =~ /\\0*/" "\\0*" nil nil nil nil ("" 0 0 0 0) nil 1 0 ("" 0 0 0 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(313 "\"The A\\x0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("The A" 0 0 "Z") nil 1 0 ("A" 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(314 "\"An A\\0\\x0\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("An A" 0 0 0 "Z") nil 1 0 ("A" 0 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(315 "\"A\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 "Z") nil 1 0 nil nil) -(316 "\"A\\0\\x0\\0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 0 0 0 "Z") nil 1 0 nil nil) -(317 "\"cowcowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowcowbell" nil 1 0 "cowcowbell" ("cow" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(318 "\"bell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "bell" nil 1 0 "bell" ("" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(319 "\"cowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowbell" nil 1 0 nil nil) -(320 "\"\\040abc\" =~ /^\\s/" "^\\s" nil nil nil nil " abc" nil 1 0 " " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(321 "\"\\x0cabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 12 "abc") nil 1 0 ("" 12) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil nil nil t "The quick brown fox" nil nil nil) +(305 "\"abc\\0def\\00pqr\\000xyz\\0000AB\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(306 "\"abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc456 abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0ABCDE") nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(307 "\"abc\\x0def\\x00pqr\\x000xyz\\x0000AB\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(308 "\"abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc456 abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00ABCDE") nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(309 "\"\\0A\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 0 "A") nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(310 "\"\\01B\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 1 "B") nil ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(311 "\"\\037C\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 31 "C") nil ("" 31) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(312 "\"\\0\\0\\0\\0\" =~ /\\0*/" "\\0*" nil nil nil nil ("" 0 0 0 0) nil ("" 0 0 0 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(313 "\"The A\\x0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("The A" 0 0 "Z") nil ("A" 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(314 "\"An A\\0\\x0\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("An A" 0 0 0 "Z") nil ("A" 0 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(315 "\"A\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 "Z") nil nil nil) +(316 "\"A\\0\\x0\\0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 0 0 0 "Z") nil nil nil) +(317 "\"cowcowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowcowbell" nil "cowcowbell" ("cow" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(318 "\"bell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "bell" nil "bell" ("" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(319 "\"cowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowbell" nil nil nil) +(320 "\"\\040abc\" =~ /^\\s/" "^\\s" nil nil nil nil " abc" nil " " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(321 "\"\\x0cabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 12 "abc") nil ("" 12) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (322 "\"\\nabc\" =~ /^\\s/" "^\\s" nil nil nil nil " -abc" nil 1 0 " +abc" nil " " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(323 "\"\\rabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 13 "abc") nil 1 0 ("" 13) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(324 "\"\\tabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 9 "abc") nil 1 0 ("" 9) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(325 "\"abc\" =~ /^\\s/" "^\\s" nil nil nil nil "abc" nil 1 0 nil nil) +(323 "\"\\rabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 13 "abc") nil ("" 13) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(324 "\"\\tabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 9 "abc") nil ("" 9) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(325 "\"abc\" =~ /^\\s/" "^\\s" nil nil nil nil "abc" nil nil nil) (326 ("\"abc\" =~ /^a" 9 "b" 10 " " 13 " " 12 " c/x") "^a b - c" nil nil nil t "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(327 "\"ab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(328 "\"aaaab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(329 "\"b\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(330 "\"acb\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "acb" nil 1 0 nil nil) -(331 "\"aab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aab" nil 1 0 "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(332 "\"aaaab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(333 "\"b\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(334 "\"ab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "ab" nil 1 0 nil nil) -(335 "\"ab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(336 "\"aab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "aab" nil 1 0 "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(337 "\"b\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(338 "\"acb\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "acb" nil 1 0 nil nil) -(339 "\"aaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaab" nil 1 0 "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(340 "\"b\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(341 "\"ab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "ab" nil 1 0 nil nil) -(342 "\"aab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aab" nil 1 0 nil nil) -(343 "\"aaaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaaab" nil 1 0 nil nil) -(344 "\"aaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaab" nil 1 0 "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(345 "\"aaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(346 "\"b\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(347 "\"ab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "ab" nil 1 0 nil nil) -(348 "\"aab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aab" nil 1 0 nil nil) -(349 "\"aaaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaaab" nil 1 0 nil nil) -(350 "\"abbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(351 "\"abbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbc" nil 1 0 "abbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(352 "\"abbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbc" nil 1 0 "abbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(353 "\"abc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abc" nil 1 0 nil nil) -(354 "\"abbbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbbc" nil 1 0 nil nil) -(355 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/" "([^.]*)\\.([^:]*):[T ]+(.*)" nil nil nil nil "track1.title:TBlah blah blah" nil 1 0 "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(356 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/i" "([^.]*)\\.([^:]*):[T ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil 1 0 "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(357 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[t ]+(.*)/i" "([^.]*)\\.([^:]*):[t ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil 1 0 "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(358 "\"WXY_^abc\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "WXY_^abc" nil 1 0 "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(359 "\"wxy\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "wxy" nil 1 0 nil nil) -(360 "\"WXY_^abc\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "WXY_^abc" nil 1 0 "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(361 "\"wxy_^ABC\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "wxy_^ABC" nil 1 0 "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(362 "\"WXY_^abc\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "WXY_^abc" nil 1 0 "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(363 "\"wxy_^ABC\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "wxy_^ABC" nil 1 0 "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(364 "\"abc\" =~ /^abc$/m" "^abc$" nil t nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) + c" nil nil nil t "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(327 "\"ab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "ab" nil "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(328 "\"aaaab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "aaaab" nil "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(329 "\"b\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(330 "\"acb\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "acb" nil nil nil) +(331 "\"aab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aab" nil "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(332 "\"aaaab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aaaab" nil "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(333 "\"b\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(334 "\"ab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "ab" nil nil nil) +(335 "\"ab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "ab" nil "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(336 "\"aab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "aab" nil "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(337 "\"b\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(338 "\"acb\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "acb" nil nil nil) +(339 "\"aaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaab" nil "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(340 "\"b\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(341 "\"ab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "ab" nil nil nil) +(342 "\"aab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aab" nil nil nil) +(343 "\"aaaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaaab" nil nil nil) +(344 "\"aaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaab" nil "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(345 "\"aaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaab" nil "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(346 "\"b\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(347 "\"ab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "ab" nil nil nil) +(348 "\"aab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aab" nil nil nil) +(349 "\"aaaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaaab" nil nil nil) +(350 "\"abbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbc" nil "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(351 "\"abbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbc" nil "abbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(352 "\"abbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbc" nil "abbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(353 "\"abc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abc" nil nil nil) +(354 "\"abbbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbbc" nil nil nil) +(355 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/" "([^.]*)\\.([^:]*):[T ]+(.*)" nil nil nil nil "track1.title:TBlah blah blah" nil "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(356 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/i" "([^.]*)\\.([^:]*):[T ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(357 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[t ]+(.*)/i" "([^.]*)\\.([^:]*):[t ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(358 "\"WXY_^abc\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "WXY_^abc" nil "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(359 "\"wxy\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "wxy" nil nil nil) +(360 "\"WXY_^abc\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "WXY_^abc" nil "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(361 "\"wxy_^ABC\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "wxy_^ABC" nil "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(362 "\"WXY_^abc\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "WXY_^abc" nil "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(363 "\"wxy_^ABC\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "wxy_^ABC" nil "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(364 "\"abc\" =~ /^abc$/m" "^abc$" nil t nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (365 "\"qqq\\nabc\" =~ /^abc$/m" "^abc$" nil t nil nil "qqq -abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (366 "\"abc\\nzzz\" =~ /^abc$/m" "^abc$" nil t nil nil "abc -zzz" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +zzz" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (367 "\"qqq\\nabc\\nzzz\" =~ /^abc$/m" "^abc$" nil t nil nil "qqq abc -zzz" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(368 "\"abc\" =~ /^abc$/" "^abc$" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +zzz" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(368 "\"abc\" =~ /^abc$/" "^abc$" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (369 "\"qqq\\nabc\" =~ /^abc$/" "^abc$" nil nil nil nil "qqq -abc" nil 1 0 nil nil) +abc" nil nil nil) (370 "\"abc\\nzzz\" =~ /^abc$/" "^abc$" nil nil nil nil "abc -zzz" nil 1 0 nil nil) +zzz" nil nil nil) (371 "\"qqq\\nabc\\nzzz\" =~ /^abc$/" "^abc$" nil nil nil nil "qqq abc -zzz" nil 1 0 nil nil) -(372 "\"abc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +zzz" nil nil nil) +(372 "\"abc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (373 "\"abc\\n\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc -" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (374 "\"qqq\\nabc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq -abc" nil 1 0 nil nil) +abc" nil nil nil) (375 "\"abc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc -zzz" nil 1 0 nil nil) +zzz" nil nil nil) (376 "\"qqq\\nabc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq abc -zzz" nil 1 0 nil nil) +zzz" nil nil nil) (377 "\"abc\\ndef\" =~ /\\A(.)*\\Z/s" "\\A(.)*\\Z" nil nil t nil "abc -def" nil 1 0 "abc +def" nil "abc def" ("f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (378 "\"abc\\ndef\" =~ /\\A(.)*\\Z/m" "\\A(.)*\\Z" nil t nil nil "abc -def" nil 1 0 nil nil) -(379 "\"b::c\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "b::c" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(380 "\"c::b\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "c::b" nil 1 0 "::" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(381 "\"az-\" =~ /[-az]+/" "[-az]+" nil nil nil nil "az-" nil 1 0 "az-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(382 "\"b\" =~ /[-az]+/" "[-az]+" nil nil nil nil "b" nil 1 0 nil nil) -(383 "\"za-\" =~ /[az-]+/" "[az-]+" nil nil nil nil "za-" nil 1 0 "za-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(384 "\"b\" =~ /[az-]+/" "[az-]+" nil nil nil nil "b" nil 1 0 nil nil) -(385 "\"a-z\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "a-z" nil 1 0 "a-z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(386 "\"b\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "b" nil 1 0 nil nil) -(387 "\"abcdxyz\" =~ /[a-z]+/" "[a-z]+" nil nil nil nil "abcdxyz" nil 1 0 "abcdxyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(388 "\"12-34\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "12-34" nil 1 0 "12-34" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(389 "\"aaa\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "aaa" nil 1 0 nil nil) -(390 "\"12-34z\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "12-34z" nil 1 0 "12-34z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(391 "\"aaa\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "aaa" nil 1 0 nil nil) -(392 "\"\\\\\" =~ /\\x5c/" "\\x5c" nil nil nil nil "\\" nil 1 0 "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(393 "\"the Zoo\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "the Zoo" nil 1 0 " Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(394 "\"Zulu\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "Zulu" nil 1 0 nil nil) -(395 "\"abcabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcabc" nil 1 0 "abcabc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(396 "\"ABCabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "ABCabc" nil 1 0 "ABCabc" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(397 "\"abcABC\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcABC" nil 1 0 "abcABC" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(398 "\"ab{3cd\" =~ /ab{3cd/" "ab{3cd" nil nil nil nil "ab{3cd" nil 1 0 "ab{3cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(399 "\"ab{3,cd\" =~ /ab{3,cd/" "ab{3,cd" nil nil nil nil "ab{3,cd" nil 1 0 "ab{3,cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(400 "\"ab{3,4a}cd\" =~ /ab{3,4a}cd/" "ab{3,4a}cd" nil nil nil nil "ab{3,4a}cd" nil 1 0 "ab{3,4a}cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(401 "\"{4,5a}bc\" =~ /{4,5a}bc/" "{4,5a}bc" nil nil nil nil "{4,5a}bc" nil 1 0 "{4,5a}bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(402 "\"a\\rb\" =~ /^a.b/" "^a.b" nil nil nil nil ("a" 13 "b") nil 1 0 ("a" 13 "b") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +def" nil nil nil) +(379 "\"b::c\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "b::c" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(380 "\"c::b\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "c::b" nil "::" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(381 "\"az-\" =~ /[-az]+/" "[-az]+" nil nil nil nil "az-" nil "az-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(382 "\"b\" =~ /[-az]+/" "[-az]+" nil nil nil nil "b" nil nil nil) +(383 "\"za-\" =~ /[az-]+/" "[az-]+" nil nil nil nil "za-" nil "za-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(384 "\"b\" =~ /[az-]+/" "[az-]+" nil nil nil nil "b" nil nil nil) +(385 "\"a-z\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "a-z" nil "a-z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(386 "\"b\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "b" nil nil nil) +(387 "\"abcdxyz\" =~ /[a-z]+/" "[a-z]+" nil nil nil nil "abcdxyz" nil "abcdxyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(388 "\"12-34\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "12-34" nil "12-34" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(389 "\"aaa\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "aaa" nil nil nil) +(390 "\"12-34z\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "12-34z" nil "12-34z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(391 "\"aaa\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "aaa" nil nil nil) +(392 "\"\\\\\" =~ /\\x5c/" "\\x5c" nil nil nil nil "\\" nil "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(393 "\"the Zoo\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "the Zoo" nil " Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(394 "\"Zulu\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "Zulu" nil nil nil) +(395 "\"abcabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcabc" nil "abcabc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(396 "\"ABCabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "ABCabc" nil "ABCabc" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(397 "\"abcABC\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcABC" nil "abcABC" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(398 "\"ab{3cd\" =~ /ab{3cd/" "ab{3cd" nil nil nil nil "ab{3cd" nil "ab{3cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(399 "\"ab{3,cd\" =~ /ab{3,cd/" "ab{3,cd" nil nil nil nil "ab{3,cd" nil "ab{3,cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(400 "\"ab{3,4a}cd\" =~ /ab{3,4a}cd/" "ab{3,4a}cd" nil nil nil nil "ab{3,4a}cd" nil "ab{3,4a}cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(401 "\"{4,5a}bc\" =~ /{4,5a}bc/" "{4,5a}bc" nil nil nil nil "{4,5a}bc" nil "{4,5a}bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(402 "\"a\\rb\" =~ /^a.b/" "^a.b" nil nil nil nil ("a" 13 "b") nil ("a" 13 "b") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (403 "\"a\\nb\" =~ /^a.b/" "^a.b" nil nil nil nil "a -b" nil 1 0 nil nil) -(404 "\"abc\" =~ /abc$/" "abc$" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +b" nil nil nil) +(404 "\"abc\" =~ /abc$/" "abc$" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (405 "\"abc\\n\" =~ /abc$/" "abc$" nil nil nil nil "abc -" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (406 "\"abc\\ndef\" =~ /abc$/" "abc$" nil nil nil nil "abc -def" nil 1 0 nil nil) -(407 "\"abc\\x53\" =~ /(abc)\\123/" "(abc)\\123" nil nil nil nil "abcS" nil 1 0 "abcS" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(408 "\"abc\\x93\" =~ /(abc)\\223/" "(abc)\\223" nil nil nil nil ("abc" 147) nil 1 0 ("abc" 147) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(409 "\"abc\\xd3\" =~ /(abc)\\323/" "(abc)\\323" nil nil nil nil ("abc" 211) nil 1 0 ("abc" 211) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(410 "\"abc\\x40\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil 1 0 "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(411 "\"abc\\100\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil 1 0 "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(412 "\"abc\\x400\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(413 "\"abc\\x40\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(414 "\"abc\\1000\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(415 "\"abc\\100\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(416 "\"abc\\100\\060\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(417 "\"abc\\100\\60\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(418 "\"abc\\081\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil 1 0 ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(419 "\"abc\\0\\x38\\x31\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil 1 0 ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(420 "\"abc\\091\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil 1 0 ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(421 "\"abc\\0\\x39\\x31\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil 1 0 ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(422 "\"abcdefghijkllS\" =~ /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123/" "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123" nil nil nil nil "abcdefghijkllS" nil 1 0 "abcdefghijkllS" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" nil nil nil nil)) +def" nil nil nil) +(407 "\"abc\\x53\" =~ /(abc)\\123/" "(abc)\\123" nil nil nil nil "abcS" nil "abcS" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(408 "\"abc\\x93\" =~ /(abc)\\223/" "(abc)\\223" nil nil nil nil ("abc" 147) nil ("abc" 147) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(409 "\"abc\\xd3\" =~ /(abc)\\323/" "(abc)\\323" nil nil nil nil ("abc" 211) nil ("abc" 211) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(410 "\"abc\\x40\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(411 "\"abc\\100\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(412 "\"abc\\x400\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(413 "\"abc\\x40\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(414 "\"abc\\1000\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(415 "\"abc\\100\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(416 "\"abc\\100\\060\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(417 "\"abc\\100\\60\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(418 "\"abc\\081\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(419 "\"abc\\0\\x38\\x31\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(420 "\"abc\\091\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(421 "\"abc\\0\\x39\\x31\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(422 "\"abcdefghijkllS\" =~ /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123/" "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123" nil nil nil nil "abcdefghijkllS" nil "abcdefghijkllS" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" nil nil nil nil)) (423 "\"abcdefghijk\\12S\" =~ /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123/" "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123" nil nil nil nil "abcdefghijk -S" nil 1 0 "abcdefghijk +S" nil "abcdefghijk S" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" nil nil nil nil nil)) -(424 "\"abgdef\" =~ /ab\\gdef/" "ab\\gdef" nil nil nil nil "abgdef" nil 1 0 "abgdef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(425 "\"bc\" =~ /a{0}bc/" "a{0}bc" nil nil nil nil "bc" nil 1 0 "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(426 "\"xyz\" =~ /(a|(bc)){0,0}?xyz/" "(a|(bc)){0,0}?xyz" nil nil nil nil "xyz" nil 1 0 "xyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(427 "\"abc\\010de\" =~ /abc[\\10]de/" "abc[\\10]de" nil nil nil nil ("abc" 8 "de") nil 1 0 ("abc" 8 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(428 "\"abc\\1de\" =~ /abc[\\1]de/" "abc[\\1]de" nil nil nil nil ("abc" 1 "de") nil 1 0 ("abc" 1 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(429 "\"abc\\1de\" =~ /(abc)[\\1]de/" "(abc)[\\1]de" nil nil nil nil ("abc" 1 "de") nil 1 0 ("abc" 1 "de") ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(424 "\"abgdef\" =~ /ab\\gdef/" "ab\\gdef" nil nil nil nil "abgdef" nil "abgdef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(425 "\"bc\" =~ /a{0}bc/" "a{0}bc" nil nil nil nil "bc" nil "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(426 "\"xyz\" =~ /(a|(bc)){0,0}?xyz/" "(a|(bc)){0,0}?xyz" nil nil nil nil "xyz" nil "xyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(427 "\"abc\\010de\" =~ /abc[\\10]de/" "abc[\\10]de" nil nil nil nil ("abc" 8 "de") nil ("abc" 8 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(428 "\"abc\\1de\" =~ /abc[\\1]de/" "abc[\\1]de" nil nil nil nil ("abc" 1 "de") nil ("abc" 1 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(429 "\"abc\\1de\" =~ /(abc)[\\1]de/" "(abc)[\\1]de" nil nil nil nil ("abc" 1 "de") nil ("abc" 1 "de") ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (430 "\"a\\nb\" =~ /a.b(?s)/" "a.b(?s)" nil nil nil nil "a -b" nil 1 0 nil nil) -(431 "\"baNOTccccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccccd" nil 1 0 "baNOTcccc" ("b" "a" "NOT" "cccc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(432 "\"baNOTcccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTcccd" nil 1 0 "baNOTccc" ("b" "a" "NOT" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(433 "\"baNOTccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccd" nil 1 0 "baNOTcc" ("b" "a" "NO" "Tcc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(434 "\"bacccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "bacccd" nil 1 0 "baccc" ("b" "a" "" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil)) -(435 "\"anything\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "anything" nil 1 0 nil nil) -(436 "\"b\\bc\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil ("b" 8 "c") nil 1 0 nil nil) -(437 "\"baccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baccd" nil 1 0 nil nil) -(438 "\"Abc\" =~ /[^a]/" "[^a]" nil nil nil nil "Abc" nil 1 0 "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(439 "\"Abc\" =~ /[^a]/i" "[^a]" t nil nil nil "Abc" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(440 "\"AAAaAbc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "AAAaAbc" nil 1 0 "AAA" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(441 "\"AAAaAbc\" =~ /[^a]+/i" "[^a]+" t nil nil nil "AAAaAbc" nil 1 0 "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +b" nil nil nil) +(431 "\"baNOTccccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccccd" nil "baNOTcccc" ("b" "a" "NOT" "cccc" nil nil nil nil nil nil nil nil nil nil nil nil)) +(432 "\"baNOTcccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTcccd" nil "baNOTccc" ("b" "a" "NOT" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil)) +(433 "\"baNOTccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccd" nil "baNOTcc" ("b" "a" "NO" "Tcc" nil nil nil nil nil nil nil nil nil nil nil nil)) +(434 "\"bacccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "bacccd" nil "baccc" ("b" "a" "" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil)) +(435 "\"anything\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "anything" nil nil nil) +(436 "\"b\\bc\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil ("b" 8 "c") nil nil nil) +(437 "\"baccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baccd" nil nil nil) +(438 "\"Abc\" =~ /[^a]/" "[^a]" nil nil nil nil "Abc" nil "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(439 "\"Abc\" =~ /[^a]/i" "[^a]" t nil nil nil "Abc" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(440 "\"AAAaAbc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "AAAaAbc" nil "AAA" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(441 "\"AAAaAbc\" =~ /[^a]+/i" "[^a]+" t nil nil nil "AAAaAbc" nil "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (442 "\"bbb\\nccc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "bbb -ccc" nil 1 0 "bbb +ccc" nil "bbb ccc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(443 "\"abc\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abc" nil 1 0 "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(444 "\"abk\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abk" nil 1 0 nil nil) -(445 "\"abc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(446 "\"kbc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kbc" nil 1 0 "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(447 "\"kabc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kabc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(448 "\"abk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abk" nil 1 0 nil nil) -(449 "\"akb\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akb" nil 1 0 nil nil) -(450 "\"akk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akk" nil 1 0 nil nil) -(451 "\"12345678\\@a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678@a.b.c.d" nil 1 0 "12345678@a.b.c.d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(452 "\"123456789\\@x.y.z\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "123456789@x.y.z" nil 1 0 "123456789@x.y.z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(453 "\"12345678\\@x.y.uk\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678@x.y.uk" nil 1 0 nil nil) -(454 "\"1234567\\@a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "1234567@a.b.c.d" nil 1 0 nil nil) -(455 "\"aaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaa" nil 1 0 "aaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(456 "\"aaaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(457 "\"aaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaa" nil 1 0 nil nil) -(458 "\"aaaabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(459 "\"aaAabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaAabcd" nil 1 0 "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(460 "\"aaaabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(461 "\"aaAabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaAabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(462 "\"aaaabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(463 "\"aaAabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaAabcd" nil 1 0 "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(464 "\"aaaabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(465 "\"aaAabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaAabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(466 "\"\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\" =~ /\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377/" "\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377" nil nil nil nil ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) nil 1 0 ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(467 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,6}?LL/" "P[^*]TAIRE[^*]{1,6}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil 1 0 "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(468 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,}?LL/" "P[^*]TAIRE[^*]{1,}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil 1 0 "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(469 "\"1.230003938\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.230003938" nil 1 0 ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(470 "\"1.875000282\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.875000282" nil 1 0 ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(471 "\"1.235\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.235" nil 1 0 ".235" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(472 "\"1.230003938\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.230003938" nil 1 0 ".23" (".23" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(473 "\"1.875000282\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.875000282" nil 1 0 ".875" (".875" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(474 "\"1.235\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.235" nil 1 0 nil nil) -(475 "\"ab\" =~ /a(?)b/" "a(?)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(476 "\"Food is on the foo table\" =~ /\\b(foo)\\s+(\\w+)/i" "\\b(foo)\\s+(\\w+)" t nil nil nil "Food is on the foo table" nil 1 0 "foo table" ("foo" "table" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(477 "\"The food is under the bar in the barn.\" =~ /foo(.*)bar/" "foo(.*)bar" nil nil nil nil "The food is under the bar in the barn." nil 1 0 "food is under the bar in the bar" ("d is under the bar in the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(478 "\"The food is under the bar in the barn.\" =~ /foo(.*?)bar/" "foo(.*?)bar" nil nil nil nil "The food is under the bar in the barn." nil 1 0 "food is under the bar" ("d is under the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(479 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d*)/" "(.*)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: 53147" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(480 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)/" "(.*)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(481 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d*)/" "(.*?)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(482 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)/" "(.*?)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2" ("I have " "2" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(483 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)$/" "(.*)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(484 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)$/" "(.*?)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(485 "\"I have 2 numbers: 53147\" =~ /(.*)\\b(\\d+)$/" "(.*)\\b(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(486 "\"I have 2 numbers: 53147\" =~ /(.*\\D)(\\d+)$/" "(.*\\D)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(487 "\"ABC123\" =~ /^\\D*(?!123)/" "^\\D*(?!123)" nil nil nil nil "ABC123" nil 1 0 "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(488 "\"ABC445\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC445" nil 1 0 "ABC" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(489 "\"ABC123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC123" nil 1 0 nil nil) -(490 "\"W46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "W46]789" nil 1 0 "W46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(491 "\"-46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "-46]789" nil 1 0 "-46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(492 "\"Wall\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Wall" nil 1 0 nil nil) -(493 "\"Zebra\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Zebra" nil 1 0 nil nil) -(494 "\"42\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "42" nil 1 0 nil nil) -(495 "\"[abcd]\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "[abcd]" nil 1 0 nil nil) -(496 "\"]abcd[\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "]abcd[" nil 1 0 nil nil) -(497 "\"W46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "W46]789" nil 1 0 "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(498 "\"Wall\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Wall" nil 1 0 "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(499 "\"Zebra\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Zebra" nil 1 0 "Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(500 "\"Xylophone\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Xylophone" nil 1 0 "X" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(501 "\"42\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "42" nil 1 0 "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(502 "\"[abcd]\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "[abcd]" nil 1 0 "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(503 "\"]abcd[\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "]abcd[" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(504 "\"\\\\backslash\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "\\backslash" nil 1 0 "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(505 "\"-46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "-46]789" nil 1 0 nil nil) -(506 "\"well\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "well" nil 1 0 nil nil) -(507 "\"01/01/2000\" =~ /\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/" "\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d" nil nil nil nil "01/01/2000" nil 1 0 "01/01/2000" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(508 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil 1 0 "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(509 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil 1 0 nil nil) -(510 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?:[a-zA-Z0-9]+ ){0,300}otherword/" "word (?:[a-zA-Z0-9]+ ){0,300}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil 1 0 nil nil) -(511 "\"bcd\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(512 "\"abc\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(513 "\"aab\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "aab" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(514 "\"bcd\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(515 "\"abc\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(516 "\"aab\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "aab" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(517 "\"bcd\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(518 "\"abc\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(519 "\"aab\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(520 "\"bcd\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(521 "\"abc\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(522 "\"aab\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(523 "\"aaa\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(524 "\"bcd\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(525 "\"abc\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(526 "\"aab\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(527 "\"aaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(528 "\"aaaaaaaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaaaaaaa" nil 1 0 "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(529 "\"bcd\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "bcd" nil 1 0 nil nil) -(530 "\"abc\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(531 "\"aab\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "aab" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(532 "\"bcd\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "bcd" nil 1 0 nil nil) -(533 "\"abc\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(534 "\"aab\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(535 "\"bcd\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "bcd" nil 1 0 nil nil) -(536 "\"abc\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(537 "\"aab\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(538 "\"aaa\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(539 "\"bcd\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "bcd" nil 1 0 nil nil) -(540 "\"abc\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(541 "\"aab\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(542 "\"aaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(543 "\"aaaaaaaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaaaaaaa" nil 1 0 "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(443 "\"abc\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abc" nil "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(444 "\"abk\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abk" nil nil nil) +(445 "\"abc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(446 "\"kbc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kbc" nil "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(447 "\"kabc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kabc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(448 "\"abk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abk" nil nil nil) +(449 "\"akb\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akb" nil nil nil) +(450 "\"akk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akk" nil nil nil) +(451 "\"12345678\\@a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678@a.b.c.d" nil "12345678@a.b.c.d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(452 "\"123456789\\@x.y.z\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "123456789@x.y.z" nil "123456789@x.y.z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(453 "\"12345678\\@x.y.uk\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678@x.y.uk" nil nil nil) +(454 "\"1234567\\@a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "1234567@a.b.c.d" nil nil nil) +(455 "\"aaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaa" nil "aaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(456 "\"aaaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaaa" nil "aaaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(457 "\"aaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaa" nil nil nil) +(458 "\"aaaabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(459 "\"aaAabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaAabcd" nil "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(460 "\"aaaabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(461 "\"aaAabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaAabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(462 "\"aaaabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(463 "\"aaAabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaAabcd" nil "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(464 "\"aaaabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaaabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(465 "\"aaAabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaAabcd" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(466 "\"\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\" =~ /\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377/" "\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377" nil nil nil nil ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) nil ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(467 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,6}?LL/" "P[^*]TAIRE[^*]{1,6}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(468 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,}?LL/" "P[^*]TAIRE[^*]{1,}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(469 "\"1.230003938\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.230003938" nil ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(470 "\"1.875000282\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.875000282" nil ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(471 "\"1.235\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.235" nil ".235" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(472 "\"1.230003938\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.230003938" nil ".23" (".23" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(473 "\"1.875000282\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.875000282" nil ".875" (".875" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(474 "\"1.235\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.235" nil nil nil) +(475 "\"ab\" =~ /a(?)b/" "a(?)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(476 "\"Food is on the foo table\" =~ /\\b(foo)\\s+(\\w+)/i" "\\b(foo)\\s+(\\w+)" t nil nil nil "Food is on the foo table" nil "foo table" ("foo" "table" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(477 "\"The food is under the bar in the barn.\" =~ /foo(.*)bar/" "foo(.*)bar" nil nil nil nil "The food is under the bar in the barn." nil "food is under the bar in the bar" ("d is under the bar in the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(478 "\"The food is under the bar in the barn.\" =~ /foo(.*?)bar/" "foo(.*?)bar" nil nil nil nil "The food is under the bar in the barn." nil "food is under the bar" ("d is under the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(479 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d*)/" "(.*)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: 53147" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(480 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)/" "(.*)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(481 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d*)/" "(.*?)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil "" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(482 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)/" "(.*?)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2" ("I have " "2" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(483 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)$/" "(.*)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(484 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)$/" "(.*?)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(485 "\"I have 2 numbers: 53147\" =~ /(.*)\\b(\\d+)$/" "(.*)\\b(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(486 "\"I have 2 numbers: 53147\" =~ /(.*\\D)(\\d+)$/" "(.*\\D)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(487 "\"ABC123\" =~ /^\\D*(?!123)/" "^\\D*(?!123)" nil nil nil nil "ABC123" nil "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(488 "\"ABC445\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC445" nil "ABC" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(489 "\"ABC123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC123" nil nil nil) +(490 "\"W46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "W46]789" nil "W46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(491 "\"-46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "-46]789" nil "-46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(492 "\"Wall\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Wall" nil nil nil) +(493 "\"Zebra\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Zebra" nil nil nil) +(494 "\"42\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "42" nil nil nil) +(495 "\"[abcd]\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "[abcd]" nil nil nil) +(496 "\"]abcd[\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "]abcd[" nil nil nil) +(497 "\"W46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "W46]789" nil "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(498 "\"Wall\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Wall" nil "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(499 "\"Zebra\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Zebra" nil "Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(500 "\"Xylophone\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Xylophone" nil "X" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(501 "\"42\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "42" nil "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(502 "\"[abcd]\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "[abcd]" nil "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(503 "\"]abcd[\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "]abcd[" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(504 "\"\\\\backslash\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "\\backslash" nil "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(505 "\"-46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "-46]789" nil nil nil) +(506 "\"well\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "well" nil nil nil) +(507 "\"01/01/2000\" =~ /\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/" "\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d" nil nil nil nil "01/01/2000" nil "01/01/2000" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(508 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(509 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil nil nil) +(510 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?:[a-zA-Z0-9]+ ){0,300}otherword/" "word (?:[a-zA-Z0-9]+ ){0,300}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil nil nil) +(511 "\"bcd\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(512 "\"abc\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(513 "\"aab\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "aab" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(514 "\"bcd\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(515 "\"abc\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(516 "\"aab\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "aab" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(517 "\"bcd\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(518 "\"abc\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(519 "\"aab\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(520 "\"bcd\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(521 "\"abc\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(522 "\"aab\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(523 "\"aaa\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(524 "\"bcd\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "bcd" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(525 "\"abc\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(526 "\"aab\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(527 "\"aaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(528 "\"aaaaaaaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaaaaaaa" nil "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(529 "\"bcd\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "bcd" nil nil nil) +(530 "\"abc\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(531 "\"aab\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "aab" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(532 "\"bcd\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "bcd" nil nil nil) +(533 "\"abc\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(534 "\"aab\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(535 "\"bcd\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "bcd" nil nil nil) +(536 "\"abc\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(537 "\"aab\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(538 "\"aaa\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(539 "\"bcd\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "bcd" nil nil nil) +(540 "\"abc\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "abc" nil "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(541 "\"aab\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aab" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(542 "\"aaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaa" nil "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(543 "\"aaaaaaaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaaaaaaa" nil "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (544 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/" ".*\\.gif" nil nil nil nil "borfle bib.gif -no" nil 1 0 "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +no" nil "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (545 "\"borfle\\nbib.gif\\nno\" =~ /.{0,}\\.gif/" ".{0,}\\.gif" nil nil nil nil "borfle bib.gif -no" nil 1 0 "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +no" nil "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (546 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/m" ".*\\.gif" nil t nil nil "borfle bib.gif -no" nil 1 0 "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +no" nil "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (547 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/s" ".*\\.gif" nil nil t nil "borfle bib.gif -no" nil 1 0 "borfle +no" nil "borfle bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (548 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/ms" ".*\\.gif" nil t t nil "borfle bib.gif -no" nil 1 0 "borfle +no" nil "borfle bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (549 "\"borfle\\nbib.gif\\nno\" =~ /.*$/" ".*$" nil nil nil nil "borfle bib.gif -no" nil 1 0 "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +no" nil "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (550 "\"borfle\\nbib.gif\\nno\" =~ /.*$/m" ".*$" nil t nil nil "borfle bib.gif -no" nil 1 0 "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +no" nil "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (551 "\"borfle\\nbib.gif\\nno\" =~ /.*$/s" ".*$" nil nil t nil "borfle bib.gif -no" nil 1 0 "borfle +no" nil "borfle bib.gif no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (552 "\"borfle\\nbib.gif\\nno\" =~ /.*$/ms" ".*$" nil t t nil "borfle bib.gif -no" nil 1 0 "borfle +no" nil "borfle bib.gif no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (553 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/" ".*$" nil nil nil nil "borfle bib.gif no -" nil 1 0 "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (554 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/m" ".*$" nil t nil nil "borfle bib.gif no -" nil 1 0 "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (555 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/s" ".*$" nil nil t nil "borfle bib.gif no -" nil 1 0 "borfle +" nil "borfle bib.gif no " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (556 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/ms" ".*$" nil t t nil "borfle bib.gif no -" nil 1 0 "borfle +" nil "borfle bib.gif no " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (557 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "abcde -1234Xyz" nil 1 0 "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(558 "\"BarFoo\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +1234Xyz" nil "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(558 "\"BarFoo\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (559 "\"abcde\\nBar\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "abcde -Bar" nil 1 0 nil nil) +Bar" nil nil nil) (560 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "abcde -1234Xyz" nil 1 0 "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(561 "\"BarFoo\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +1234Xyz" nil "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(561 "\"BarFoo\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (562 "\"abcde\\nBar\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "abcde -Bar" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +Bar" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (563 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde -1234Xyz" nil 1 0 "abcde +1234Xyz" nil "abcde 1234X" ("abcde 1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(564 "\"BarFoo\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(564 "\"BarFoo\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (565 "\"abcde\\nBar\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde -Bar" nil 1 0 nil nil) +Bar" nil nil nil) (566 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "abcde -1234Xyz" nil 1 0 "abcde +1234Xyz" nil "abcde 1234X" ("abcde 1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(567 "\"BarFoo\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(567 "\"BarFoo\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (568 "\"abcde\\nBar\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "abcde -Bar" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +Bar" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (569 "\"abcde\\n1234Xyz\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde -1234Xyz" nil 1 0 "abcde +1234Xyz" nil "abcde 1234X" ("abcde 1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(570 "\"BarFoo\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(570 "\"BarFoo\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "BarFoo" nil "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (571 "\"abcde\\nBar\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde -Bar" nil 1 0 nil nil) +Bar" nil nil nil) (572 "\"abcde\\n1234Xyz\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde -1234Xyz" nil 1 0 "abcde +1234Xyz" nil "abcde 1234X" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(573 "\"BarFoo\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "BarFoo" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(573 "\"BarFoo\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "BarFoo" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (574 "\"abcde\\nBar\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde -Bar" nil 1 0 nil nil) +Bar" nil nil nil) (575 "\"abc\\nB\" =~ /^.*B/" "^.*B" nil nil nil nil "abc -B" nil 1 0 nil nil) +B" nil nil nil) (576 "\"abc\\nB\" =~ /(?s)^.*B/" "(?s)^.*B" nil nil nil nil "abc -B" nil 1 0 "abc +B" nil "abc B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (577 "\"abc\\nB\" =~ /(?m)^.*B/" "(?m)^.*B" nil nil nil nil "abc -B" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +B" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (578 "\"abc\\nB\" =~ /(?ms)^.*B/" "(?ms)^.*B" nil nil nil nil "abc -B" nil 1 0 "abc +B" nil "abc B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (579 "\"abc\\nB\" =~ /(?ms)^B/" "(?ms)^B" nil nil nil nil "abc -B" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +B" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (580 "\"B\\n\" =~ /(?s)B$/" "(?s)B$" nil nil nil nil "B -" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(581 "\"123456654321\" =~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/" "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" nil nil nil nil "123456654321" nil 1 0 "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(582 "\"123456654321\" =~ /^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/" "^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d" nil nil nil nil "123456654321" nil 1 0 "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(583 "\"123456654321\" =~ /^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/" "^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]" nil nil nil nil "123456654321" nil 1 0 "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(584 "\"abcabcabcabc\" =~ /^[abc]{12}/" "^[abc]{12}" nil nil nil nil "abcabcabcabc" nil 1 0 "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(585 "\"abcabcabcabc\" =~ /^[a-c]{12}/" "^[a-c]{12}" nil nil nil nil "abcabcabcabc" nil 1 0 "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(586 "\"abcabcabcabc\" =~ /^(a|b|c){12}/" "^(a|b|c){12}" nil nil nil nil "abcabcabcabc" nil 1 0 "abcabcabcabc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(587 "\"n\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "n" nil 1 0 "n" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(588 "\"z\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "z" nil 1 0 nil nil) -(589 "\"abcd\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(590 "\"abce\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abce" nil 1 0 nil nil) -(591 "\"abe\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abe" nil 1 0 "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(592 "\"abcde\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abcde" nil 1 0 nil nil) -(593 "\"abd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abd" nil 1 0 "abd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(594 "\"abcd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abcd" nil 1 0 nil nil) -(595 "\"a\" =~ /a(b*)/" "a(b*)" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(596 "\"ab\" =~ /a(b*)/" "a(b*)" nil nil nil nil "ab" nil 1 0 "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(597 "\"abbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "abbbb" nil 1 0 "abbbb" ("bbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(598 "\"bbbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "bbbbb" nil 1 0 nil nil) -(599 "\"abe\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "abe" nil 1 0 "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(600 "\"ab1e\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "ab1e" nil 1 0 nil nil) -(601 "\"the \\\"quick\\\" brown fox\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "the \"quick\" brown fox" nil 1 0 "\"quick\"" ("quick" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(602 "\"\\\"the \\\\\\\"quick\\\\\\\" brown fox\\\"\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "\"the \\\"quick\\\" brown fox\"" nil 1 0 "\"the \\\"quick\\\" brown fox\"" (" brown fox" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(603 "\"abc\" =~ /.*?/" ".*?" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(604 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(605 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(606 "\"abc\" =~ /(?#)/" "" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(607 "\"43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide\" =~ /]{0,})>]{0,})>([\\d]{0,}\\.)(.*)((
([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is" "]{0,})>]{0,})>([\\d]{0,}\\.)(.*)((
([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>" t nil t nil "43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide" nil 1 0 "43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide" (" BGCOLOR='#DBE9E9'" " align=left valign=top" "43." "Word Processor
(N-1286)" "" "" nil " align=left valign=top" "Lega lstaff.com" " align=left valign=top" "CA - Statewide" nil nil nil nil nil)) -(608 "\"acb\" =~ /a[^a]b/" "a[^a]b" nil nil nil nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(581 "\"123456654321\" =~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/" "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" nil nil nil nil "123456654321" nil "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(582 "\"123456654321\" =~ /^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/" "^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d" nil nil nil nil "123456654321" nil "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(583 "\"123456654321\" =~ /^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/" "^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]" nil nil nil nil "123456654321" nil "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(584 "\"abcabcabcabc\" =~ /^[abc]{12}/" "^[abc]{12}" nil nil nil nil "abcabcabcabc" nil "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(585 "\"abcabcabcabc\" =~ /^[a-c]{12}/" "^[a-c]{12}" nil nil nil nil "abcabcabcabc" nil "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(586 "\"abcabcabcabc\" =~ /^(a|b|c){12}/" "^(a|b|c){12}" nil nil nil nil "abcabcabcabc" nil "abcabcabcabc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(587 "\"n\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "n" nil "n" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(588 "\"z\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "z" nil nil nil) +(589 "\"abcd\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(590 "\"abce\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abce" nil nil nil) +(591 "\"abe\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abe" nil "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(592 "\"abcde\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abcde" nil nil nil) +(593 "\"abd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abd" nil "abd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(594 "\"abcd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abcd" nil nil nil) +(595 "\"a\" =~ /a(b*)/" "a(b*)" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(596 "\"ab\" =~ /a(b*)/" "a(b*)" nil nil nil nil "ab" nil "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(597 "\"abbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "abbbb" nil "abbbb" ("bbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(598 "\"bbbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "bbbbb" nil nil nil) +(599 "\"abe\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "abe" nil "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(600 "\"ab1e\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "ab1e" nil nil nil) +(601 "\"the \\\"quick\\\" brown fox\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "the \"quick\" brown fox" nil "\"quick\"" ("quick" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(602 "\"\\\"the \\\\\\\"quick\\\\\\\" brown fox\\\"\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "\"the \\\"quick\\\" brown fox\"" nil "\"the \\\"quick\\\" brown fox\"" (" brown fox" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(603 "\"abc\" =~ /.*?/" ".*?" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(604 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(605 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(606 "\"abc\" =~ /(?#)/" "" nil nil nil nil "abc" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(607 "\"43.
Word Processor
(N-1286)
Lega lstaff.comCA - Statewide\" =~ /]{0,})>]{0,})>([\\d]{0,}\\.)(.*)((
([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is" "]{0,})>]{0,})>([\\d]{0,}\\.)(.*)((
([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>" t nil t nil "43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide" nil "43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide" (" BGCOLOR='#DBE9E9'" " align=left valign=top" "43." "Word Processor
(N-1286)" "" "" nil " align=left valign=top" "Lega lstaff.com" " align=left valign=top" "CA - Statewide" nil nil nil nil nil)) +(608 "\"acb\" =~ /a[^a]b/" "a[^a]b" nil nil nil nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (609 "\"a\\nb\" =~ /a[^a]b/" "a[^a]b" nil nil nil nil "a -b" nil 1 0 "a +b" nil "a b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(610 "\"acb\" =~ /a.b/" "a.b" nil nil nil nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(610 "\"acb\" =~ /a.b/" "a.b" nil nil nil nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (611 "\"a\\nb\" =~ /a.b/" "a.b" nil nil nil nil "a -b" nil 1 0 nil nil) -(612 "\"acb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +b" nil nil nil) +(612 "\"acb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (613 "\"a\\nb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "a -b" nil 1 0 "a +b" nil "a b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(614 "\"acb\" =~ /a.b/s" "a.b" nil nil t nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(614 "\"acb\" =~ /a.b/s" "a.b" nil nil t nil "acb" nil "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (615 "\"a\\nb\" =~ /a.b/s" "a.b" nil nil t nil "a -b" nil 1 0 "a +b" nil "a b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(616 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(617 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(618 "\"bbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbac" nil 1 0 "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(619 "\"bbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbac" nil 1 0 "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(620 "\"bbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbac" nil 1 0 "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(621 "\"bac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(622 "\"bbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(623 "\"bbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbac" nil 1 0 "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(624 "\"bbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbac" nil 1 0 "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(625 "\"bbbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbbac" nil 1 0 "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(616 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(617 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(618 "\"bbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbac" nil "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(619 "\"bbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbac" nil "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(620 "\"bbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbac" nil "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(621 "\"bac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bac" nil "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(622 "\"bbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbac" nil "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(623 "\"bbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbac" nil "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(624 "\"bbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbac" nil "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(625 "\"bbbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbbac" nil "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (626 "\"x\\nb\\n\" =~ /(?!\\A)x/m" "(?!\\A)x" nil t nil nil "x b -" nil 1 0 nil nil) -(627 "\"a\\bx\\n\" =~ /(?!\\A)x/m" "(?!\\A)x" nil t nil nil ("a" 8 "x" 10) nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(628 "\"\\0{ab}\" =~ /\\x0{ab}/" "\\x0{ab}" nil nil nil nil ("" 0 "{ab}") nil 1 0 ("" 0 "{ab}") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(629 "\"CD\" =~ /(A|B)*?CD/" "(A|B)*?CD" nil nil nil nil "CD" nil 1 0 "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(630 "\"CD\" =~ /(A|B)*CD/" "(A|B)*CD" nil nil nil nil "CD" nil 1 0 "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(631 "\"ABABAB\" =~ /(AB)*?\\1/" "(AB)*?\\1" nil nil nil nil "ABABAB" nil 1 0 "ABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(632 "\"ABABAB\" =~ /(AB)*\\1/" "(AB)*\\1" nil nil nil nil "ABABAB" nil 1 0 "ABABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(633 "\"doesn't matter\" =~ /(/" "(" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(634 "\"doesn't matter\" =~ /(x)\\2/" "(x)\\2" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(635 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaac" nil 1 0 "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(636 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaa" nil 1 0 nil nil) -(637 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaac" nil 1 0 "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(638 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaa" nil 1 0 nil nil) -(639 "\"a\" =~ /(\\b)*a/" "(\\b)*a" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(640 "\"ab\" =~ /(a)*b/" "(a)*b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(641 "\"ab\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "ab" nil 1 0 "ab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(642 "\"b\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(643 "\"x\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "x" nil 1 0 nil nil) -(644 "\"abab\" =~ /^(?:(a)|(b))*\\1\\2$/" "^(?:(a)|(b))*\\1\\2$" nil nil nil nil "abab" nil 1 0 "abab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(645 "\"abcxabcydef\" =~ /abc[^x]def/" "abc[^x]def" nil nil nil nil "abcxabcydef" nil 1 0 "abcydef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(646 "\"aax\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aax" nil 1 0 "aax" ("ax" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(647 "\"aaxa\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aaxa" nil 1 0 "aaxa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(648 "\"@{['']}\" =~ /(?#)/" "" nil nil nil nil "" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(649 "\"ab\" =~ /^(?:(a)|(b))*$/" "^(?:(a)|(b))*$" nil nil nil nil "ab" nil 1 0 "ab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(650 "\"a\" =~ /[\\0]/" "[\\0]" nil nil nil nil "a" nil 1 0 nil nil) -(651 "\"\\0\" =~ /[\\0]/" "[\\0]" nil nil nil nil ("" 0) nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(652 "\"a\" =~ /[\\1]/" "[\\1]" nil nil nil nil "a" nil 1 0 nil nil) -(653 "\"\\1\" =~ /[\\1]/" "[\\1]" nil nil nil nil ("" 1) nil 1 0 ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(654 "\"doesn't matter\" =~ /\\10()()()()()()()()()/" "\\10()()()()()()()()()" nil nil nil nil "doesn't matter" nil 1 0 nil nil) -(655 "\"a\" =~ /\\10()()()()()()()()()()/" "\\10()()()()()()()()()()" nil nil nil nil "a" nil 1 0 nil nil) -(656 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(657 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(658 "\"doesn't matter\" =~ /[\\]/" "[\\]" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(659 "\"a\" =~ /()/" "()" nil nil nil nil "a" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(660 "\"x\" =~ /[\\x]/" "[\\x]" nil nil nil nil "x" nil 1 0 nil nil) -(661 "\"\\0\" =~ /[\\x]/" "[\\x]" nil nil nil nil ("" 0) nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(662 "\"a\" =~ /((a)*)*/" "((a)*)*" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(663 "\"a\" =~ /()a\\1/" "()a\\1" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(664 "\"a\" =~ /a\\1()/" "a\\1()" nil nil nil nil "a" nil 1 0 nil nil) -(665 "\"aaa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aaa" nil 1 0 "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(666 "\"aAa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAa" nil 1 0 "aAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(667 "\"aAA\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAA" nil 1 0 nil nil) -(668 "\"aaaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(669 "\"aAaAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAaAa" nil 1 0 "aAaAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(670 "\"AaAaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaAaA" nil 1 0 nil nil) -(671 "\"aAAAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAAAa" nil 1 0 nil nil) -(672 "\"AaaaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaaaA" nil 1 0 nil nil) -(673 "\"AAAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAAAA" nil 1 0 nil nil) -(674 "\"aaAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaAAA" nil 1 0 nil nil) -(675 "\"AAaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAaaa" nil 1 0 nil nil) -(676 "\"a\" =~ /\\x/" "\\x" nil nil nil nil "a" nil 1 0 nil nil) -(677 "\"X\" =~ /\\x/" "\\x" nil nil nil nil "X" nil 1 0 nil nil) -(678 "\"\\0\" =~ /\\x/" "\\x" nil nil nil nil ("" 0) nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(679 "\"a\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(680 "\"b\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(681 "\"d\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "d" nil 1 0 nil nil) -(682 "\"-\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(683 "\"b\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(684 "\"c\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "c" nil 1 0 nil nil) -(685 "\"d\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "d" nil 1 0 nil nil) -(686 "\"-\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(687 "\"1\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(688 "\"d\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "d" nil 1 0 nil nil) -(689 "\"e\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "e" nil 1 0 nil nil) -(690 "\"f\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "f" nil 1 0 "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(691 "\"-\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(692 "\"1\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(693 "\"doesn't matter\" =~ /[/" "[" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(694 "\"]\" =~ /]/" "]" nil nil nil nil "]" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(695 "\"a\" =~ /]/" "]" nil nil nil nil "a" nil 1 0 nil nil) -(696 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(697 "\"-\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(698 "\"a\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(699 "\"b\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(700 "\"d\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "d" nil 1 0 nil nil) -(701 "\"-\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(702 "\"a\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(703 "\"b\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(704 "\"d\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "d" nil 1 0 nil nil) -(705 "\"a\" =~ /[-]/" "[-]" nil nil nil nil "a" nil 1 0 nil nil) -(706 "\"-\" =~ /[-]/" "[-]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(707 "\"a\" =~ /[--]/" "[--]" nil nil nil nil "a" nil 1 0 nil nil) -(708 "\"-\" =~ /[--]/" "[--]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(709 "\"a\" =~ /[---]/" "[---]" nil nil nil nil "a" nil 1 0 nil nil) -(710 "\"-\" =~ /[---]/" "[---]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(711 "\"-\" =~ /[--b]/" "[--b]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(712 "\"a\" =~ /[--b]/" "[--b]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(713 "\"c\" =~ /[--b]/" "[--b]" nil nil nil nil "c" nil 1 0 nil nil) -(714 "\"doesn't matter\" =~ /[b--]/" "[b--]" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(715 "\"a{\" =~ /a{/" "a{" nil nil nil nil "a{" nil 1 0 "a{" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(716 "\"a{}\" =~ /a{}/" "a{}" nil nil nil nil "a{}" nil 1 0 "a{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(717 "\"a{3\" =~ /a{3/" "a{3" nil nil nil nil "a{3" nil 1 0 "a{3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(718 "\"a{3,\" =~ /a{3,/" "a{3," nil nil nil nil "a{3," nil 1 0 "a{3," (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(719 "\"a{3,3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3,3}" nil 1 0 nil nil) -(720 "\"a{3, 3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3, 3}" nil 1 0 "a{3, 3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(721 "\"aaa\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "aaa" nil 1 0 nil nil) -(722 "\"a{3,3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3,3}" nil 1 0 "a{3,3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(723 "\"a{3, 3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3, 3}" nil 1 0 nil nil) -(724 "\"aaa\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "aaa" nil 1 0 nil nil) -(725 "\"a{3,}\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3,}" nil 1 0 nil nil) -(726 "\"a{3, }\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3, }" nil 1 0 "a{3, }" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(727 "\"aaa\" =~ /a{3, }/" "a{3, }" nil nil nil nil "aaa" nil 1 0 nil nil) -(728 "\"a{3,}\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3,}" nil 1 0 "a{3,}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(729 "\"a{3, }\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3, }" nil 1 0 nil nil) -(730 "\"aaa\" =~ /a{3, }/x" "a{3, }" nil nil nil t "aaa" nil 1 0 nil nil) -(731 "\"\\0 x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 " x") nil 1 0 ("" 0 " x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(732 "\"\\0x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 "x") nil 1 0 nil nil) -(733 "\"\\0 x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 " x") nil 1 0 nil nil) -(734 "\"\\0x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 "x") nil 1 0 ("" 0 "x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(735 "\"\\0003\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 "3") nil 1 0 nil nil) -(736 "\"\\000 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 " 3") nil 1 0 ("" 0 " 3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(737 "\"x3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x3" nil 1 0 nil nil) -(738 "\"x 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x 3" nil 1 0 nil nil) -(739 "\"\\0003\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 "3") nil 1 0 ("" 0 "3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(740 "\"\\000 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 " 3") nil 1 0 nil nil) -(741 "\"x3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x3" nil 1 0 nil nil) -(742 "\"x 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x 3" nil 1 0 nil nil) -(743 "\"a\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a" nil 1 0 nil nil) -(744 "\"a{ 1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{ 1}" nil 1 0 "a{ 1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(745 "\"a{1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{1}" nil 1 0 nil nil) -(746 "\"a\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a" nil 1 0 nil nil) -(747 "\"a{ 1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{ 1}" nil 1 0 nil nil) -(748 "\"a{1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{1}" nil 1 0 "a{1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(749 "\"{}\" =~ /{}/" "{}" nil nil nil nil "{}" nil 1 0 "{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(750 "\"a\" =~ /{}/" "{}" nil nil nil nil "a" nil 1 0 nil nil) -(751 "\"doesn't matter\" =~ /{1}/" "{1}" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(752 "\"doesn't matter\" =~ /*/" "*" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(753 "\"x\" =~ /|/" "|" nil nil nil nil "x" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(754 "\"\\0000\" =~ /\\0000/" "\\0000" nil nil nil nil ("" 0 "0") nil 1 0 ("" 0 "0") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(755 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(756 "\"ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(757 "\"aB\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "aB" nil 1 0 "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(758 "\"Ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "Ab" nil 1 0 nil nil) -(759 "\"doesn't matter\" =~ /a(?i=a)/" "a(?i=a)" nil nil nil nil "doesn't matter" t 1 0 nil nil) -(760 "\"aa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(761 "\"xa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "xa" nil 1 0 nil nil) -(762 "\"ax\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "ax" nil 1 0 nil nil) -(763 "\"aa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(764 "\"ax\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "ax" nil 1 0 nil nil) -(765 "\"xa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "xa" nil 1 0 nil nil) -(766 "\"aa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "aa" nil 1 0 "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(767 "\"ax\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "ax" nil 1 0 nil nil) -(768 "\"xa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "xa" nil 1 0 nil nil) -(769 "\"aa\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(770 "\"ax\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "ax" nil 1 0 nil nil) -(771 "\"aa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(772 "\"ax\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "ax" nil 1 0 nil nil) -(773 "\"xa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "xa" nil 1 0 nil nil) -(774 "\"aa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(775 "\"ax\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "ax" nil 1 0 nil nil) -(776 "\"xa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "xa" nil 1 0 nil nil) -(777 "\"aa\" =~ /a()*a/" "a()*a" nil nil nil nil "aa" nil 1 0 "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(778 "\"ax\" =~ /a()*a/" "a()*a" nil nil nil nil "ax" nil 1 0 nil nil) -(779 "\"xa\" =~ /a()*a/" "a()*a" nil nil nil nil "xa" nil 1 0 nil nil) -(780 "\"aa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(781 "\"ax\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "ax" nil 1 0 nil nil) -(782 "\"xa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "xa" nil 1 0 nil nil) -(783 "\"aa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "aa" nil 1 0 nil nil) -(784 "\"xa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "xa" nil 1 0 "xa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(785 "\"ax\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "ax" nil 1 0 nil nil) -(786 "\"aa\" =~ /a(?<=(a))*\\1/" "a(?<=(a))*\\1" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(787 "\"aa\" =~ /a(?<=(a))*?\\1/" "a(?<=(a))*?\\1" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(788 "\"aa\" =~ /(?=(a)\\1)*aa/" "(?=(a)\\1)*aa" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(789 "\"aaaaabbbbb\" =~ /^((a|b){2,5}){2}$/" "^((a|b){2,5}){2}$" nil nil nil nil "aaaaabbbbb" nil 1 0 "aaaaabbbbb" ("bbbbb" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(790 "\"babc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babc" nil 1 0 "babc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(791 "\"bbabc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bbabc" nil 1 0 "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(792 "\"bababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababc" nil 1 0 "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(793 "\"bababbc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababbc" nil 1 0 nil nil) -(794 "\"babababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babababc" nil 1 0 nil nil) -(795 "\"aaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil 1 0 "aaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(796 "\"aaaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil 1 0 "aaaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(797 "\"aaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil 1 0 "aaaaac" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(798 "\"aaaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil 1 0 "aaaaaac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(799 "\"eeexabc\" =~ /(?m:^).abc$/" "(?m:^).abc$" nil nil nil nil "eeexabc" nil 1 0 nil nil) +" nil nil nil) +(627 "\"a\\bx\\n\" =~ /(?!\\A)x/m" "(?!\\A)x" nil t nil nil ("a" 8 "x" 10) nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(628 "\"\\0{ab}\" =~ /\\x0{ab}/" "\\x0{ab}" nil nil nil nil ("" 0 "{ab}") nil ("" 0 "{ab}") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(629 "\"CD\" =~ /(A|B)*?CD/" "(A|B)*?CD" nil nil nil nil "CD" nil "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(630 "\"CD\" =~ /(A|B)*CD/" "(A|B)*CD" nil nil nil nil "CD" nil "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(631 "\"ABABAB\" =~ /(AB)*?\\1/" "(AB)*?\\1" nil nil nil nil "ABABAB" nil "ABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(632 "\"ABABAB\" =~ /(AB)*\\1/" "(AB)*\\1" nil nil nil nil "ABABAB" nil "ABABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(633 "\"doesn't matter\" =~ /(/" "(" nil nil nil nil "doesn't matter" t nil nil) +(634 "\"doesn't matter\" =~ /(x)\\2/" "(x)\\2" nil nil nil nil "doesn't matter" t nil nil) +(635 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaac" nil "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(636 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaa" nil nil nil) +(637 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaac" nil "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(638 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaa" nil nil nil) +(639 "\"a\" =~ /(\\b)*a/" "(\\b)*a" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(640 "\"ab\" =~ /(a)*b/" "(a)*b" nil nil nil nil "ab" nil "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(641 "\"ab\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "ab" nil "ab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(642 "\"b\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(643 "\"x\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "x" nil nil nil) +(644 "\"abab\" =~ /^(?:(a)|(b))*\\1\\2$/" "^(?:(a)|(b))*\\1\\2$" nil nil nil nil "abab" nil "abab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(645 "\"abcxabcydef\" =~ /abc[^x]def/" "abc[^x]def" nil nil nil nil "abcxabcydef" nil "abcydef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(646 "\"aax\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aax" nil "aax" ("ax" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(647 "\"aaxa\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aaxa" nil "aaxa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(648 "\"@{['']}\" =~ /(?#)/" "" nil nil nil nil "" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(649 "\"ab\" =~ /^(?:(a)|(b))*$/" "^(?:(a)|(b))*$" nil nil nil nil "ab" nil "ab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(650 "\"a\" =~ /[\\0]/" "[\\0]" nil nil nil nil "a" nil nil nil) +(651 "\"\\0\" =~ /[\\0]/" "[\\0]" nil nil nil nil ("" 0) nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(652 "\"a\" =~ /[\\1]/" "[\\1]" nil nil nil nil "a" nil nil nil) +(653 "\"\\1\" =~ /[\\1]/" "[\\1]" nil nil nil nil ("" 1) nil ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(654 "\"doesn't matter\" =~ /\\10()()()()()()()()()/" "\\10()()()()()()()()()" nil nil nil nil "doesn't matter" nil nil nil) +(655 "\"a\" =~ /\\10()()()()()()()()()()/" "\\10()()()()()()()()()()" nil nil nil nil "a" nil nil nil) +(656 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(657 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t nil nil) +(658 "\"doesn't matter\" =~ /[\\]/" "[\\]" nil nil nil nil "doesn't matter" t nil nil) +(659 "\"a\" =~ /()/" "()" nil nil nil nil "a" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(660 "\"x\" =~ /[\\x]/" "[\\x]" nil nil nil nil "x" nil nil nil) +(661 "\"\\0\" =~ /[\\x]/" "[\\x]" nil nil nil nil ("" 0) nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(662 "\"a\" =~ /((a)*)*/" "((a)*)*" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(663 "\"a\" =~ /()a\\1/" "()a\\1" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(664 "\"a\" =~ /a\\1()/" "a\\1()" nil nil nil nil "a" nil nil nil) +(665 "\"aaa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aaa" nil "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(666 "\"aAa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAa" nil "aAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(667 "\"aAA\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAA" nil nil nil) +(668 "\"aaaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaaaa" nil "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(669 "\"aAaAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAaAa" nil "aAaAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(670 "\"AaAaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaAaA" nil nil nil) +(671 "\"aAAAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAAAa" nil nil nil) +(672 "\"AaaaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaaaA" nil nil nil) +(673 "\"AAAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAAAA" nil nil nil) +(674 "\"aaAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaAAA" nil nil nil) +(675 "\"AAaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAaaa" nil nil nil) +(676 "\"a\" =~ /\\x/" "\\x" nil nil nil nil "a" nil nil nil) +(677 "\"X\" =~ /\\x/" "\\x" nil nil nil nil "X" nil nil nil) +(678 "\"\\0\" =~ /\\x/" "\\x" nil nil nil nil ("" 0) nil ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(679 "\"a\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(680 "\"b\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(681 "\"d\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "d" nil nil nil) +(682 "\"-\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(683 "\"b\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(684 "\"c\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "c" nil nil nil) +(685 "\"d\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "d" nil nil nil) +(686 "\"-\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(687 "\"1\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "1" nil "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(688 "\"d\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "d" nil nil nil) +(689 "\"e\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "e" nil nil nil) +(690 "\"f\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "f" nil "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(691 "\"-\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(692 "\"1\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "1" nil "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(693 "\"doesn't matter\" =~ /[/" "[" nil nil nil nil "doesn't matter" t nil nil) +(694 "\"]\" =~ /]/" "]" nil nil nil nil "]" nil "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(695 "\"a\" =~ /]/" "]" nil nil nil nil "a" nil nil nil) +(696 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t nil nil) +(697 "\"-\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(698 "\"a\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(699 "\"b\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(700 "\"d\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "d" nil nil nil) +(701 "\"-\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(702 "\"a\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(703 "\"b\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(704 "\"d\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "d" nil nil nil) +(705 "\"a\" =~ /[-]/" "[-]" nil nil nil nil "a" nil nil nil) +(706 "\"-\" =~ /[-]/" "[-]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(707 "\"a\" =~ /[--]/" "[--]" nil nil nil nil "a" nil nil nil) +(708 "\"-\" =~ /[--]/" "[--]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(709 "\"a\" =~ /[---]/" "[---]" nil nil nil nil "a" nil nil nil) +(710 "\"-\" =~ /[---]/" "[---]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(711 "\"-\" =~ /[--b]/" "[--b]" nil nil nil nil "-" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(712 "\"a\" =~ /[--b]/" "[--b]" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(713 "\"c\" =~ /[--b]/" "[--b]" nil nil nil nil "c" nil nil nil) +(714 "\"doesn't matter\" =~ /[b--]/" "[b--]" nil nil nil nil "doesn't matter" t nil nil) +(715 "\"a{\" =~ /a{/" "a{" nil nil nil nil "a{" nil "a{" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(716 "\"a{}\" =~ /a{}/" "a{}" nil nil nil nil "a{}" nil "a{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(717 "\"a{3\" =~ /a{3/" "a{3" nil nil nil nil "a{3" nil "a{3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(718 "\"a{3,\" =~ /a{3,/" "a{3," nil nil nil nil "a{3," nil "a{3," (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(719 "\"a{3,3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3,3}" nil nil nil) +(720 "\"a{3, 3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3, 3}" nil "a{3, 3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(721 "\"aaa\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "aaa" nil nil nil) +(722 "\"a{3,3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3,3}" nil "a{3,3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(723 "\"a{3, 3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3, 3}" nil nil nil) +(724 "\"aaa\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "aaa" nil nil nil) +(725 "\"a{3,}\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3,}" nil nil nil) +(726 "\"a{3, }\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3, }" nil "a{3, }" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(727 "\"aaa\" =~ /a{3, }/" "a{3, }" nil nil nil nil "aaa" nil nil nil) +(728 "\"a{3,}\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3,}" nil "a{3,}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(729 "\"a{3, }\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3, }" nil nil nil) +(730 "\"aaa\" =~ /a{3, }/x" "a{3, }" nil nil nil t "aaa" nil nil nil) +(731 "\"\\0 x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 " x") nil ("" 0 " x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(732 "\"\\0x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 "x") nil nil nil) +(733 "\"\\0 x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 " x") nil nil nil) +(734 "\"\\0x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 "x") nil ("" 0 "x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(735 "\"\\0003\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 "3") nil nil nil) +(736 "\"\\000 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 " 3") nil ("" 0 " 3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(737 "\"x3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x3" nil nil nil) +(738 "\"x 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x 3" nil nil nil) +(739 "\"\\0003\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 "3") nil ("" 0 "3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(740 "\"\\000 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 " 3") nil nil nil) +(741 "\"x3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x3" nil nil nil) +(742 "\"x 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x 3" nil nil nil) +(743 "\"a\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a" nil nil nil) +(744 "\"a{ 1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{ 1}" nil "a{ 1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(745 "\"a{1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{1}" nil nil nil) +(746 "\"a\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a" nil nil nil) +(747 "\"a{ 1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{ 1}" nil nil nil) +(748 "\"a{1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{1}" nil "a{1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(749 "\"{}\" =~ /{}/" "{}" nil nil nil nil "{}" nil "{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(750 "\"a\" =~ /{}/" "{}" nil nil nil nil "a" nil nil nil) +(751 "\"doesn't matter\" =~ /{1}/" "{1}" nil nil nil nil "doesn't matter" t nil nil) +(752 "\"doesn't matter\" =~ /*/" "*" nil nil nil nil "doesn't matter" t nil nil) +(753 "\"x\" =~ /|/" "|" nil nil nil nil "x" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(754 "\"\\0000\" =~ /\\0000/" "\\0000" nil nil nil nil ("" 0 "0") nil ("" 0 "0") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(755 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(756 "\"ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(757 "\"aB\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "aB" nil "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(758 "\"Ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "Ab" nil nil nil) +(759 "\"doesn't matter\" =~ /a(?i=a)/" "a(?i=a)" nil nil nil nil "doesn't matter" t nil nil) +(760 "\"aa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(761 "\"xa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "xa" nil nil nil) +(762 "\"ax\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "ax" nil nil nil) +(763 "\"aa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(764 "\"ax\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "ax" nil nil nil) +(765 "\"xa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "xa" nil nil nil) +(766 "\"aa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "aa" nil "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(767 "\"ax\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "ax" nil nil nil) +(768 "\"xa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "xa" nil nil nil) +(769 "\"aa\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(770 "\"ax\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "ax" nil nil nil) +(771 "\"aa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(772 "\"ax\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "ax" nil nil nil) +(773 "\"xa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "xa" nil nil nil) +(774 "\"aa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(775 "\"ax\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "ax" nil nil nil) +(776 "\"xa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "xa" nil nil nil) +(777 "\"aa\" =~ /a()*a/" "a()*a" nil nil nil nil "aa" nil "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(778 "\"ax\" =~ /a()*a/" "a()*a" nil nil nil nil "ax" nil nil nil) +(779 "\"xa\" =~ /a()*a/" "a()*a" nil nil nil nil "xa" nil nil nil) +(780 "\"aa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(781 "\"ax\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "ax" nil nil nil) +(782 "\"xa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "xa" nil nil nil) +(783 "\"aa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "aa" nil nil nil) +(784 "\"xa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "xa" nil "xa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(785 "\"ax\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "ax" nil nil nil) +(786 "\"aa\" =~ /a(?<=(a))*\\1/" "a(?<=(a))*\\1" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(787 "\"aa\" =~ /a(?<=(a))*?\\1/" "a(?<=(a))*?\\1" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(788 "\"aa\" =~ /(?=(a)\\1)*aa/" "(?=(a)\\1)*aa" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(789 "\"aaaaabbbbb\" =~ /^((a|b){2,5}){2}$/" "^((a|b){2,5}){2}$" nil nil nil nil "aaaaabbbbb" nil "aaaaabbbbb" ("bbbbb" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(790 "\"babc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babc" nil "babc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(791 "\"bbabc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bbabc" nil "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(792 "\"bababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababc" nil "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(793 "\"bababbc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababbc" nil nil nil) +(794 "\"babababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babababc" nil nil nil) +(795 "\"aaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil "aaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(796 "\"aaaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil "aaaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(797 "\"aaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil "aaaaac" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(798 "\"aaaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil "aaaaaac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(799 "\"eeexabc\" =~ /(?m:^).abc$/" "(?m:^).abc$" nil nil nil nil "eeexabc" nil nil nil) (800 "\"eee\\nxabc\" =~ /(?m:^).abc$/" "(?m:^).abc$" nil nil nil nil "eee -xabc" nil 1 0 "xabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(801 "\"abc\" =~ /(?m:^)abc/" "(?m:^)abc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +xabc" nil "xabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(801 "\"abc\" =~ /(?m:^)abc/" "(?m:^)abc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (802 "\"\\nabc\" =~ /(?m:^)abc/" "(?m:^)abc" nil nil nil nil " -abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (803 "\"abc\" =~ -/^abc/" "^abc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +/^abc/" "^abc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (804 "\"\\nabc\" =~ /^abc/" "^abc" nil nil nil nil " -abc" nil 1 0 nil nil) -(805 "\"abc\" =~ /\\Aabc/" "\\Aabc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +abc" nil nil nil) +(805 "\"abc\" =~ /\\Aabc/" "\\Aabc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (806 "\"\\nabc\" =~ /\\Aabc/" "\\Aabc" nil nil nil nil " -abc" nil 1 0 nil nil) -(807 "\"foo\" =~ /(?.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/" nil 1 0 nil nil) -(826 "\"/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\" =~ \"(?>.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" nil 1 0 "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(827 "\"1.230003938\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.230003938" nil 1 0 ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(828 "\"1.875000282\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.875000282" nil 1 0 ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(829 "\"1.235\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.235" nil 1 0 nil nil) -(830 "\"now is the time for all good men to come to the aid of the party\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "now is the time for all good men to come to the aid of the party" nil 1 0 "now is the time for all good men to come to the aid of the party" ("party" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(831 "\"this is not a line with only words and spaces!\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "this is not a line with only words and spaces!" nil 1 0 nil nil) -(832 "\"12345a\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345a" nil 1 0 "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(833 "\"12345+\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345+" nil 1 0 "12345" ("1234" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(834 "\"12345a\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345a" nil 1 0 "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(835 "\"12345+\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345+" nil 1 0 nil nil) -(836 "\"aaab\" =~ /(?>a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil 1 0 "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(837 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(838 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(839 "\"aaabbbccc\" =~ /(?>b)+/" "(?>b)+" nil nil nil nil "aaabbbccc" nil 1 0 "bbb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(840 "\"aaabbbbccccd\" =~ /(?>a+|b+|c+)*c/" "(?>a+|b+|c+)*c" nil nil nil nil "aaabbbbccccd" nil 1 0 "aaabbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(841 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil 1 0 "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(842 "\"(abc)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc)" nil 1 0 "(abc)" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(843 "\"(abc(def)xyz)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc(def)xyz)" nil 1 0 "(abc(def)xyz)" ("xyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(844 "\"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" nil 1 0 nil nil) -(845 "\"ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(846 "\"Ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "Ab" nil 1 0 "Ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(847 "\"aB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "aB" nil 1 0 nil nil) -(848 "\"AB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "AB" nil 1 0 nil nil) -(849 "\"a bcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcd e" nil 1 0 "a bcd e" ("a bc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(850 "\"a b cd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a b cd e" nil 1 0 nil nil) -(851 "\"abcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "abcd e" nil 1 0 nil nil) -(852 "\"a bcde\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcde" nil 1 0 nil nil) -(853 "\"a bcde f\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "a bcde f" nil 1 0 "a bcde f" ("a bcde f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(854 "\"abcdef\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "abcdef" nil 1 0 nil nil) -(855 "\"abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abc" nil 1 0 "abc" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(856 "\"aBc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBc" nil 1 0 "aBc" ("aB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(857 "\"abC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abC" nil 1 0 nil nil) -(858 "\"aBC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBC" nil 1 0 nil nil) -(859 "\"Abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "Abc" nil 1 0 nil nil) -(860 "\"ABc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABc" nil 1 0 nil nil) -(861 "\"ABC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABC" nil 1 0 nil nil) -(862 "\"AbC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "AbC" nil 1 0 nil nil) -(863 "\"abc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(864 "\"aBc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBc" nil 1 0 "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(865 "\"ABC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "ABC" nil 1 0 nil nil) -(866 "\"abC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abC" nil 1 0 nil nil) -(867 "\"aBC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBC" nil 1 0 nil nil) -(868 "\"aBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBc" nil 1 0 "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(869 "\"aBBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBc" nil 1 0 "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(870 "\"aBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBC" nil 1 0 nil nil) -(871 "\"aBBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBC" nil 1 0 nil nil) -(872 "\"abcd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(873 "\"abCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abCd" nil 1 0 "abCd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(874 "\"aBCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "aBCd" nil 1 0 nil nil) -(875 "\"abcD\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcD" nil 1 0 nil nil) -(876 "\"more than million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than million" nil 1 0 "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(877 "\"more than MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than MILLION" nil 1 0 "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +zzz" nil nil nil) +(825 "\"/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/\" =~ \"(?>.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/" nil nil nil) +(826 "\"/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\" =~ \"(?>.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(827 "\"1.230003938\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.230003938" nil ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(828 "\"1.875000282\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.875000282" nil ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(829 "\"1.235\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.235" nil nil nil) +(830 "\"now is the time for all good men to come to the aid of the party\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "now is the time for all good men to come to the aid of the party" nil "now is the time for all good men to come to the aid of the party" ("party" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(831 "\"this is not a line with only words and spaces!\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "this is not a line with only words and spaces!" nil nil nil) +(832 "\"12345a\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345a" nil "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(833 "\"12345+\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345+" nil "12345" ("1234" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(834 "\"12345a\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345a" nil "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(835 "\"12345+\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345+" nil nil nil) +(836 "\"aaab\" =~ /(?>a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(837 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(838 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(839 "\"aaabbbccc\" =~ /(?>b)+/" "(?>b)+" nil nil nil nil "aaabbbccc" nil "bbb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(840 "\"aaabbbbccccd\" =~ /(?>a+|b+|c+)*c/" "(?>a+|b+|c+)*c" nil nil nil nil "aaabbbbccccd" nil "aaabbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(841 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(842 "\"(abc)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc)" nil "(abc)" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(843 "\"(abc(def)xyz)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc(def)xyz)" nil "(abc(def)xyz)" ("xyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(844 "\"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" nil nil nil) +(845 "\"ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "ab" nil "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(846 "\"Ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "Ab" nil "Ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(847 "\"aB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "aB" nil nil nil) +(848 "\"AB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "AB" nil nil nil) +(849 "\"a bcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcd e" nil "a bcd e" ("a bc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(850 "\"a b cd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a b cd e" nil nil nil) +(851 "\"abcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "abcd e" nil nil nil) +(852 "\"a bcde\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcde" nil nil nil) +(853 "\"a bcde f\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "a bcde f" nil "a bcde f" ("a bcde f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(854 "\"abcdef\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "abcdef" nil nil nil) +(855 "\"abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abc" nil "abc" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(856 "\"aBc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBc" nil "aBc" ("aB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(857 "\"abC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abC" nil nil nil) +(858 "\"aBC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBC" nil nil nil) +(859 "\"Abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "Abc" nil nil nil) +(860 "\"ABc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABc" nil nil nil) +(861 "\"ABC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABC" nil nil nil) +(862 "\"AbC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "AbC" nil nil nil) +(863 "\"abc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(864 "\"aBc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBc" nil "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(865 "\"ABC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "ABC" nil nil nil) +(866 "\"abC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abC" nil nil nil) +(867 "\"aBC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBC" nil nil nil) +(868 "\"aBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBc" nil "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(869 "\"aBBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBc" nil "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(870 "\"aBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBC" nil nil nil) +(871 "\"aBBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBC" nil nil nil) +(872 "\"abcd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcd" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(873 "\"abCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abCd" nil "abCd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(874 "\"aBCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "aBCd" nil nil nil) +(875 "\"abcD\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcD" nil nil nil) +(876 "\"more than million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than million" nil "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(877 "\"more than MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than MILLION" nil "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (878 "\"more \\n than Million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more - than Million" nil 1 0 "more + than Million" nil "more than Million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(879 "\"MORE THAN MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "MORE THAN MILLION" nil 1 0 nil nil) +(879 "\"MORE THAN MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "MORE THAN MILLION" nil nil nil) (880 "\"more \\n than \\n million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than - million" nil 1 0 nil nil) -(881 "\"more than million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than million" nil 1 0 "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(882 "\"more than MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than MILLION" nil 1 0 "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) + million" nil nil nil) +(881 "\"more than million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than million" nil "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(882 "\"more than MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than MILLION" nil "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (883 "\"more \\n than Million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more - than Million" nil 1 0 "more + than Million" nil "more than Million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(884 "\"MORE THAN MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "MORE THAN MILLION" nil 1 0 nil nil) +(884 "\"MORE THAN MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "MORE THAN MILLION" nil nil nil) (885 "\"more \\n than \\n million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than - million" nil 1 0 nil nil) -(886 "\"abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(887 "\"aBbc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBbc" nil 1 0 "aBbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(888 "\"aBBc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBBc" nil 1 0 "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(889 "\"Abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "Abc" nil 1 0 nil nil) -(890 "\"abAb\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abAb" nil 1 0 nil nil) -(891 "\"abbC\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abbC" nil 1 0 nil nil) -(892 "\"abc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(893 "\"aBc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBc" nil 1 0 "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(894 "\"Ab\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "Ab" nil 1 0 nil nil) -(895 "\"abC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abC" nil 1 0 nil nil) -(896 "\"aBC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBC" nil 1 0 nil nil) -(897 "\"abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxc" nil 1 0 "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(898 "\"aBxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "aBxxc" nil 1 0 "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(899 "\"Abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "Abxxc" nil 1 0 nil nil) -(900 "\"ABxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "ABxxc" nil 1 0 nil nil) -(901 "\"abxxC\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxC" nil 1 0 nil nil) -(902 "\"aA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aA" nil 1 0 "aA" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(903 "\"bB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bB" nil 1 0 "bB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(904 "\"aB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aB" nil 1 0 nil nil) -(905 "\"bA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bA" nil 1 0 nil nil) -(906 "\"aa\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(907 "\"b\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(908 "\"bb\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "bb" nil 1 0 "bb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(909 "\"ab\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "ab" nil 1 0 nil nil) -(910 "\"abc:\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "abc:" nil 1 0 "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(911 "\"12\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "12" nil 1 0 "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(912 "\"123\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "123" nil 1 0 nil nil) -(913 "\"xyz\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "xyz" nil 1 0 nil nil) -(914 "\"abc:\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "abc:" nil 1 0 "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(915 "\"12\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "12" nil 1 0 "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(916 "\"123\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "123" nil 1 0 nil nil) -(917 "\"xyz\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "xyz" nil 1 0 nil nil) -(918 "\"foobar\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foobar" nil 1 0 "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(919 "\"cat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "cat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(920 "\"fcat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "fcat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(921 "\"focat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "focat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(922 "\"foocat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foocat" nil 1 0 nil nil) -(923 "\"foobar\" =~ /(?(?a*)*/" "(?>a*)*" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(955 "\"aa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(956 "\"aaaa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(957 "\"abc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abc" nil 1 0 "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(958 "\"abcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabc" nil 1 0 "abcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(959 "\"abcabcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabcabc" nil 1 0 "abcabcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(960 "\"xyz\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "xyz" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(961 "\"a\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(962 "\"aaaaa\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(963 "\"a\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(964 "\"b\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(965 "\"ababab\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "ababab" nil 1 0 "ababab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(966 "\"aaaabcde\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "aaaabcde" nil 1 0 "aaaab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(967 "\"bbbb\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "bbbb" nil 1 0 "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(968 "\"b\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(969 "\"bbbb\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "bbbb" nil 1 0 "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(970 "\"aaa\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "aaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(971 "\"cccc\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "cccc" nil 1 0 "cccc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(972 "\"abab\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "abab" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(973 "\"a\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "a" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(974 "\"aaaa\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "aaaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(975 "\"a\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "a" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(976 "\"b\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "b" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(977 "\"abab\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "abab" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(978 "\"baba\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "baba" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(979 "\"b\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "b" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(980 "\"bbbb\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "bbbb" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(981 "\"aaa\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "aaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(982 "\"c\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "c" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(983 "\"cccc\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "cccc" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(984 "\"baba\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "baba" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(985 "\"a\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(986 "\"aaabcde\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaabcde" nil 1 0 "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(987 "\"aaaaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(988 "\"aabbaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aabbaa" nil 1 0 "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(989 "\"aaaaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aaaaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(990 "\"aabbaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aabbaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(991 "\"12-sep-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-sep-98" nil 1 0 "12-sep-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(992 "\"12-09-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-09-98" nil 1 0 "12-09-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(993 "\"sep-12-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "sep-12-98" nil 1 0 nil nil) -(994 "\"foobarfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfoo" nil 1 0 "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(995 "\"foobarfootling\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfootling" nil 1 0 "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(996 "\"foobar\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobar" nil 1 0 nil nil) -(997 "\"barfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "barfoo" nil 1 0 nil nil) -(998 "\"saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "saturday" nil 1 0 "saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(999 "\"sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "sunday" nil 1 0 "sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1000 "\"Saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Saturday" nil 1 0 "Saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1001 "\"Sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Sunday" nil 1 0 "Sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1002 "\"SATURDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SATURDAY" nil 1 0 "SATURDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1003 "\"SUNDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SUNDAY" nil 1 0 "SUNDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1004 "\"SunDay\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SunDay" nil 1 0 "SunDay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1005 "\"abcx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcx" nil 1 0 "abcx" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1006 "\"aBCx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCx" nil 1 0 "aBCx" ("aBC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1007 "\"bbx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbx" nil 1 0 "bbx" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1008 "\"BBx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBx" nil 1 0 "BBx" ("BB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1009 "\"abcX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcX" nil 1 0 nil nil) -(1010 "\"aBCX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCX" nil 1 0 nil nil) -(1011 "\"bbX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbX" nil 1 0 nil nil) -(1012 "\"BBX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBX" nil 1 0 nil nil) -(1013 "\"ac\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "ac" nil 1 0 "ac" ("ac" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1014 "\"aC\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "aC" nil 1 0 "aC" ("aC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1015 "\"bD\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "bD" nil 1 0 "bD" ("bD" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1016 "\"elephant\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "elephant" nil 1 0 "e" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1017 "\"Europe\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Europe" nil 1 0 "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1018 "\"frog\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "frog" nil 1 0 "f" ("f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1019 "\"France\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "France" nil 1 0 "F" ("F" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1020 "\"Africa\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Africa" nil 1 0 nil nil) -(1021 "\"ab\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "ab" nil 1 0 "ab" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1022 "\"aBd\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aBd" nil 1 0 "aBd" ("aBd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1023 "\"xy\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xy" nil 1 0 "xy" ("xy" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1024 "\"xY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xY" nil 1 0 "xY" ("xY" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1025 "\"zebra\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "zebra" nil 1 0 "z" ("z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1026 "\"Zambesi\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "Zambesi" nil 1 0 "Z" ("Z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1027 "\"aCD\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aCD" nil 1 0 nil nil) -(1028 "\"XY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "XY" nil 1 0 nil nil) + million" nil nil nil) +(886 "\"abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(887 "\"aBbc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBbc" nil "aBbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(888 "\"aBBc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBBc" nil "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(889 "\"Abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "Abc" nil nil nil) +(890 "\"abAb\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abAb" nil nil nil) +(891 "\"abbC\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abbC" nil nil nil) +(892 "\"abc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(893 "\"aBc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBc" nil "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(894 "\"Ab\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "Ab" nil nil nil) +(895 "\"abC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abC" nil nil nil) +(896 "\"aBC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBC" nil nil nil) +(897 "\"abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxc" nil "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(898 "\"aBxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "aBxxc" nil "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(899 "\"Abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "Abxxc" nil nil nil) +(900 "\"ABxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "ABxxc" nil nil nil) +(901 "\"abxxC\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxC" nil nil nil) +(902 "\"aA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aA" nil "aA" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(903 "\"bB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bB" nil "bB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(904 "\"aB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aB" nil nil nil) +(905 "\"bA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bA" nil nil nil) +(906 "\"aa\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "aa" nil "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(907 "\"b\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(908 "\"bb\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "bb" nil "bb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(909 "\"ab\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "ab" nil nil nil) +(910 "\"abc:\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "abc:" nil "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(911 "\"12\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "12" nil "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(912 "\"123\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "123" nil nil nil) +(913 "\"xyz\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "xyz" nil nil nil) +(914 "\"abc:\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "abc:" nil "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(915 "\"12\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "12" nil "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(916 "\"123\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "123" nil nil nil) +(917 "\"xyz\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "xyz" nil nil nil) +(918 "\"foobar\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foobar" nil "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(919 "\"cat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "cat" nil "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(920 "\"fcat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "fcat" nil "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(921 "\"focat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "focat" nil "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(922 "\"foocat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foocat" nil nil nil) +(923 "\"foobar\" =~ /(?(?a*)*/" "(?>a*)*" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(955 "\"aa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(956 "\"aaaa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaaa" nil "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(957 "\"abc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abc" nil "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(958 "\"abcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabc" nil "abcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(959 "\"abcabcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabcabc" nil "abcabcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(960 "\"xyz\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "xyz" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(961 "\"a\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(962 "\"aaaaa\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "aaaaa" nil "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(963 "\"a\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(964 "\"b\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(965 "\"ababab\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "ababab" nil "ababab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(966 "\"aaaabcde\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "aaaabcde" nil "aaaab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(967 "\"bbbb\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "bbbb" nil "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(968 "\"b\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "b" nil "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(969 "\"bbbb\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "bbbb" nil "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(970 "\"aaa\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "aaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(971 "\"cccc\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "cccc" nil "cccc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(972 "\"abab\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "abab" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(973 "\"a\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "a" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(974 "\"aaaa\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "aaaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(975 "\"a\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "a" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(976 "\"b\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "b" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(977 "\"abab\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "abab" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(978 "\"baba\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "baba" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(979 "\"b\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "b" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(980 "\"bbbb\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "bbbb" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(981 "\"aaa\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "aaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(982 "\"c\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "c" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(983 "\"cccc\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "cccc" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(984 "\"baba\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "baba" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(985 "\"a\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(986 "\"aaabcde\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaabcde" nil "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(987 "\"aaaaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aaaaa" nil "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(988 "\"aabbaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aabbaa" nil "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(989 "\"aaaaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aaaaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(990 "\"aabbaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aabbaa" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(991 "\"12-sep-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-sep-98" nil "12-sep-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(992 "\"12-09-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-09-98" nil "12-09-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(993 "\"sep-12-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "sep-12-98" nil nil nil) +(994 "\"foobarfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfoo" nil "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(995 "\"foobarfootling\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfootling" nil "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(996 "\"foobar\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobar" nil nil nil) +(997 "\"barfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "barfoo" nil nil nil) +(998 "\"saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "saturday" nil "saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(999 "\"sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "sunday" nil "sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1000 "\"Saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Saturday" nil "Saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1001 "\"Sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Sunday" nil "Sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1002 "\"SATURDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SATURDAY" nil "SATURDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1003 "\"SUNDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SUNDAY" nil "SUNDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1004 "\"SunDay\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SunDay" nil "SunDay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1005 "\"abcx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcx" nil "abcx" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1006 "\"aBCx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCx" nil "aBCx" ("aBC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1007 "\"bbx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbx" nil "bbx" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1008 "\"BBx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBx" nil "BBx" ("BB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1009 "\"abcX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcX" nil nil nil) +(1010 "\"aBCX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCX" nil nil nil) +(1011 "\"bbX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbX" nil nil nil) +(1012 "\"BBX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBX" nil nil nil) +(1013 "\"ac\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "ac" nil "ac" ("ac" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1014 "\"aC\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "aC" nil "aC" ("aC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1015 "\"bD\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "bD" nil "bD" ("bD" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1016 "\"elephant\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "elephant" nil "e" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1017 "\"Europe\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Europe" nil "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1018 "\"frog\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "frog" nil "f" ("f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1019 "\"France\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "France" nil "F" ("F" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1020 "\"Africa\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Africa" nil nil nil) +(1021 "\"ab\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "ab" nil "ab" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1022 "\"aBd\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aBd" nil "aBd" ("aBd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1023 "\"xy\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xy" nil "xy" ("xy" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1024 "\"xY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xY" nil "xY" ("xY" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1025 "\"zebra\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "zebra" nil "z" ("z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1026 "\"Zambesi\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "Zambesi" nil "Z" ("Z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1027 "\"aCD\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aCD" nil nil nil) +(1028 "\"XY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "XY" nil nil nil) (1029 "\"foo\\nbar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "foo -bar" nil 1 0 "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1030 "\"bar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "bar" nil 1 0 nil nil) +bar" nil "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1030 "\"bar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "bar" nil nil nil) (1031 "\"baz\\nbar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "baz -bar" nil 1 0 nil nil) -(1032 "\"barbaz\" =~ /(?<=(?]&/" "^[<>]&" nil nil nil nil "<&OUT" nil 1 0 "<&" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1369 "\"aaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1370 "\"AB\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "AB" nil 1 0 nil nil) -(1371 "\"aaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaa" nil 1 0 nil nil) -(1372 "\"aaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaa" nil 1 0 nil nil) -(1373 "\"aaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1374 "\"aaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaa" nil 1 0 nil nil) -(1375 "\"aaaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaaa" nil 1 0 nil nil) -(1376 "\"foobar\" =~ /(?:(f)(o)(o)|(b)(a)(r))*/" "(?:(f)(o)(o)|(b)(a)(r))*" nil nil nil nil "foobar" nil 1 0 "foobar" ("f" "o" "o" "b" "a" "r" nil nil nil nil nil nil nil nil nil nil)) -(1377 "\"ab\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "ab" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1378 "\"cb\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "cb" nil 1 0 nil nil) -(1379 "\"b\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "b" nil 1 0 nil nil) -(1380 "\"ab\" =~ /(?]&/" "^[<>]&" nil nil nil nil "<&OUT" nil "<&" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1369 "\"aaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaa" nil "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1370 "\"AB\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "AB" nil nil nil) +(1371 "\"aaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaa" nil nil nil) +(1372 "\"aaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaa" nil nil nil) +(1373 "\"aaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaa" nil "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1374 "\"aaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaa" nil nil nil) +(1375 "\"aaaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaaa" nil nil nil) +(1376 "\"foobar\" =~ /(?:(f)(o)(o)|(b)(a)(r))*/" "(?:(f)(o)(o)|(b)(a)(r))*" nil nil nil nil "foobar" nil "foobar" ("f" "o" "o" "b" "a" "r" nil nil nil nil nil nil nil nil nil nil)) +(1377 "\"ab\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "ab" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1378 "\"cb\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "cb" nil nil nil) +(1379 "\"b\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "b" nil nil nil) +(1380 "\"ab\" =~ /(?a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil 1 0 "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1491 "\"a:[b]:\" =~ /([[:]+)/" "([[:]+)" nil nil nil nil "a:[b]:" nil 1 0 ":[" (":[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1492 "\"a=[b]=\" =~ /([[=]+)/" "([[=]+)" nil nil nil nil "a=[b]=" nil 1 0 "=[" ("=[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1493 "\"a.[b].\" =~ /([[.]+)/" "([[.]+)" nil nil nil nil "a.[b]." nil 1 0 ".[" (".[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1494 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1495 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1496 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil 1 0 "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1497 "\"aaab\" =~ /a\\Z/" "a\\Z" nil nil nil nil "aaab" nil 1 0 nil nil) +" nil "b" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1456 "\"a\" =~ /(?(1)b|a)/" "(?(1)b|a)" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1457 "\"a\" =~ /(x)?(?(1)a|b)/" "(x)?(?(1)a|b)" nil nil nil nil "a" nil nil nil) +(1458 "\"a\" =~ /(x)?(?(1)a|b)/" "(x)?(?(1)a|b)" nil nil nil nil "a" nil nil nil) +(1459 "\"a\" =~ /(x)?(?(1)b|a)/" "(x)?(?(1)b|a)" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1460 "\"a\" =~ /()?(?(1)b|a)/" "()?(?(1)b|a)" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1461 "\"a\" =~ /()?(?(1)a|b)/" "()?(?(1)a|b)" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1462 "\"(blah)\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "(blah)" nil "(blah)" ("(" ")" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1463 "\"blah\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "blah" nil "blah" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1464 "\"a\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "a" nil nil nil) +(1465 "\"blah)\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "blah)" nil nil nil) +(1466 "\"(blah\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "(blah" nil nil nil) +(1467 "\"(blah)\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "(blah)" nil "(blah)" ("(" ")" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1468 "\"blah\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "blah" nil "blah" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1469 "\"blah)\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "blah)" nil nil nil) +(1470 "\"(blah\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "(blah" nil nil nil) +(1471 "\"a\" =~ /(?(?!a)b|a)/" "(?(?!a)b|a)" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1472 "\"a\" =~ /(?(?=a)b|a)/" "(?(?=a)b|a)" nil nil nil nil "a" nil nil nil) +(1473 "\"a\" =~ /(?(?=a)b|a)/" "(?(?=a)b|a)" nil nil nil nil "a" nil nil nil) +(1474 "\"a\" =~ /(?(?=a)a|b)/" "(?(?=a)a|b)" nil nil nil nil "a" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1475 "\"aaab\" =~ /(?=(a+?))(\\1ab)/" "(?=(a+?))(\\1ab)" nil nil nil nil "aaab" nil "aab" ("a" "aab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1476 "\"one:\" =~ /(\\w+:)+/" "(\\w+:)+" nil nil nil nil "one:" nil "one:" ("one:" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1477 "\"a\" =~ /$(?<=^(a))/" "$(?<=^(a))" nil nil nil nil "a" nil "" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1478 "\"aaab\" =~ /(?=(a+?))(\\1ab)/" "(?=(a+?))(\\1ab)" nil nil nil nil "aaab" nil "aab" ("a" "aab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1479 "\"aaab\" =~ /^(?=(a+?))\\1ab/" "^(?=(a+?))\\1ab" nil nil nil nil "aaab" nil nil nil) +(1480 "\"aaab\" =~ /^(?=(a+?))\\1ab/" "^(?=(a+?))\\1ab" nil nil nil nil "aaab" nil nil nil) +(1481 "\"abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd" nil "abcd" (nil "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1482 "\"xy:z:::abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "xy:z:::abcd" nil "xy:z:::abcd" ("xy:z:::" "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1483 "\"aexycd\" =~ /^[^bcd]*(c+)/" "^[^bcd]*(c+)" nil nil nil nil "aexycd" nil "aexyc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1484 "\"caab\" =~ /(a*)b+/" "(a*)b+" nil nil nil nil "caab" nil "aab" ("aa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1485 "\"abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd" nil "abcd" (nil "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1486 "\"xy:z:::abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "xy:z:::abcd" nil "xy:z:::abcd" ("xy:z:::" "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1487 "\"abcd:\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd:" nil nil nil) +(1488 "\"abcd:\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd:" nil nil nil) +(1489 "\"aexycd\" =~ /^[^bcd]*(c+)/" "^[^bcd]*(c+)" nil nil nil nil "aexycd" nil "aexyc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1490 "\"aaab\" =~ /(?>a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1491 "\"a:[b]:\" =~ /([[:]+)/" "([[:]+)" nil nil nil nil "a:[b]:" nil ":[" (":[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1492 "\"a=[b]=\" =~ /([[=]+)/" "([[=]+)" nil nil nil nil "a=[b]=" nil "=[" ("=[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1493 "\"a.[b].\" =~ /([[.]+)/" "([[.]+)" nil nil nil nil "a.[b]." nil ".[" (".[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1494 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1495 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1496 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1497 "\"aaab\" =~ /a\\Z/" "a\\Z" nil nil nil nil "aaab" nil nil nil) (1498 "\"a\\nb\\n\" =~ /a\\Z/" "a\\Z" nil nil nil nil "a b -" nil 1 0 nil nil) +" nil nil nil) (1499 "\"a\\nb\\n\" =~ /b\\Z/" "b\\Z" nil nil nil nil "a b -" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (1500 "\"a\\nb\" =~ /b\\Z/" "b\\Z" nil nil nil nil "a -b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +b" nil "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (1501 "\"a\\nb\" =~ /b\\z/" "b\\z" nil nil nil nil "a -b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1502 "\"a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1503 "\"abc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "abc" nil 1 0 "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1504 "\"a-b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-b" nil 1 0 "a-b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1505 "\"0-9\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "0-9" nil 1 0 "0-9" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1506 "\"a.b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.b" nil 1 0 "a.b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1507 "\"5.6.7\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "5.6.7" nil 1 0 "5.6.7" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1508 "\"the.quick.brown.fox\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox" nil 1 0 "the.quick.brown.fox" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1509 "\"a100.b200.300c\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a100.b200.300c" nil 1 0 "a100.b200.300c" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1510 "\"12-ab.1245\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "12-ab.1245" nil 1 0 "12-ab.1245" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1511 "\"\\\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "" nil 1 0 nil nil) -(1512 "\".a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil ".a" nil 1 0 nil nil) -(1513 "\"-a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "-a" nil 1 0 nil nil) -(1514 "\"a-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-" nil 1 0 nil nil) -(1515 "\"a.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a." nil 1 0 nil nil) -(1516 "\"a_b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a_b" nil 1 0 nil nil) -(1517 "\"a.-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.-" nil 1 0 nil nil) -(1518 "\"a..\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.." nil 1 0 nil nil) -(1519 "\"ab..bc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "ab..bc" nil 1 0 nil nil) -(1520 "\"the.quick.brown.fox-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox-" nil 1 0 nil nil) -(1521 "\"the.quick.brown.fox.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox." nil 1 0 nil nil) -(1522 "\"the.quick.brown.fox_\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox_" nil 1 0 nil nil) -(1523 "\"the.quick.brown.fox+\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox+" nil 1 0 nil nil) -(1524 "\"alphabetabcd\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "alphabetabcd" nil 1 0 "alphabetabcd" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1525 "\"endingwxyz\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "endingwxyz" nil 1 0 "endingwxyz" ("wxyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1526 "\"a rather long string that doesn't end with one of them\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "a rather long string that doesn't end with one of them" nil 1 0 nil nil) -(1527 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil 1 0 "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1528 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil 1 0 nil nil) -(1529 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?>[a-zA-Z0-9]+ ){0,30}otherword/" "word (?>[a-zA-Z0-9]+ ){0,30}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil 1 0 nil nil) -(1530 "\"999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1531 "\"123999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1532 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123abcfoo" nil 1 0 nil nil) -(1533 "\"999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1534 "\"123999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1535 "\"123abcfoo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123abcfoo" nil 1 0 nil nil) -(1536 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123abcfoo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1537 "\"123456foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123456foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1538 "\"123999foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123999foo" nil 1 0 nil nil) -(1539 "\"123abcfoo\" =~ /(?<=\\d{3}...)(?(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a" nil "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1503 "\"abc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "abc" nil "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1504 "\"a-b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-b" nil "a-b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1505 "\"0-9\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "0-9" nil "0-9" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1506 "\"a.b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.b" nil "a.b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1507 "\"5.6.7\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "5.6.7" nil "5.6.7" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1508 "\"the.quick.brown.fox\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox" nil "the.quick.brown.fox" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1509 "\"a100.b200.300c\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a100.b200.300c" nil "a100.b200.300c" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1510 "\"12-ab.1245\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "12-ab.1245" nil "12-ab.1245" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1511 "\"\\\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "" nil nil nil) +(1512 "\".a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil ".a" nil nil nil) +(1513 "\"-a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "-a" nil nil nil) +(1514 "\"a-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-" nil nil nil) +(1515 "\"a.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a." nil nil nil) +(1516 "\"a_b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a_b" nil nil nil) +(1517 "\"a.-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.-" nil nil nil) +(1518 "\"a..\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.." nil nil nil) +(1519 "\"ab..bc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "ab..bc" nil nil nil) +(1520 "\"the.quick.brown.fox-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox-" nil nil nil) +(1521 "\"the.quick.brown.fox.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox." nil nil nil) +(1522 "\"the.quick.brown.fox_\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox_" nil nil nil) +(1523 "\"the.quick.brown.fox+\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox+" nil nil nil) +(1524 "\"alphabetabcd\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "alphabetabcd" nil "alphabetabcd" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1525 "\"endingwxyz\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "endingwxyz" nil "endingwxyz" ("wxyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1526 "\"a rather long string that doesn't end with one of them\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "a rather long string that doesn't end with one of them" nil nil nil) +(1527 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1528 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil nil nil) +(1529 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?>[a-zA-Z0-9]+ ){0,30}otherword/" "word (?>[a-zA-Z0-9]+ ){0,30}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil nil nil) +(1530 "\"999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1531 "\"123999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1532 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123abcfoo" nil nil nil) +(1533 "\"999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1534 "\"123999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123999foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1535 "\"123abcfoo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123abcfoo" nil nil nil) +(1536 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123abcfoo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1537 "\"123456foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123456foo" nil "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1538 "\"123999foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123999foo" nil nil nil) +(1539 "\"123abcfoo\" =~ /(?<=\\d{3}...)(?\\s*)=(?>\\s*) # find
\\s*)=(?>\\s*) # find \\s*)=(?>\\s*) # find Z)+|A)*/" "((?>Z)+|A)*" nil nil nil nil "ZABCDEFG" nil 1 0 "ZA" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1555 "\"ZABCDEFG\" =~ /((?>)+|A)*/" "((?>)+|A)*" nil nil nil nil "ZABCDEFG" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1556 "\"abbab\" =~ /a*/" "a*" nil nil nil nil "abbab" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1557 "\"abcde\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "abcde" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1558 "\"-things\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "-things" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1559 "\"0digit\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "0digit" nil 1 0 "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1560 "\"bcdef\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "bcdef" nil 1 0 nil nil) -(1561 "\"abcde\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "abcde" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1562 "\"-things\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "-things" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1563 "\"0digit\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "0digit" nil 1 0 "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1564 "\"bcdef\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "bcdef" nil 1 0 nil nil) -(1565 "\"abcdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcdef" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1566 "\"abcxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1567 "\"abcxdefxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1568 "\"abcdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcdef" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1569 "\"abcxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1570 "\"abcxdefxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1571 "\"abcdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcdef" nil 1 0 nil nil) -(1572 "\"abcxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1573 "\"abcxdefxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1574 "\"abcdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcdef" nil 1 0 nil nil) -(1575 "\"abcxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1576 "\"abcxdefxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1577 "\"-abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "-abcdef" nil 1 0 "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1578 "\"abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "abcdef" nil 1 0 "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1579 "\"-abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "-abcdef" nil 1 0 "-abcdef" ("-abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1580 "\"abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "abcdef" nil 1 0 "bcdef" ("bcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1581 "\"'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1582 "\"'b'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1583 "\"x'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "x'a'" nil 1 0 nil nil) -(1584 "\"'a'x\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'x" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1585 "\"'ab'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'ab'" nil 1 0 nil nil) -(1586 "\"'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1587 "\"'b'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1588 "\"x'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "x'a'" nil 1 0 nil nil) -(1589 "\"'a'x\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'x" nil 1 0 nil nil) -(1590 "\"'ab'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'ab'" nil 1 0 nil nil) -(1591 "\"'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1592 "\"'b'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1593 "\"x'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "x'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1594 "\"'a'x\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'x" nil 1 0 nil nil) -(1595 "\"'ab'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'ab'" nil 1 0 nil nil) -(1596 "\"'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1597 "\"'b'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1598 "\"x'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "x'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1599 "\"'a'x\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'x" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1600 "\"'ab'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'ab'" nil 1 0 nil nil) -(1601 "\"abc\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1602 "\"abcE\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abcE" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1603 "\"abcx\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcx" nil 1 0 "abcx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1604 "\"abcE\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcE" nil 1 0 nil nil) -(1605 "\"a*\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a*" nil 1 0 "a*" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1606 "\"a\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a" nil 1 0 nil nil) -(1607 "\"a*x\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*x" nil 1 0 "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1608 "\"a*\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*" nil 1 0 nil nil) -(1609 "\"a*x\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*x" nil 1 0 "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1610 "\"a*\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*" nil 1 0 nil nil) -(1611 "\"a*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a*x" nil 1 0 nil nil) -(1612 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a\\*x" nil 1 0 "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1613 "\"a*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a*x" nil 1 0 nil nil) -(1614 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a\\*x" nil 1 0 "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1615 "\"a[x]\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "a[x]" nil 1 0 "a[x]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1616 "\"ax\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "ax" nil 1 0 nil nil) +" t nil t t "Z)+|A)*/" "((?>Z)+|A)*" nil nil nil nil "ZABCDEFG" nil "ZA" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1555 "\"ZABCDEFG\" =~ /((?>)+|A)*/" "((?>)+|A)*" nil nil nil nil "ZABCDEFG" nil "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1556 "\"abbab\" =~ /a*/" "a*" nil nil nil nil "abbab" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1557 "\"abcde\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "abcde" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1558 "\"-things\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "-things" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1559 "\"0digit\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "0digit" nil "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1560 "\"bcdef\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "bcdef" nil nil nil) +(1561 "\"abcde\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "abcde" nil "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1562 "\"-things\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "-things" nil "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1563 "\"0digit\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "0digit" nil "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1564 "\"bcdef\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "bcdef" nil nil nil) +(1565 "\"abcdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcdef" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1566 "\"abcxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1567 "\"abcxdefxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdefxdef" nil "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1568 "\"abcdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcdef" nil "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1569 "\"abcxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1570 "\"abcxdefxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdefxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1571 "\"abcdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcdef" nil nil nil) +(1572 "\"abcxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1573 "\"abcxdefxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdefxdef" nil "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1574 "\"abcdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcdef" nil nil nil) +(1575 "\"abcxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1576 "\"abcxdefxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdefxdef" nil "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1577 "\"-abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "-abcdef" nil "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1578 "\"abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "abcdef" nil "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1579 "\"-abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "-abcdef" nil "-abcdef" ("-abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1580 "\"abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "abcdef" nil "bcdef" ("bcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1581 "\"'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1582 "\"'b'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1583 "\"x'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "x'a'" nil nil nil) +(1584 "\"'a'x\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'x" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1585 "\"'ab'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'ab'" nil nil nil) +(1586 "\"'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1587 "\"'b'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1588 "\"x'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "x'a'" nil nil nil) +(1589 "\"'a'x\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'x" nil nil nil) +(1590 "\"'ab'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'ab'" nil nil nil) +(1591 "\"'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1592 "\"'b'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1593 "\"x'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "x'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1594 "\"'a'x\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'x" nil nil nil) +(1595 "\"'ab'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'ab'" nil nil nil) +(1596 "\"'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1597 "\"'b'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'b'" nil "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1598 "\"x'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "x'a'" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1599 "\"'a'x\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'x" nil "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1600 "\"'ab'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'ab'" nil nil nil) +(1601 "\"abc\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abc" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1602 "\"abcE\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abcE" nil "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1603 "\"abcx\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcx" nil "abcx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1604 "\"abcE\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcE" nil nil nil) +(1605 "\"a*\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a*" nil "a*" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1606 "\"a\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a" nil nil nil) +(1607 "\"a*x\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*x" nil "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1608 "\"a*\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*" nil nil nil) +(1609 "\"a*x\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*x" nil "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1610 "\"a*\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*" nil nil nil) +(1611 "\"a*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a*x" nil nil nil) +(1612 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a\\*x" nil "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1613 "\"a*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a*x" nil nil nil) +(1614 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a\\*x" nil "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1615 "\"a[x]\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "a[x]" nil "a[x]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1616 "\"ax\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "ax" nil nil nil) (1617 "\"a\" =~ /a#comment\\Q... {2}/x" "a#comment\\Q... -{2}" nil nil nil t "a" nil 1 0 nil nil) +{2}" nil nil nil t "a" nil nil nil) (1618 "\"aa\" =~ /a#comment\\Q... {2}/x" "a#comment\\Q... -{2}" nil nil nil t "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +{2}" nil nil nil t "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (1619 "\"a\" =~ /a(?#comment\\Q... ){2}/x" "a(?#comment\\Q... -){2}" nil nil nil t "a" nil 1 0 nil nil) +){2}" nil nil nil t "a" nil nil nil) (1620 "\"aa\" =~ /a(?#comment\\Q... ){2}/x" "a(?#comment\\Q... -){2}" nil nil nil t "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +){2}" nil nil nil t "aa" nil "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (1621 "\"a.\" =~ /(?x)a#\\Q ./" "(?x)a#\\Q -." nil nil nil nil "a." nil 1 0 "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +." nil nil nil nil "a." nil "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) (1622 "\"aa\" =~ /(?x)a#\\Q ./" "(?x)a#\\Q -." nil nil nil nil "aa" nil 1 0 nil nil) -(1623 "\"abcdxklqj\" =~ /ab(?=.*q)cd/" "ab(?=.*q)cd" nil nil nil nil "abcdxklqj" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) -(1624 "\"ab\" =~ /a(?!.*$)b/" "a(?!.*$)b" nil nil nil nil "ab" nil 1 0 nil nil) -(1625 "\"Axi\" =~ /.{2}[a-z]/" ".{2}[a-z]" nil nil nil nil "Axi" nil 1 0 "Axi" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +." nil nil nil nil "aa" nil nil nil) +(1623 "\"abcdxklqj\" =~ /ab(?=.*q)cd/" "ab(?=.*q)cd" nil nil nil nil "abcdxklqj" nil "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) +(1624 "\"ab\" =~ /a(?!.*$)b/" "a(?!.*$)b" nil nil nil nil "ab" nil nil nil) +(1625 "\"Axi\" =~ /.{2}[a-z]/" ".{2}[a-z]" nil nil nil nil "Axi" nil "Axi" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) diff --git a/testinput b/test/perltestinput similarity index 100% rename from testinput rename to test/perltestinput diff --git a/test/simple b/test/simple new file mode 100644 index 0000000..69c3fe7 --- /dev/null +++ b/test/simple @@ -0,0 +1,349 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/test/simple,v 1.9 2008/07/23 00:48:00 edi Exp $ + +;;; some simple tests for CL-PPCRE - entered manually and to be read +;;; in the CL-PPCRE-TEST package; all forms are expected to return a +;;; true value on success when EVALuated + +(equalp (multiple-value-list (scan "(a)*b" "xaaabd")) + (list 1 5 #(3) #(4))) + +(equalp (multiple-value-list (scan "(a)*b" "xaaabd" :start 1)) + (list 1 5 #(3) #(4))) + +(equalp (multiple-value-list (scan "(a)*b" "xaaabd" :start 2)) + (list 2 5 #(3) #(4))) + +(null (scan "(a)*b" "xaaabd" :end 4)) + +(equalp (multiple-value-list (scan '(:greedy-repetition 0 nil #\b) "bbbc")) + (list 0 3 #() #())) + +(null (scan '(:greedy-repetition 4 6 #\b) "bbbc")) + +(let ((s (create-scanner "(([a-c])+)x"))) + (equalp (multiple-value-list (scan s "abcxy")) + (list 0 4 #(0 2) #(3 3)))) + +(equalp (multiple-value-list (scan-to-strings "[^b]*b" "aaabd")) + (list "aaab" #())) + +(equalp (multiple-value-list (scan-to-strings "([^b])*b" "aaabd")) + (list "aaab" #("a"))) + +(equalp (multiple-value-list (scan-to-strings "(([^b])*)b" "aaabd")) + (list "aaab" #("aaa" "a"))) + +(equalp (register-groups-bind (first second third fourth) + ("((a)|(b)|(c))+" "abababc" :sharedp t) + (list first second third fourth)) + (list "c" "a" "b" "c")) + +(equalp (register-groups-bind (nil second third fourth) + ("((a)|(b)|(c))()+" "abababc" :start 6) + (list second third fourth)) + (list nil nil "c")) + +(null (register-groups-bind (first) + ("(a|b)+" "accc" :start 1) + first)) + +(equalp (register-groups-bind (fname lname (#'parse-integer date month year)) + ("(\\w+)\\s+(\\w+)\\s+(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})" "Frank Zappa 21.12.1940") + (list fname lname (encode-universal-time 0 0 0 date month year 0))) + (list "Frank" "Zappa" 1292889600)) + +(flet ((foo (regex target-string &key (start 0) (end (length target-string))) + (let ((sum 0)) + (do-matches (s e regex target-string nil :start start :end end) + (incf sum (- e s))) + (/ sum (- end start))))) + (and (= 1/3 (foo "a" "abcabcabc")) + (= 5/9 (foo "aa|b" "aacabcbbc")))) + +(labels ((crossfoot (target-string &key (start 0) (end (length target-string))) + (let ((sum 0)) + (do-matches-as-strings (m :digit-class + target-string nil + :start start :end end) + (incf sum (parse-integer m))) + (if (< sum 10) + sum + (crossfoot (format nil "~A" sum)))))) + (and (zerop (crossfoot "bar")) + (= 3 (crossfoot "a3x")) + (= 6 (crossfoot "12345")))) + +(let (result) + (do-register-groups (first second third fourth) + ("((a)|(b)|(c))" "abababc" nil :start 2 :sharedp t) + (push (list first second third fourth) result)) + (equal (nreverse result) + '(("a" "a" nil nil) + ("b" nil "b" nil) + ("a" "a" nil nil) + ("b" nil "b" nil) + ("c" nil nil "c")))) + +(let (result) + (do-register-groups ((#'parse-integer n) (#'intern sign) whitespace) + ("(\\d+)|(\\+|-|\\*|/)|(\\s+)" "12*15 - 42/3") + (unless whitespace + (push (or n sign) result))) + (equal (nreverse result) + '(12 * 15 - 42 / 3))) + +(equal (all-matches "a" "foo bar baz") + (list 5 6 9 10)) + +(equal (all-matches "\\w*" "foo bar baz") + (list 0 3 3 3 4 7 7 7 8 11 11 11)) + +(equal (all-matches-as-strings "a" "foo bar baz") + (list "a" "a")) + +(equal (all-matches-as-strings "\\w*" "foo bar baz") + (list "foo" "" "bar" "" "baz" "")) + +(equal (split "\\s+" "foo bar baz +frob") + '("foo" "bar" "baz" "frob")) + +(equal (split "\\s*" "foo bar baz") + '("f" "o" "o" "b" "a" "r" "b" "a" "z")) + +(equal (split "(\\s+)" "foo bar baz") + '("foo" "bar" "baz")) + +(equal (split "(\\s+)" "foo bar baz" :with-registers-p t) + '("foo" " " "bar" " " "baz")) + +(equal (split "(\\s)(\\s*)" "foo bar baz" :with-registers-p t) + '("foo" " " "" "bar" " " " " "baz")) + +(equal (split "(,)|(;)" "foo,bar;baz" :with-registers-p t) + '("foo" "," nil "bar" nil ";" "baz")) + +(equal (split "(,)|(;)" "foo,bar;baz" :with-registers-p t :omit-unmatched-p t) + '("foo" "," "bar" ";" "baz")) + +(equal (split ":" "a:b:c:d:e:f:g::") + '("a" "b" "c" "d" "e" "f" "g")) + +(equal (split ":" "a:b:c:d:e:f:g::" :limit 1) + '("a:b:c:d:e:f:g::")) + +(equal (split ":" "a:b:c:d:e:f:g::" :limit 2) + '("a" "b:c:d:e:f:g::")) + +(equal (split ":" "a:b:c:d:e:f:g::" :limit 3) + '("a" "b" "c:d:e:f:g::")) + +(equal (split ":" "a:b:c:d:e:f:g::" :limit 1000) + '("a" "b" "c" "d" "e" "f" "g" "" "")) + +(equal (multiple-value-list (regex-replace "fo+" "foo bar" "frob")) + (list "frob bar" t)) + +(equal (multiple-value-list (regex-replace "fo+" "FOO bar" "frob")) + (list "FOO bar" nil)) + +(equal (multiple-value-list (regex-replace "(?i)fo+" "FOO bar" "frob")) + (list "frob bar" t)) + +(equal (multiple-value-list (regex-replace "(?i)fo+" "FOO bar" "frob" :preserve-case t)) + (list "FROB bar" t)) + +(equal (multiple-value-list (regex-replace "(?i)fo+" "Foo bar" "frob" :preserve-case t)) + (list "Frob bar" t)) + +(equal (multiple-value-list (regex-replace "bar" "foo bar baz" "[frob (was '\\&' between '\\`' and '\\'')]")) + (list "foo [frob (was 'bar' between 'foo ' and ' baz')] baz" t)) + +(equal (multiple-value-list + (regex-replace "bar" "foo bar baz" + '("[frob (was '" :match "' between '" :before-match "' and '" :after-match "')]"))) + (list "foo [frob (was 'bar' between 'foo ' and ' baz')] baz" t)) + +(equal (multiple-value-list (regex-replace "(be)(nev)(o)(lent)" + "benevolent: adj. generous, kind" + (lambda (match &rest registers) + (format nil "~A [~{~A~^.~}]" match registers)) + :simple-calls t)) + (list "benevolent [be.nev.o.lent]: adj. generous, kind" t)) + +(equal (multiple-value-list (regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)) + (list "frob Frob FROB bar" t)) + +(string= (regex-replace-all "(?i)f(o+)" "foo Fooo FOOOO bar" "fr\\1b" :preserve-case t) + "froob Frooob FROOOOB bar") + +(let ((qp-regex (create-scanner "[\\x80-\\xff]"))) + (flet ((encode-quoted-printable (string) + "Converts 8-bit string to quoted-printable representation." + ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there + (flet ((convert (target-string start end match-start match-end reg-starts reg-ends) + (declare (ignore start end match-end reg-starts reg-ends)) + (format nil "=~2,'0x" (char-code (char target-string match-start))))) + (regex-replace-all qp-regex string #'convert)))) + (string= (encode-quoted-printable "Fête Sørensen naïve Hühner Straße") + "F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"))) + +(let ((url-regex (create-scanner "[^a-zA-Z0-9_\\-.]"))) + (flet ((url-encode (string) + "URL-encodes a string." + ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there + (flet ((convert (target-string start end match-start match-end reg-starts reg-ends) + (declare (ignore start end match-end reg-starts reg-ends)) + (format nil "%~2,'0x" (char-code (char target-string match-start))))) + (regex-replace-all url-regex string #'convert)))) + (string= (url-encode "Fête Sørensen naïve Hühner Straße") + "F%EAte%20S%F8rensen%20na%EFve%20H%FChner%20Stra%DFe"))) + +(flet ((how-many (target-string start end match-start match-end reg-starts reg-ends) + (declare (ignore target-string start end match-start match-end)) + (format nil "~A" (- (svref reg-ends 0) + (svref reg-starts 0))))) + (string= (regex-replace-all "{(.+?)}" + "foo{...}bar{.....}{..}baz{....}frob" + (list "[" #'how-many " dots]")) + "foo[3 dots]bar[5 dots][2 dots]baz[4 dots]frob")) + +(let ((qp-regex (create-scanner "[\\x80-\\xff]"))) + (flet ((encode-quoted-printable (string) + "Converts 8-bit string to quoted-printable representation. +Version using SIMPLE-CALLS keyword argument." + ;; ;; won't work for Corman Lisp because non-ASCII characters aren't 8-bit there + (flet ((convert (match) + (format nil "=~2,'0x" (char-code (char match 0))))) + (regex-replace-all qp-regex string #'convert + :simple-calls t)))) + (string= (encode-quoted-printable "Fête Sørensen naïve Hühner Straße") + "F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"))) + +(flet ((how-many (match first-register) + (declare (ignore match)) + (format nil "~A" (length first-register)))) + (string= (regex-replace-all "{(.+?)}" + "foo{...}bar{.....}{..}baz{....}frob" + (list "[" #'how-many " dots]") + :simple-calls t) + "foo[3 dots]bar[5 dots][2 dots]baz[4 dots]frob")) + +(flet ((my-repetition (char min) + `(:greedy-repetition ,min nil ,char))) + (setf (parse-tree-synonym 'a*) (my-repetition #\a 0) + (parse-tree-synonym 'b+) (my-repetition #\b 1)) + (unwind-protect + (let ((scanner (create-scanner '(:sequence a* b+)))) + (equal (mapcar (lambda (target) + (scan scanner target)) + '("ab" "b" "aab" "a" "x")) + (list 0 0 0 nil nil))) + (setf (parse-tree-synonym 'a*) nil + (parse-tree-synonym 'b+) nil))) + +(null (scan "^a+$" "a+")) + +(let ((*allow-quoting* t)) + ;;we use CREATE-SCANNER because of Lisps like SBCL that don't have an interpreter + (equalp (multiple-value-list (scan (create-scanner "^\\Qa+\\E$") "a+")) + (list 0 2 #() #()))) + +(string= (parse-string "\\k") "k") + +(let ((*allow-named-registers* t)) + (equal (nth-value 1 (create-scanner "((?[a-z]*)(?[A-Z]*))")) + (list nil "small" "big"))) + +(let ((*allow-named-registers* t)) + (equal (nth-value 1 (create-scanner '(:register + (:sequence + (:named-register "small" + (:greedy-repetition 0 nil (:char-class (:range #\a #\z)))) + (:named-register "big" + (:greedy-repetition 0 nil (:char-class (:range #\a #\z)))))))) + (list nil "small" "big"))) + +(let ((*allow-named-registers* t)) + (equalp (multiple-value-list (scan (create-scanner "((?[a-z]*)(?[A-Z]*))") "aaaBBB")) + (list 0 6 #(0 0 3) #(6 3 6)))) + +(let ((*allow-named-registers* t)) + ;; multiple-choice back-reference + (equalp (multiple-value-list (scan (create-scanner "^(?[ab])(?[12])\\k\\k$") "a1aa")) + (list 0 4 #(0 1) #(1 2)))) + +(let ((*allow-named-registers* t)) + (equalp (multiple-value-list (scan (create-scanner "^(?[ab])(?[12])\\k\\k$") "a22a")) + (list 0 4 #(0 1) #(1 2)))) + +(let ((*allow-named-registers* t)) + ;; demonstrating most-recently-seen-register-first property of back-reference; + ;; "greedy" regex (analogous to "aa?") + (equalp (multiple-value-list (scan (create-scanner "^(?)(?a)(\\k)") "a")) + (list 0 1 #(0 0 1) #(0 1 1)))) + +(let ((*allow-named-registers* t)) + (equalp (multiple-value-list (scan (create-scanner "^(?)(?a)(\\k)") "aa")) + (list 0 2 #(0 0 1) #(0 1 2)))) + +(let ((*allow-named-registers* t)) + ;; switched groups + ;; "lazy" regex (analogous to "aa??") + (equalp (multiple-value-list (scan (create-scanner "^(?a)(?)(\\k)") "a")) + (list 0 1 #(0 1 1) #(1 1 1)))) + +(let ((*allow-named-registers* t)) + ;; scanner ignores the second "a" + (equalp (multiple-value-list (scan (create-scanner "^(?a)(?)(\\k)") "aa")) + (list 0 1 #(0 1 1) #(1 1 1)))) + +(let ((*allow-named-registers* t)) + ;; "aa" will be matched only when forced by adding "$" at the end + (equalp (multiple-value-list (scan (create-scanner "^(?a)(?)(\\k)$") "aa")) + (list 0 2 #(0 1 1) #(1 1 2)))) + +(string= (quote-meta-chars "[a-z]*") "\\[a\\-z\\]\\*") + +(string= (handler-case + (create-scanner "foo**x") + (ppcre-syntax-error (condition) + (format nil "Houston, we've got a problem with the string ~S: Looks like something went wrong at position ~A. The last message we received was \"~?\"." + (ppcre-syntax-error-string condition) + (ppcre-syntax-error-pos condition) + (simple-condition-format-control condition) + (simple-condition-format-arguments condition)))) + "Houston, we've got a problem with the string \"foo**x\": Looks like something went wrong at position 4. The last message we received was \"Quantifier '*' not allowed.\".") + +(flet ((my-weird-filter (pos) + "Only match at this point if either pos is odd and the +character we're looking at is lowercase or if pos is even and the next +two characters we're looking at are uppercase. Consume these +characters if there's a match." + (cond ((and (oddp pos) + (< pos cl-ppcre::*end-pos*) + (lower-case-p (char cl-ppcre::*string* pos))) + (1+ pos)) + ((and (evenp pos) + (< (1+ pos) cl-ppcre::*end-pos*) + (upper-case-p (char cl-ppcre::*string* pos)) + (upper-case-p (char cl-ppcre::*string* (1+ pos)))) + (+ pos 2)) + (t nil)))) + (let ((weird-regex `(:sequence "+" (:filter ,#'my-weird-filter) "+"))) + (equalp (multiple-value-list (scan weird-regex "+A++a+AA+")) + (list 5 9 #() #())))) + +(let ((a "\\E*")) + (equalp (multiple-value-list (scan (concatenate 'string "(?:" (quote-meta-chars a) "){2}") "\\E*\\E*")) + (list 0 6 #() #()))) + +(let ((a "\\E*")) + (equalp (multiple-value-list (scan `(:greedy-repetition 2 2 ,a) "\\E*\\E*")) + (list 0 6 #() #()))) + +(loop for *optimize-char-classes* in '(:hash-table :hash-table* :charset :charset* :charmap) + for s = (create-scanner "(([a-c])+)x") + always (equalp (multiple-value-list (scan s "abcxy")) + (list 0 4 #(0 2) #(3 3)))) diff --git a/test/tests.lisp b/test/tests.lisp new file mode 100644 index 0000000..b804683 --- /dev/null +++ b/test/tests.lisp @@ -0,0 +1,159 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/test/tests.lisp,v 1.12 2008/07/23 00:48:00 edi Exp $ + +;;; The tests in this file test CL-PPCRE against testdata generated by +;;; the Perl program `perltest.pl' from the input file `testinput' in +;;; order to check compatibility with Perl and correctness of the +;;; regex engine. + +;;; Copyright (c) 2002-2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-ppcre-test) + +(defvar *this-file* (load-time-value + (or #.*compile-file-pathname* *load-pathname*)) + "The location of this source file.") + +(defmacro do-tests ((name &optional show-progress-p) &body body) + "Helper macro which repeatedly executes BODY until the code in body +calls the function DONE. It is assumed that each invocation of BODY +will be the execution of one test which returns NIL in case of success +and list of string describing errors otherwise. + +The macro prints a simple progress indicator \(one dots for ten tests) +to *STANDARD-OUTPUT* unless SHOW-PROGRESS-P is NIL and returns a true +value iff all tests succeeded. Errors in BODY are caught and reported +\(and counted as failures)." + `(let ((successp t) + (testcount 1)) + (block test-block + (flet ((done () + (return-from test-block successp))) + (format t "~&Test: ~A~%" ,name) + (loop + (when (and ,show-progress-p (zerop (mod testcount 10))) + (format t ".") + (when (zerop (mod testcount 100)) + (terpri)) + (force-output)) + (let ((errors + (handler-case + (progn ,@body) + (error (msg) + (list (format nil "~&got an unexpected error: ~A" msg)))))) + (setq successp (and successp (null errors))) + (when errors + (format t "~&~4@A:~{~& ~A~}~%" testcount errors)) + (incf testcount))))) + successp)) + +(defun simple-tests (&key (file-name + (make-pathname :name "simple" + :type nil :version nil + :defaults *this-file*)) + (external-format '(:latin-1 :eol-style :lf)) + verbose) + "Loops through all the forms in the file FILE-NAME and executes each +of them using EVAL. It is assumed that each FORM specifies a test +which returns a true value iff it succeeds. Prints each test form to +*STANDARD-OUTPUT* if VERBOSE is true and shows a simple progress +indicator otherwise. EXTERNAL-FORMAT is the FLEXI-STREAMS external +format which is used to read the file. Returns a true value iff all +tests succeeded." + (with-open-file (binary-stream file-name :element-type 'flex:octet) + (let ((stream (flex:make-flexi-stream binary-stream :external-format external-format)) + (*package* (find-package :cl-ppcre-test))) + (do-tests ((format nil "Simple tests from file ~S" (file-namestring file-name)) + (not verbose)) + (let ((form (or (read stream nil) (done)))) + (when verbose + (format t "~&~S" form)) + (cond ((eval form) nil) + (t (list (format nil "~S returned NIL" form))))))))) + +(defun random-test-function (probability) + "Returns a random character test function which contains each +character with probability PROBABILITY." + (let ((hash-table (make-hash-table))) + (dotimes (code char-code-limit) + (let ((char (code-char code))) + (when (and char (< (random 1.0d0) probability)) + (setf (gethash (code-char code) hash-table) t)))) + (lambda (char) + (gethash char hash-table)))) + +(defun test-optimized-test-functions% (probability) + "Creates a random test function with probability PROBABILITY and six +\(one for each possible \"kind\") corresponding optimized test +functions, then checks for each character in turn that all functions +agree on it." + (let* ((test-function (random-test-function probability)) + (optimized-functions (loop for kind in '(nil + :hash-table + :hash-table* + :charset + :charset* + :charmap) + collect (create-optimized-test-function test-function :kind kind)))) + (loop for code below char-code-limit + for char = (code-char code) + for expected-result = (and char (funcall test-function char)) + always (or (null char) + (loop for optimized-function in optimized-functions + always (eq (not (funcall optimized-function char)) + (not expected-result))))))) + +(defun test-optimized-test-functions (&key verbose) + "Runs TEST-OPTIMIZED-TEST-FUNCTIONS% with different probabilities." + (let ((probabilities '(0 .001 .01 .1 1))) + (do-tests ("Optimized test functions - this might take some time..." (not verbose)) + (let ((probability (or (pop probabilities) (done)))) + (when verbose + (format t "~&Probability is ~A" probability)) + (not (test-optimized-test-functions% probability)))))) + +(defun run-all-tests (&key more-tests verbose) + "Runs all tests for CL-PPCRE and returns a true value iff all tests +succeeded. VERBOSE is interpreted by the individual test suites. +MORE-TESTS can be a list of function designators designating +additional tests to run. This facility is used by the tests for +CL-PPCRE-UNICODE." + (let ((successp t)) + (macrolet ((run-test-suite (&body body) + `(unless (progn ,@body) + (setq successp nil)))) + ;; run the automatically generated Perl tests + (run-test-suite (perl-test :verbose verbose)) + (run-test-suite (test-optimized-test-functions :verbose verbose)) + (run-test-suite (simple-tests :verbose verbose)) + (when more-tests + (unless (listp more-tests) + (setq more-tests (list more-tests)) + (dolist (test more-tests) + (run-test-suite (funcall test :verbose verbose)))))) + (format t "~2&~:[Some tests failed~;All tests passed~]." successp) + successp)) diff --git a/test/unicode-tests.lisp b/test/unicode-tests.lisp new file mode 100644 index 0000000..7058405 --- /dev/null +++ b/test/unicode-tests.lisp @@ -0,0 +1,80 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/test/unicode-tests.lisp,v 1.8 2008/07/23 00:17:53 edi Exp $ + +;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved. + +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: + +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. + +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. + +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(in-package :cl-ppcre-test) + +(defun unicode-test (&key (file-name + (make-pathname :name "unicodetestdata" + :type nil :version nil + :defaults *this-file*) + file-name-provided-p) + verbose) + "Loops through all test cases in FILE-NAME and prints a report if +VERBOSE is true. Returns a true value if all tests succeeded. + +For the syntax of the tests in FILE-NAME refer to CL-UNICODE." + (with-open-file (stream file-name) + (let ((*regex-char-code-limit* (if file-name-provided-p *regex-char-code-limit* char-code-limit)) + (*optimize-char-classes* (if file-name-provided-p *optimize-char-classes* nil)) + ;; we only check for correctness and don't care about speed + ;; that match (but rather about space constraints of the + ;; trial versions) + (*use-bmh-matchers* (if file-name-provided-p *use-bmh-matchers* nil))) + (do-tests ((format nil "Running Unicode tests in file ~S" (file-namestring file-name)) + (not verbose)) + (let ((input-line (or (read stream nil) (done))) + errors) + (destructuring-bind (char-code property-name expected-result) + input-line + (let ((char (and (< char-code char-code-limit) (code-char char-code)))) + (when char + (when verbose + (format t "~&~A: #x~X" property-name char-code)) + (let* ((string (string char)) + (result-1 (scan (format nil "\\p{~A}" property-name) string)) + (result-2 (scan (format nil "[\\p{~A}]" property-name) string)) + (inverted-result-1 (scan (format nil "\\P{~A}" property-name) string)) + (inverted-result-2 (scan (format nil "[\\P{~A}]" property-name) string))) + (unless (eq expected-result (not (not result-1))) + (push (format nil "\(code-char #x~X) should ~:[not ~;~]have matched \"\\p{~A}\"" + char-code expected-result property-name) + errors)) + (unless (eq expected-result (not (not result-2))) + (push (format nil "\(code-char #x~X) should ~:[not ~;~]have matched \"[\\p{~A}]\"" + char-code expected-result property-name) + errors)) + (unless (eq expected-result (not inverted-result-1)) + (push (format nil "\(code-char #x~X) should ~:[~;not ~]have matched \"\\P{~A}\"" + char-code expected-result property-name) + errors)) + (unless (eq expected-result (not inverted-result-2)) + (push (format nil "\(code-char #x~X) should ~:[~;not ~]have matched \"[\\P{~A}]\"" + char-code expected-result property-name) + errors))) + errors)))))))) diff --git a/test/unicodetestdata b/test/unicodetestdata new file mode 100644 index 0000000..6db1f25 --- /dev/null +++ b/test/unicodetestdata @@ -0,0 +1,107 @@ +;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- +;;; $Header: /usr/local/cvsrep/cl-ppcre/test/unicodetestdata,v 1.10 2008/07/22 14:00:35 edi Exp $ + +;;; some arbitrary test data for Unicode properties - stolen from CL-UNICODE + +(#x0001 "ASCII" t) +(#x0100 "ASCII" nil) +(#x000A "Alphabetic" nil) +(#x0061 "Alphabetic" t) +(#x0061 "Ll" t) +(#x0041 "Alphabetic" t) +(#x0041 "alphabetic" t) +(#x0041 "IsAlphabetic" t) +(#x02E4 "Alphabetic" t) +(#x0970 "Alphabetic" nil) +(#x030D "BidiClass:NonspacingMark" t) +(#x030D "NonspacingMark" t) +(#x030D "nonspacing mark" t) +(#xE0146 "BidiClass:NonspacingMark" t) +(#x000D "BidiClass:WhiteSpace" nil) +(#x0020 "BidiClass:WhiteSpace" t) +(#x2006 "BidiClass:WhiteSpace" t) +(#x12470 "Cuneiform" t) +(#x12470 "IsCuneiform" t) +(#x12470 "CuneiformNumbersAndPunctuation" t) +(#x12470 "Block:CuneiformNumbersAndPunctuation" t) +(#x12470 "InCuneiformNumbersAndPunctuation" t) +(#x12470 "Script:Cuneiform" t) +(#x0041 "Block:Hebrew" nil) +(#x0593 "Block:Hebrew" t) +(#x0593 "InHebrew" t) +(#x040D "Block:Cyrillic" t) +(#x040D "InCyrillic" t) +(#x0042 "Block:Cyrillic" nil) +(#x2011 "Dash" t) +(#x2011 "IsDash" t) +(#xFF0D "Dash" t) +(#x003D "Dash" nil) +(#x00F0 "Lowercase" t) +(#x00F0 "IsLowercase" t) +(#x00F0 "lowercase" t) +(#x00F0 "Ll" t) +(#x0067 "Lowercase" t) +(#x010A "Lowercase" nil) +(#x1D6C1 "Lowercase" nil) +(#x0023 "CurrencySymbol" nil) +(#x0024 "CurrencySymbol" t) +(#x0024 "IsCurrencySymbol" t) +(#x0024 "currency symbol" t) +(#x20AC "CurrencySymbol" t) +(#xFFE6 "CurrencySymbol" t) +(#x002B "Sm" t) +(#x002B "Math" t) +(#x002B "IsMath" t) +(#x002B "math" t) +(#x211C "Math" t) +(#x1D7D2 "Math" t) +(#x002A "Math" nil) +(#x25C9 "Math" nil) +(#x0000 "NonCharacterCodePoint" nil) +(#xFDD0 "NonCharacterCodePoint" t) +(#xFDD0 "Non-Character-Code-Point" t) +(#xFDD0 "non-character-code-point" t) +(#xFFFFF "NonCharacterCodePoint" t) +(#x0043 "Arabic" nil) +(#x0606 "Arabic" t) +(#x0606 "arabic" t) +(#x0606 "IsArabic" t) +(#x0606 "Script:Arabic" t) +(#x0044 "IsVariationSelector" nil) +(#x0044 "VariationSelector" nil) +(#x180B "VariationSelector" t) +(#x180B "Variation_Selector" t) +(#x180B "Variation-Selector" t) +(#x180B "variationselector" t) +(#x180B "variation selector" t) +(#x180B "IsVariationSelector" t) +(#x00B5 "XIDContinue" t) +(#x00B5 "IsXIDContinue" t) +(#x00B5 "IsXID_Continue" t) +(#x00B5 "Is_XID_Continue" t) +(#x00B5 "XID_Continue" t) +(#x33FF "Unified_Ideograph" nil) +(#x33FF "Ideographic" nil) +(#x3400 "Unified_Ideograph" t) +(#x3400 "Ideographic" t) +(#x3400 "Han" t) +(#x3400 "OtherLetter" t) +(#x3400 "Alphabetic" t) +(#x3400 "Common" nil) +(#x3400 "Assigned" t) +(#x3400 "Any" t) +(#x0378 "Cn" t) +(#x0378 "Unassigned" t) +(#x0377 "Cn" nil) +(#x0377 "Unassigned" nil) +(#x2800 "Braille" t) +(#x2800 "Script:Braille" t) +(#x2800 "OtherSymbol" t) +(#x0027 "QuotationMark" t) +(#x201C "QuotationMark" t) +(#x201C "OtherNeutral" t) +(#x201C "PatternSyntax" t) +(#x0028 "Bidi_Mirrored" t) +(#x0028 "BidiMirrored" t) +(#x0028 "IsBidiMirrored" t) +(#x0027 "Bidi_Mirrored" nil) diff --git a/util.lisp b/util.lisp index 8caf6e1..c43a14c 100644 --- a/util.lisp +++ b/util.lisp @@ -1,5 +1,5 @@ ;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*- -;;; $Header: /usr/local/cvsrep/cl-ppcre/util.lisp,v 1.40 2008/07/03 10:06:16 edi Exp $ +;;; $Header: /usr/local/cvsrep/cl-ppcre/util.lisp,v 1.46 2008/07/06 18:12:05 edi Exp $ ;;; Utility functions and constants dealing with the character sets we ;;; use to encode character classes @@ -30,7 +30,12 @@ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(in-package #:cl-ppcre) +(in-package :cl-ppcre) + +(defmacro defconstant (name value &optional doc) + "Make sure VALUE is evaluated only once \(to appease SBCL)." + `(cl:defconstant ,name (if (boundp ',name) (symbol-value ',name) ,value) + ,@(when doc (list doc)))) #+:lispworks (eval-when (:compile-toplevel :load-toplevel :execute) @@ -100,120 +105,36 @@ are discarded \(that is, the body is an implicit PROGN)." `(let (,,@temps) ,,@body)))))) -(eval-when (:compile-toplevel :execute :load-toplevel) - (defun make-char-set (test) - (declare #.*special-optimize-settings*) - "Returns a CHARSET for all characters satisfying test." - (loop with set = (make-charset) - for code of-type fixnum from 0 below char-code-limit - for char = (code-char code) - if (and char (funcall test char)) - do (add-to-charset char set) - finally (return set))) - - (declaim (inline word-char-p)) - - (defun word-char-p (chr) - (declare #.*standard-optimize-settings*) - "Tests whether a character is a \"word\" character. -In the ASCII charset this is equivalent to a-z, A-Z, 0-9, or _, -i.e. the same as Perl's [\\w]." - (or (alphanumericp chr) - (char= chr #\_))) - - (unless (boundp '+whitespace-char-string+) - (defconstant +whitespace-char-string+ - (coerce - '(#\Space #\Tab #\Linefeed #\Return #\Page) - 'string) - "A string of all characters which are considered to be whitespace. -Same as Perl's [\\s].")) - - (defun whitespacep (chr) - (declare #.*special-optimize-settings*) - "Tests whether a character is whitespace, -i.e. whether it would match [\\s] in Perl." - (find chr +whitespace-char-string+ :test #'char=))) - -;; the following DEFCONSTANT statements are wrapped with -;; (UNLESS (BOUNDP ...) ...) to make SBCL happy - -(unless (boundp '+digit-set+) - (defconstant +digit-set+ - (make-char-set (lambda (chr) (char<= #\0 chr #\9))) - "Character set containing the digits from 0 to 9.")) - -(unless (boundp '+word-char-set+) - (defconstant +word-char-set+ - (make-char-set #'word-char-p) - "Character set containing all \"word\" characters.")) - -(unless (boundp '+whitespace-char-set+) - (defconstant +whitespace-char-set+ - (make-char-set #'whitespacep) - "Character set containing all whitespace characters.")) - -(defun create-ranges-from-set (set &key downcasep) +(declaim (inline digit-char-p)) +(defun digit-char-p (chr) (declare #.*standard-optimize-settings*) - "Tries to identify up to three intervals \(with respect to CHAR<) -which together comprise the charset SET. Returns NIL if this is not -possible. If DOWNCASEP is true it will treat the charset as if it -represents both the lower-case and the upper-case variants of its -members and will only return the respective lower-case intervals." - ;; discard empty charsets - (unless (and set (plusp (charset-count set))) - (return-from create-ranges-from-set nil)) - (loop with min1 and min2 and min3 - and max1 and max2 and max3 - ;; loop through all characters in SET, sorted by CHAR< - ;; (actually by < on their character codes, see 13.1.6 in the - ;; ANSI standard) - for code of-type fixnum below *regex-char-code-limit* - for char = (code-char code) - when (and char (in-charset-p (if downcasep (char-downcase char) char) set)) - ;; MIN1, MAX1, etc. are _exclusive_ - ;; bounds of the intervals identified so far - do (cond - ((not min1) - ;; this will only happen once, for the first character - (setq min1 (1- code) - max1 (1+ code))) - ((<= (the fixnum min1) code (the fixnum max1)) - ;; we're here as long as CHAR fits into the first interval - (setq min1 (min (the fixnum min1) (1- code)) - max1 (max (the fixnum max1) (1+ code)))) - ((not min2) - ;; we need to open a second interval - ;; this'll also happen only once - (setq min2 (1- code) - max2 (1+ code))) - ((<= (the fixnum min2) code (the fixnum max2)) - ;; CHAR fits into the second interval - (setq min2 (min (the fixnum min2) (1- code)) - max2 (max (the fixnum max2) (1+ code)))) - ((not min3) - ;; we need to open the third interval - ;; happens only once - (setq min3 (1- code) - max3 (1+ code))) - ((<= (the fixnum min3) code (the fixnum max3)) - ;; CHAR fits into the third interval - (setq min3 (min (the fixnum min3) (1- code)) - max3 (max (the fixnum max3) (1+ code)))) - (t - ;; we're out of luck, CHAR doesn't fit - ;; into one of the three intervals - (return nil))) - ;; on success return all bounds - ;; make them inclusive bounds before returning - finally (return (values (code-char (1+ min1)) - (code-char (1- max1)) - (and min2 (code-char (1+ min2))) - (and max2 (code-char (1- max2))) - (and min3 (code-char (1+ min3))) - (and max3 (code-char (1- max3))))))) + "Tests whether a character is a decimal digit, i.e. the same as +Perl's [\\d]. Note that this function shadows the standard Common +Lisp function CL:DIGIT-CHAR-P." + (char<= #\0 chr #\9)) + +(declaim (inline word-char-p)) +(defun word-char-p (chr) + (declare #.*standard-optimize-settings*) + "Tests whether a character is a \"word\" character. In the ASCII +charset this is equivalent to a-z, A-Z, 0-9, or _, i.e. the same as +Perl's [\\w]." + (or (alphanumericp chr) + (char= chr #\_))) + +(defconstant +whitespace-char-string+ + (coerce '(#\Space #\Tab #\Linefeed #\Return #\Page) 'string) + "A string of all characters which are considered to be whitespace. +Same as Perl's [\\s].") + +(defun whitespacep (chr) + (declare #.*special-optimize-settings*) + "Tests whether a character is whitespace, i.e. whether it would +match [\\s] in Perl." + (find chr +whitespace-char-string+ :test #'char=)) (defmacro maybe-coerce-to-simple-string (string) + "Coerces STRING to a simple STRING unless it already is one." (with-unique-names (=string=) `(let ((,=string= ,string)) (cond ((simple-string-p ,=string=) @@ -223,16 +144,16 @@ members and will only return the respective lower-case intervals." (declaim (inline nsubseq)) (defun nsubseq (sequence start &optional (end (length sequence))) - "Return a subsequence by pointing to location in original sequence." + "Returns a subsequence by pointing to location in original sequence." (make-array (- end start) :element-type (array-element-type sequence) :displaced-to sequence :displaced-index-offset start)) (defun normalize-var-list (var-list) - "Utility function for REGISTER-GROUPS-BIND and -DO-REGISTER-GROUPS. Creates the long form \(a list of \(FUNCTION VAR) -entries) out of the short form of VAR-LIST." + "Utility function for REGISTER-GROUPS-BIND and DO-REGISTER-GROUPS. +Creates the long form \(a list of \(FUNCTION VAR) entries) out of the +short form of VAR-LIST." (loop for element in var-list if (consp element) nconc (loop for var in (rest element) @@ -241,20 +162,33 @@ entries) out of the short form of VAR-LIST." collect (list '(function identity) element))) (defun string-list-to-simple-string (string-list) - (declare #.*standard-optimize-settings*) "Concatenates a list of strings to one simple-string." + (declare #.*standard-optimize-settings*) ;; this function provided by JP Massar; note that we can't use APPLY ;; with CONCATENATE here because of CALL-ARGUMENTS-LIMIT (let ((total-size 0)) - (declare (type fixnum total-size)) + (declare (fixnum total-size)) (dolist (string string-list) - #-genera (declare (type string string)) + #-:genera (declare (string string)) (incf total-size (length string))) (let ((result-string (make-sequence 'simple-string total-size)) (curr-pos 0)) - (declare (type fixnum curr-pos)) + (declare (fixnum curr-pos)) (dolist (string string-list) - #-genera (declare (type string string)) + #-:genera (declare (string string)) (replace result-string string :start1 curr-pos) (incf curr-pos (length string))) result-string))) + +(defun complement* (test-function) + "Like COMPLEMENT but optimized for unary functions." + (declare #.*standard-optimize-settings*) + (typecase test-function + (function + (lambda (char) + (declare (character char)) + (not (funcall (the function test-function) char)))) + (otherwise + (lambda (char) + (declare (character char)) + (not (funcall test-function char)))))) \ No newline at end of file