}*)
+ ;; 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
+ :hash (case parse-tree
+ ((:digit-class
+ :non-digit-class)
+ +digit-hash+)
+ ((:word-char-class
+ :non-word-char-class)
+ nil)
+ ((:whitespace-char-class
+ :non-whitespace-char-class)
+ +whitespace-char-hash+))
+ ;; 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))))))))
+
+(defun convert (parse-tree)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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 NIL."
+ ;; this function basically just initializes the special variables
+ ;; and then calls CONVERT-AUX to do all the work
+ (let* ((flags (list nil nil nil))
+ (reg-num 0)
+ (accumulate-start-p t)
+ starts-with
+ (max-back-ref 0)
+ (converted-parse-tree (convert-aux parse-tree)))
+ (declare (special flags reg-num accumulate-start-p starts-with max-back-ref))
+ ;; 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))
+ (when (typep starts-with 'str)
+ (setf (slot-value starts-with 'str)
+ (coerce (slot-value starts-with 'str) 'simple-string)))
+ (values converted-parse-tree reg-num starts-with)))
diff --git a/practicals/libraries/cl-ppcre-1.2.3/doc/benchmarks.2002-12-22.txt b/practicals/libraries/cl-ppcre-1.2.3/doc/benchmarks.2002-12-22.txt
new file mode 100644
index 0000000..907dc53
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/doc/benchmarks.2002-12-22.txt
@@ -0,0 +1,1546 @@
+ 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/practicals/libraries/cl-ppcre-1.2.3/doc/index.html b/practicals/libraries/cl-ppcre-1.2.3/doc/index.html
new file mode 100644
index 0000000..ea2b42d
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/doc/index.html
@@ -0,0 +1,2318 @@
+
+
+
+
+
+ CL-PPCRE - portable Perl-compatible regular expressions for Common Lisp
+
+
+
+
+
+CL-PPCRE - portable Perl-compatible regular expressions for Common Lisp
+
+
+
Abstract
+
+CL-PPCRE is a portable regular expression library for Common Lisp
+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. Currently, as of December 2002, CL-PPCRE is more
+compatible with the regex semantics of Perl 5.8.0 than, say,
+Perl 5.6.1 is...:) It even correctly parses and applies Jeffrey Friedl's
+famous 6600-byte long RFC822 address pattern.
+
+
- It is fast. If compiled with CMUCL it outperforms Perl's highly optimized regex engine (written
+in C) which to my knowledge is faster than most other regex engines
+around. If compiled with CLISP it is still comparable
+to CLISP's own regex implementation which is also written in
+C.
+
+
- 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:
+
+
+
+- Allegro Common Lisp (6.2 trial on Gentoo Linux 1.1a)
+
- CLISP (2.30 on Gentoo Linux 1.1a and 2.29 on Windows XP pro)
+
- CMUCL (18e on Gentoo Linux 1.1a)
+
- Corman Lisp (2.5 on Windows XP pro)
+
- ECL (0.9c on Gentoo Linux 1.1a)
+
- Genera 8.5
+
- Macintosh Common Lisp (4.3 demo on MacOS 9.1 - only tested with CL-PPCRE 0.1.x)
+
- OpenMCL (0.13.4 on MacOS X 10.2.2 - only tested with CL-PPCRE 0.1.x)
+
- SBCL (0.8.4 on Gentoo Linux 1.1a)
+
- Scieneer Common Lisp (1.1.1 evaluation on Gentoo Linux 1.1a - only tested with CL-PPCRE 0.1.x)
+
- LispWorks (4.2.7 professional on Gentoo Linux 1.1a and 4.3.6 professional on Windows XP pro)
+
+
+
+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.
+
+ - 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... :)
+
+
- It comes with a BSD-style
+license so you can basically do with it whatever you want.
+
+
+
+CL-PPCRE has been used successfully in various applications like BioLingua, LoGS, or The Regex Coach.
+
+
+Download shortcut: http://weitz.de/files/cl-ppcre.tar.gz.
+
+
+
+
+
+ - Download and installation
+
- Support and mailing lists
+
- The CL-PPCRE dictionary
+
+ create-scanner
(for Perl regex strings)
+ create-scanner
(for parse trees)
+ parse-tree-synonym
+ define-parse-tree-synonym
+ scan
+ scan-to-strings
+ register-groups-bind
+ do-scans
+ do-matches
+ do-matches-as-strings
+ do-register-groups
+ all-matches
+ all-matches-as-strings
+ split
+ regex-replace
+ regex-replace-all
+ regex-apropos
+ regex-apropos-list
+ *regex-char-code-limit*
+ *use-bmh-matchers*
+ *allow-quoting*
+ quote-meta-chars
+ ppcre-error
+ ppcre-invocation-error
+ ppcre-syntax-error
+ ppcre-syntax-error-string
+ ppcre-syntax-error-pos
+
+ - Filters
+
- Testing CL-PPCRE
+
- Compatibility with Perl
+
+ - Empty strings instead of
undef
in $1
, $2
, etc.
+ - Strange scoping of embedded modifiers
+
- Inconsistent capturing of
$1
, $2
, etc.
+ - Captured groups not available outside of look-aheads and look-behinds
+
- Alternations don't always work from left to right
+
"\r"
doesn't work with MCL
+ - What about
"\w"
?
+
+ - Performance
+
+ - Benchmarking
+
- Other performance issues
+
+ - Bugs and problems
+
+ - Stack overflow
+
"\Q"
doesn't work, or does it?
+ - Backslashes may confuse you...
+
+ - Remarks
+
- AllegroCL compatibility mode
+
- Acknowledgements
+
+
+
+
+CL-PPCRE together with this documentation can be downloaded from http://weitz.de/files/cl-ppcre.tar.gz. The
+current version is 1.2.3 - older versions are
+available for download through URLs like
+http://weitz.de/files/cl-ppcre-<version>.tar.gz
(or ending in .tgz
for 0.9.0 and older.). A CHANGELOG is available.
+
+If you're on Debian you should
+probably use the cl-ppcre
+Debian package which is available thanks to 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 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.
+
+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:
+
+
+(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))
+
+
+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.
+
+
+
+
+For questions, bug reports, feature requests, improvements, or patches
+please use the cl-ppcre-devel
+mailing list. If you want to be notified about future releases
+subscribe to the cl-ppcre-announce
+mailing list. These mailing lists were made available thanks to
+the services of common-lisp.net.
+
+
+
+CL-PPCRE exports the following symbols:
+
+
[Method]
+
create-scanner (string string)&key case-insensitive-mode multi-line-mode single-line-mode extended-mode destructive => scanner
+
+
Accepts a string which is a regular expression in
+Perl syntax and returns a closure which will scan strings for this
+regular expression. The mode keyboard 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
+perlre
including extended features like non-greedy
+repetitions, positive and negative look-ahead and look-behind
+assertions, "standalone" subexpressions, and conditional
+subpatterns. The following Perl features are (currently) not
+supported:
+
+
+
+(?{ code })
and (??{ code })
because
+they obviously don't make sense in Lisp.
+
+\N{name}
(named characters), \x{263a}
+(wide hex characters), \l
, \u
,
+\L
, and \U
+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
+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.
+
+ \G
for Perl's pos()
because we don't have it.
+
+
+
+Note, however, that \t
, \n
, \r
,
+\f
, \a
, \e
, \033
+(octal character codes), \x1B
(hexadecimal character
+codes), \c[
(control characters), \w
,
+\W
, \s
, \S
, \d
,
+\D
, \b
, \B
, \A
,
+\Z
, and \z
are supported.
+
+Since version 0.6.0 CL-PPCRE also supports Perl's \Q
and \E
- see *ALLOW-QUOTING*
below. Make sure you also read the relevant section in "Bugs and problems."
+
+The keyword arguments are just for your
+convenience. You can always use embedded modifiers like
+"(?i-s)"
instead.
+
+
[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.
+
+
+
[Method]
+
create-scanner (parse-tree t)&key case-insensitive-mode multi-line-mode single-line-mode extended-mode destructive => scanner
+
+This is similar to CREATE-SCANNER
for regex strings above but
+accepts a parse tree as its first argument. A parse tree is an S-expression
+conforming to the following syntax:
+
+
+
+- Every string and character is a parse tree and is treated
+literally as a part of the regular expression,
+i.e. parentheses, brackets, asterisks and such aren't special.
+
+
- The symbol
:VOID
is equivalent to the empty string.
+
+ - The symbol
:EVERYTHING
is equivalent to Perl's dot,
+i.e it matches everything (except maybe a newline character depending
+on the mode).
+
+ - The symbols
:WORD-BOUNDARY
and
+:NON-WORD-BOUNDARY
are equivalent to Perl's
+"\b"
and "\B"
.
+
+ - The symbols
:DIGIT-CLASS
,
+:NON-DIGIT-CLASS
, :WORD-CHAR-CLASS
,
+:NON-WORD-CHAR-CLASS
,
+:WHITESPACE-CHAR-CLASS
, and
+:NON-WHITESPACE-CHAR-CLASS
are equivalent to Perl's
+special character classes "\d"
,
+"\D"
, "\w"
,
+"\W"
, "\s"
, and
+"\S"
respectively.
+
+ - The symbols
:START-ANCHOR
, :END-ANCHOR
,
+:MODELESS-START-ANCHOR
,
+:MODELESS-END-ANCHOR
, and
+:MODELESS-END-ANCHOR-NO-NEWLINE
are equivalent to Perl's
+"^"
, "$"
,
+"\A"
, "\Z"
, and
+"\z"
respectively.
+
+ - The symbols
:CASE-INSENSITIVE-P
,
+:CASE-SENSITIVE-P
, :MULTI-LINE-MODE-P
,
+:NOT-MULTI-LINE-MODE-P
, :SINGLE-LINE-MODE-P
,
+and :NOT-SINGLE-LINE-MODE-P
are equivalent to Perl's
+embedded modifiers "(?i)"
,
+"(?-i)"
, "(?m)"
,
+"(?-m)"
, "(?s)"
, and
+"(?-s)"
. As usual, changes applied to modes are
+kept local to the innermost enclosing grouping or clustering
+construct.
+
+ - All other symbols will signal an error of type
PPCRE-SYNTAX-ERROR
+unless they are defined to be parse tree synonyms.
+
+ (:FLAGS {<modifier>}*)
where
+<modifier>
is one of the modifier symbols from
+above is used to group modifier symbols. The modifiers are applied
+from left to right. (This construct is obviously redundant. It is only
+there because it's used by the parser.)
+
+(:SEQUENCE {<parse-tree>}*)
means a
+sequence of parse trees, i.e. the parse trees must match one after
+another. Example: (:SEQUENCE #\f #\o #\o)
is equivalent
+to the parse tree "foo"
.
+
+(:GROUP {<parse-tree>}*)
is like
+:SEQUENCE
but changes applied to modifier flags (see
+above) are kept local to the parse trees enclosed by this
+construct. Think of it as the S-expression variant of Perl's
+"(?:<pattern>)"
construct.
+
+(:ALTERNATION {<parse-tree>}*)
means an
+alternation of parse trees, i.e. one of the parse trees must
+match. Example: (:ALTERNATION #\b #\a #\z)
is equivalent
+to the Perl regex string "b|a|z"
.
+
+(:BRANCH <test>
+<parse-tree>)
is for conditional regular
+expressions. <test>
is either a number which
+stands for a register or a parse tree which is a look-ahead or
+look-behind assertion. See the entry for
+(?(<condition>)<yes-pattern>|<no-pattern>)
+in man
+perlre
for the semantics of this construct. If
+<parse-tree>
is an alternation is
+must enclose exactly one or two parse trees where the second
+one (if present) will be treated as the "no-pattern" - in
+all other cases <parse-tree>
will be treated
+as the "yes-pattern".
+
+(:POSITIVE-LOOKAHEAD|:NEGATIVE-LOOKAHEAD|:POSITIVE-LOOKBEHIND|:NEGATIVE-LOOKBEHIND
+<parse-tree>)
should be pretty obvious...
+
+(:GREEDY-REPETITION|:NON-GREEDY-REPETITION
+<min> <max>
+<parse-tree>)
where
+<min>
is a non-negative integer and
+<max>
is either a non-negative integer not
+smaller than <min>
or NIL
will
+result in a regular expression which tries to match
+<parse-tree>
at least
+<min>
times and at most
+<max>
times (or as often as possible if
+<max>
is NIL
). So, e.g.,
+(:NON-GREEDY-REPETITION 0 1 "ab")
is equivalent
+to the Perl regex string "(?:ab)??"
.
+
+(:STANDALONE <parse-tree>)
is an
+"independent" subexpression, i.e. (:STANDALONE
+"bar")
is equivalent to the Perl regex string
+"(?>bar)"
.
+
+(:REGISTER <parse-tree>)
is a capturing
+register group. As usual, registers are counted from left to right
+beginning with 1.
+
+(:BACK-REFERENCE <number>)
where
+<number>
is a positive integer is a back-reference to a
+register group.
+
+(:FILTER <function> &optional
+<length>)
where
+<function>
is a function
+designator and <length>
is a
+non-negative integer or NIL
is a user-defined filter.
+
+(: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
+(:RANGE <char1> <char2>)
where
+<char1>
and
+<char2>
are characters such that
+(CHAR<= <char1> <char2>)
is
+true. Example: (:INVERTED-CHAR-CLASS #\a (:RANGE #\D #\G)
+:DIGIT-CLASS)
is equivalent to the Perl regex string
+"[^aD-G\d]"
.
+
+
+
+Because CREATE-SCANNER
is defined as a generic function
+which dispatches on its first argument there's a certain ambiguity:
+Although strings are valid parse trees they will be interpreted as
+Perl regex strings when given to CREATE-SCANNER
. To
+circumvent this you can always use the equivalent parse tree (:GROUP
+<string>)
instead.
+
+Note that CREATE-SCANNER
doesn't always check
+for the well-formedness of its first argument, i.e. you are expected
+to provide correct parse trees.
+
+
+The usage of the keyword argument extended-mode
obviously
+doesn't make sense if CREATE-SCANNER
is applied to parse
+trees and will signal an error.
+
+If destructive
is not NIL
(the default is
+NIL
) the function is allowed to destructively modify
+parse-tree
while creating the scanner.
+
+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:
+
+
+* (cl-ppcre::parse-string "(ab)*")
+(:GREEDY-REPETITION 0 NIL (:REGISTER "ab"))
+
+* (cl-ppcre::parse-string "(a(b))")
+(:REGISTER (:SEQUENCE #\a (:REGISTER #\b)))
+
+* (cl-ppcre::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")
+(: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")
+(: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
+always be a string (which is interpreted as a Perl regular
+expression), a parse tree, or a scanner created by
+CREATE-SCANNER
. The
+start
and end
+keyword parameters are always used as in SCAN
.
+
+
+
+
+
[Standard Generic Function]
+
scan regex target-string &key start end => match-start, match-end, reg-starts, reg-ends
+
+
+Searches the string target-string
from
+start
(which defaults to 0) to
+end
(which default to the length of
+target-string
) and tries to match
+regex
. On success returns four values - the start
+of the match, the end of the match, and two arrays denoting the
+beginnings and ends of register matches. On failure returns
+NIL
. target-string
will be coerced to a
+simple string if it isn't one already.
+
+SCAN
acts as if the part of
+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")
+1
+5
+#(3)
+#(4)
+
+* (cl-ppcre:scan "(a)*b" "xaaabd" :start 1)
+1
+5
+#(3)
+#(4)
+
+* (cl-ppcre:scan "(a)*b" "xaaabd" :start 2)
+2
+5
+#(3)
+#(4)
+
+* (cl-ppcre:scan "(a)*b" "xaaabd" :end 4)
+NIL
+
+* (cl-ppcre:scan '(:GREEDY-REPETITION 0 NIL #\b) "bbbc")
+0
+3
+#()
+#()
+
+* (cl-ppcre:scan '(:GREEDY-REPETITION 4 6 #\b) "bbbc")
+NIL
+
+* (let ((s (cl-ppcre:create-scanner "(([a-c])+)x")))
+ (cl-ppcre:scan s "abcxy"))
+0
+4
+#(0 2)
+#(3 3)
+
+
+
+
+
[Function]
+
scan-to-strings regex target-string &key start end sharedp => match, regs
+
+
+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 NIL
s) 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")
+"aaab"
+#()
+
+* (cl-ppcre:scan-to-strings "([^b])*b" "aaabd")
+"aaab"
+#("a")
+
+* (cl-ppcre:scan-to-strings "(([^b])*)b" "aaabd")
+"aaab"
+#("aaa" "a")
+
+
+
+
[Macro]
+
register-groups-bind var-list (regex target-string &key start end sharedp) declaration* statement* => result*
+
+
+Evaluates statement*
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
.
+As a shortcut, the elements of var-list
can also be lists of the form (FN VAR)
where VAR
is the variable symbol
+and FN
is a function
+designator (which is evaluated) denoting a function which is to be applied to the string before the result is bound to VAR
.
+To make this even more convenient the form (FN VAR1 ...VARn)
can be used as an abbreviation for
+(FN VAR1) ... (FN VARn).
+
+If there is no match, the statement*
forms are 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
.
+
Examples:
+
+* (register-groups-bind (first second third fourth)
+ ("((a)|(b)|(c))+" "abababc" :sharedp t)
+ (list first second third fourth))
+("c" "a" "b" "c")
+
+* (register-groups-bind (nil second third fourth)
+ ;; note that we don't bind the first and fifth register group
+ ("((a)|(b)|(c))()+" "abababc" :start 6)
+ (list second third fourth))
+(NIL NIL "c")
+
+* (register-groups-bind (first)
+ ("(a|b)+" "accc" :start 1)
+ (format t "This will not be printed: ~A" first))
+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)
+
+
+
+
[Macro]
+
do-scans (match-start match-end reg-starts reg-ends regex target-string &optional result-form &key start end) declaration* statement* => result*
+
+
+A macro which iterates over target-string
and
+tries to match regex
as often as possible
+evaluating statement*
with
+match-start
, match-end
,
+reg-starts
, and reg-ends
bound
+to the four return values of each match (see SCAN
) 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 scan is continued one position behind this match.
+
+This is the most general macro to iterate over all matches in a target
+string. See the source code of DO-MATCHES
, ALL-MATCHES
, SPLIT
, or REGEX-REPLACE-ALL
for examples of its
+usage.
+
+
+
+
+
[Macro]
+
do-matches (match-start match-end regex target-string &optional result-form &key start end) declaration* statement* => result*
+
+
+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)
+ (incf sum (- e s)))
+ (format t "~,2F% of the string was inside of a match~%"
+ ;; note: doesn't check for division by zero
+ (float (* 100 (/ sum (- end start)))))))
+
+FOO
+
+* (foo "a" "abcabcabc")
+33.33% of the string was inside of a match
+NIL
+* (foo "aa|b" "aacabcbbc")
+55.56% of the string was inside of a match
+NIL
+
+
+
+
+
+
[Macro]
+
do-matches-as-strings (match-var regex target-string &optional result-form &key start end sharedp) declaration* statement* => result*
+
+
+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
+ target-string nil
+ :start start :end end)
+ (incf sum (parse-integer m)))
+ (if (< sum 10)
+ sum
+ (crossfoot (format nil "~A" sum)))))
+
+CROSSFOOT
+
+* (crossfoot "bar")
+0
+
+* (crossfoot "a3x")
+3
+
+* (crossfoot "12345")
+6
+
+
+Of course, in real life you would do this with DO-MATCHES
and use the start
and end
keyword parameters of PARSE-INTEGER
.
+
+
[Macro]
+
do-register-groups var-list (regex target-string &optional result-form &key start end sharedp) declaration* statement* => result*
+
+
+Iterates over target-string
and tries to match regex
as often as
+possible evaluating statement*
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
. You can use the same shortcuts and abbreviations as in REGISTER-GROUPS-BIND
. The number of
+variables in var-list
must not be greater than the number of register
+groups. For each element of
+var-list
which is NIL
there's no binding to the corresponding register
+group. 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
.
+Example:
+
+* (do-register-groups (first second third fourth)
+ ("((a)|(b)|(c))" "abababc" nil :start 2 :sharedp t)
+ (print (list first second third fourth)))
+("a" "a" NIL NIL)
+("b" NIL "b" NIL)
+("a" "a" NIL NIL)
+("b" NIL "b" NIL)
+("c" NIL NIL "c")
+NIL
+
+* (let (result)
+ (do-register-groups ((#'parse-integer n) (#'intern sign) whitespace)
+ ("(\\d+)|(\\+|-|\\*|/)|(\\s+)" "12*15 - 42/3")
+ (unless whitespace
+ (push (or n sign) result)))
+ (nreverse result))
+(12 * 15 - 42 / 3)
+
+
+
+
+
[Function]
+
all-matches regex target-string &key start end => list
+
+
+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 scan is
+continued one position behind this match.
+
+Examples:
+
+* (cl-ppcre:all-matches "a" "foo bar baz")
+(5 6 9 10)
+
+* (cl-ppcre:all-matches "\\w*" "foo bar baz")
+(0 3 3 3 4 7 7 7 8 11 11 11)
+
+
+
+
+
+
[Function]
+
all-matches-as-strings regex target-string &key start end sharedp => list
+
+
+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")
+("a" "a")
+
+* (cl-ppcre:all-matches-as-strings "\\w*" "foo bar baz")
+("foo" "" "bar" "" "baz" "")
+
+
+
+
+
+
+
+
[Function]
+
split regex target-string &key start end limit with-registers-p omit-unmatched-p sharedp => list
+
+
+Matches regex
against
+target-string
as often as possible and 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 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
.
+
+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:
+
+* (cl-ppcre:split "\\s+" "foo bar baz
+frob")
+("foo" "bar" "baz" "frob")
+
+* (cl-ppcre:split "\\s*" "foo bar baz")
+("f" "o" "o" "b" "a" "r" "b" "a" "z")
+
+* (cl-ppcre:split "(\\s+)" "foo bar baz")
+("foo" "bar" "baz")
+
+* (cl-ppcre:split "(\\s+)" "foo bar baz" :with-registers-p t)
+("foo" " " "bar" " " "baz")
+
+* (cl-ppcre:split "(\\s)(\\s*)" "foo bar baz" :with-registers-p t)
+("foo" " " "" "bar" " " " " "baz")
+
+* (cl-ppcre: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)
+("foo" "," "bar" ";" "baz")
+
+* (cl-ppcre: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)
+("a:b:c:d:e:f:g::")
+
+* (cl-ppcre: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)
+("a" "b" "c:d:e:f:g::")
+
+* (cl-ppcre:split ":" "a:b:c:d:e:f:g::" :limit 1000)
+("a" "b" "c" "d" "e" "f" "g" "" "")
+
+
+
+
+
+
+
[Function]
+
regex-replace regex target-string replacement &key start end preserve-case simple-calls => list
+
+
Try to match target-string
+between start
and end
against
+regex
and replace the first match with
+replacement
.
+
+replacement
can be a string which may contain the
+special substrings "\&"
for the whole
+match, "\`"
for the part of
+target-string
before the match,
+"\'"
for the part of
+target-string
after the match,
+"\N"
or "\{N}"
for the
+N
th register where N
is a positive integer.
+
+replacement
can also be a function
+designator in which case the match will be replaced with the
+result of calling the function designated by
+replacement
with the arguments
+target-string
, start
,
+end
, match-start
,
+match-end
, reg-starts
, and
+reg-ends
. (reg-starts
and
+reg-ends
are arrays holding the start and end
+positions of matched registers (or NIL
) - the meaning of
+the other arguments should be obvious.)
+
+If simple-calls
is true, a function designated by
+replacement
will instead be called with the
+arguments match
, register-1
,
+..., register-n
where match
is
+the whole match as a string and register-1
to
+register-n
are the matched registers, also as
+strings (or NIL
). Note that these strings share structure with
+target-string
so you must not modify them.
+
+Finally, replacement
can be a list where each
+element is a string (which will be inserted verbatim), one of the
+symbols :match
, :before-match
, or
+:after-match
(corresponding to
+"\&"
, "\`"
, and
+"\'"
above), an integer N
+(representing register (1+ N)
), or a function
+designator.
+
+If preserve-case
is true (default is
+NIL
), the replacement will try to preserve the case (all
+upper case, all lower case, or capitalized) of the match. The result
+will always be a fresh
+string, even if regex
doesn't match.
+
+Examples:
+
+
+* (cl-ppcre:regex-replace "fo+" "foo bar" "frob")
+"frob bar"
+
+* (cl-ppcre:regex-replace "fo+" "FOO bar" "frob")
+"FOO bar"
+
+* (cl-ppcre:regex-replace "(?i)fo+" "FOO bar" "frob")
+"frob bar"
+
+* (cl-ppcre:regex-replace "(?i)fo+" "FOO bar" "frob" :preserve-case t)
+"FROB bar"
+
+* (cl-ppcre:regex-replace "(?i)fo+" "Foo bar" "frob" :preserve-case t)
+"Frob bar"
+
+* (cl-ppcre:regex-replace "bar" "foo bar baz" "[frob (was '\\&' between '\\`' and '\\'')]")
+"foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
+
+* (cl-ppcre:regex-replace "bar" "foo bar baz"
+ '("[frob (was '" :match "' between '" :before-match "' and '" :after-match "')]"))
+"foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
+
+
+
+
[Function]
+
regex-replace-all regex target-string replacement &key start end preserve-case simple-calls => list
+
+
+Like REGEX-REPLACE
but replaces all matches.
+
+Examples:
+
+
+* (cl-ppcre:regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)
+"frob Frob FROB bar"
+
+* (cl-ppcre:regex-replace-all "(?i)f(o+)" "foo Fooo FOOOO bar" "fr\\1b" :preserve-case t)
+"froob Frooob FROOOOB bar"
+
+* (let ((qp-regex (cl-ppcre:create-scanner "[\\x80-\\xff]")))
+ (defun encode-quoted-printable (string)
+ "Convert 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))))
+Converted ENCODE-QUOTED-PRINTABLE.
+ENCODE-QUOTED-PRINTABLE
+
+* (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 (cl-ppcre:create-scanner "[^a-zA-Z0-9_\\-.]")))
+ (defun url-encode (string)
+ "URL-encode 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))))
+Converted URL-ENCODE.
+URL-ENCODE
+
+* (url-encode "Fête Sørensen naïve Hühner Straße")
+"F%EAte%20S%F8rensen%20na%EFve%20H%FChner%20Stra%DFe"
+
+* (defun how-many (target-string start end match-start match-end reg-starts reg-ends)
+ (declare (ignore start end match-start match-end))
+ (format nil "~A" (- (svref reg-ends 0)
+ (svref reg-starts 0))))
+HOW-MANY
+
+* (cl-ppcre: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 (cl-ppcre:create-scanner "[\\x80-\\xff]")))
+ (defun encode-quoted-printable (string)
+ "Convert 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
+ :simple-calls t))))
+
+Converted ENCODE-QUOTED-PRINTABLE.
+ENCODE-QUOTED-PRINTABLE
+
+* (encode-quoted-printable "Fête Sørensen naïve Hühner Straße")
+"F=EAte S=F8rensen na=EFve H=FChner Stra=DFe"
+
+* (defun how-many (match first-register)
+ (declare (ignore match))
+ (format nil "~A" (length first-register)))
+HOW-MANY
+
+* (cl-ppcre: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"
+
+
+
[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}>
+
+* (cl-ppcre:regex-apropos "foo(?:bar)?")
+FOO [variable] value: "bar"
+ [compiled function] (N &OPTIONAL (K 0))
+FOOBOO [variable] value: 43
+|foobar| [variable] value: 42
+
+* (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
+
+* (cl-ppcre:regex-apropos "(?:foo|fro)bar" 'cl-user)
+FROBAR [class] #<STANDARD-CLASS FROBAR {4874E625}>
+|foobar| [variable] value: 42
+
+* (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
+
+
+
+
+
+
[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):
+
+
+* (cl-ppcre:regex-apropos-list "foo(?:bar)?")
+(|foobar| FOOBOO FOO)
+
+
+
[Special variable]
+
*regex-char-code-limit*
+
+
This variable controls whether scanners take into
+account all characters of your CL implementation or only those the CHAR-CODE
+of which is not larger than its value. It is only relevant if the
+regular expression contains certain character classes. The default is
+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,
+LispWorks, or CLISP where CHAR-CODE-LIMIT
has a value
+much higher than 255. The test suite will
+automatically set *REGEX-CHAR-CODE-LIMIT*
to 255 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* 255)) (cl-ppcre:create-scanner "[3\\D]")))
+Timing the evaluation of (LET ((CL-PPCRE:*REGEX-CHAR-CODE-LIMIT* 255)) (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>
+
+
+Note: Due to the nature of LOAD-TIME-VALUE
and the compiler macro for SCAN
some
+scanners might be created in a null
+lexical environment at load time or at compile time so be careful
+to which value *REGEX-CHAR-CODE-LIMIT*
is bound at that
+time. The default value should always yield correct results unless you
+play dirty tricks with implementation-dependent behaviour, though.
+
+
[Special variable]
+
*use-bmh-matchers*
+
+
Usually, the scanners created by CREATE-SCANNER
(or
+implicitely by other functions and macros) will use fast Boyer-Moore-Horspool
+matchers to check for constant strings at the start or end of the
+regular expression. If *USE-BMH-MATCHERS*
is
+NIL
(the default is T
), the standard
+function SEARCH
+will be used instead. This will usually be a bit slower but can save
+lots of space if you're storing many scanners. The test suite will automatically set
+*USE-BMH-MATCHERS*
to NIL
while you're running
+the default test.
+
+Note: Due to the nature of LOAD-TIME-VALUE
and the compiler macro for SCAN
some
+scanners might be created in a null
+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]
+
*allow-quoting*
+
+
+If this value is true (the default is NIL
)
+CL-PPCRE will support \Q
and \E
in regex
+strings to quote (disable) metacharacters. Note that this entails a
+slight performance penalty when creating scanners because (a copy of) the regex
+string is modified (probably more than once) before it
+is fed to the parser. Also, the parser's syntax error messages will complain
+about the converted string and not about the original regex string.
+
+
+* (cl-ppcre:scan "^a+$" "a+")
+NIL
+
+* (let ((cl-ppcre:*allow-quoting* t))
+ (cl-ppcre:scan "^\\Qa+\\E$" "a+"))
+0
+2
+#()
+#()
+
+* (let ((cl-ppcre:*allow-quoting* t))
+ (cl-ppcre:scan "\\Qa()\\E(?#comment\\Q)a**b" "()ab"))
+
+Quantifier '*' not allowed at position 19 in string "a\\(\\)(?#commentQ)a**b"
+
+
+Note how in the last example the regex string in the error message is
+different from the first argument to the SCAN
+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+")
+0
+2
+#()
+#()
+
+
+Make sure you also read the relevant section in "Bugs and problems."
+
+
+
+
[Function]
+
quote-meta-chars string => string'
+
+
+This is a simple utility function used when *ALLOW-QUOTING*
is
+true. It returns a string STRING'
where all
+non-word characters (everything except ASCII characters, digits and
+underline) of STRING
are quoted by prepending a
+backslash similar to Perl's quotemeta
function. It always returns a fresh
+string.
+
+* (cl-ppcre:quote-meta-chars "[a-z]*")
+"\\[a\\-z\\]\\*"
+
+
+
[Condition type]
+
ppcre-error
+
+
+Every error signaled by CL-PPCRE is of type
+PPCRE-ERROR
. This is a direct subtype of SIMPLE-ERROR
+without any additional slots or options.
+
+
+
[Condition type]
+
ppcre-invocation-error
+
+
+Errors of type PPCRE-INVOCATION-ERROR
+are signaled if one of the exported functions of CL-PPCRE is called with wrong or
+inconsistent arguments. This is a direct subtype of PPCRE-ERROR
without any
+additional slots or options.
+
+
+
[Condition type]
+
ppcre-syntax-error
+
+
+An error of type PPCRE-SYNTAX-ERROR
is signaled if
+CL-PPCRE's parser encounters an error when trying to parse a regex
+string or to convert a parse tree into its internal representation.
+This is a direct subtype of PPCRE-ERROR
with two additional
+slots. These denote the regex string which HTML-PPCRE was parsing and
+the position within the string where the error occured. If the error
+happens while CL-PPCRE is converting a parse tree both of these slots
+contain NIL
. (See the next two entries on how to access
+these slots.)
+
+As many syntax errors can't be detected before the parser is at the
+end of the stream, the row and column usually denote the last position
+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)
+ (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)
+ (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".
+
+
+
+
[Function]
+
ppcre-syntax-error-string condition => string
+
+
+If condition
is a condition of type PPCRE-SYNTAX-ERROR
this
+function will return the string the parser was parsing when the error was
+encountered (or NIL
if the error happened while trying to
+convert a parse tree). This might be particularly useful when *ALLOW-QUOTING*
is
+true because in this case the offending string might not be the one you gave to the CREATE-SCANNER
function.
+
+
+
[Function]
+
ppcre-syntax-error-pos condition => number
+
+
+If condition
is a condition of type PPCRE-SYNTAX-ERROR
this
+function will return the position within the string where the error
+occured (or NIL
if the error happened while trying to
+convert a parse tree).
+
+
+
+
+
+Because several users have asked for it, CL-PPCRE now offers
+"filters" (see above for syntax)
+which are basically arbitrary, user-defined functions that can act as
+regex building blocks. Filters can only be used within parse trees, not within Perl regex
+strings.
+
+Note that filters are currently considered an experimental feature and
+their API might change in the future.
+
+A filter is defined by its filter function which must be a
+function of one argument. During the parsing process this function
+might be called once or several times or it might not be called at
+all. If it's called its argument is an integer pos
+which is the current position within the target string. The filter can
+either return NIL
(which means that the subexpression
+represented by this filter didn't match) or an integer not smaller
+than pos
for success. A zero-length assertion
+should return pos
itself while a filter which
+wants to consume N
characters should return
+(+ POS N)
.
+
+If you supply the optional value length
and it is
+not NIL
then this is a promise to the regex engine that
+your filter will always consume exactly
+length
characters. The regex engine might use this
+information for optimization purposes but it is otherwise irrelevant
+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::*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
.
+
+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
.
+
+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
.
+
+
+
+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:
+
+* (defun my-info-filter (pos)
+ "Show some info about the matching process."
+ (format t "Called at position ~A~%" pos)
+ (loop with dim = (array-dimension cl-ppcre::*reg-starts* 0)
+ for i below dim
+ for reg-start = (aref cl-ppcre::*reg-starts* i)
+ for reg-end = (aref cl-ppcre::*reg-ends* i)
+ do (format t "Register ~A is currently " (1+ i))
+ when reg-start
+ (write-string cl-ppcre::*string* nil
+ do (write-char #\')
+ (write-string cl-ppcre::*string* nil
+ :start reg-start :end reg-end)
+ (write-char #\')
+ else
+ do (write-string "unbound")
+ do (terpri))
+ (terpri)
+ pos)
+MY-INFO-FILTER
+
+* (scan '(:sequence
+ (:register
+ (:greedy-repetition 0 nil
+ (:char-class (:range #\a #\z))))
+ (:filter my-info-filter 0) "X")
+ "bYcdeX")
+Called at position 1
+Register 1 is currently 'b'
+
+Called at position 0
+Register 1 is currently ''
+
+Called at position 1
+Register 1 is currently ''
+
+Called at position 5
+Register 1 is currently 'cde'
+
+2
+6
+#(2)
+#(5)
+
+* (scan '(:sequence
+ (:register
+ (:greedy-repetition 0 nil
+ (:char-class (:range #\a #\z))))
+ (:filter my-info-filter 0) "X")
+ "bYcdeZ")
+NIL
+
+* (defun my-weird-filter (pos)
+ "Only match at this point if either pos is odd and the character
+ we're looking at is lowerrcase or if pos is even and the next two
+ characters we're looking at are uppercase. Consume these characters if
+ there's a match."
+ (format t "Trying at position ~A~%" pos)
+ (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)))
+MY-WEIRD-FILTER
+
+* (defparameter *weird-regex*
+ `(:sequence "+" (:filter ,#'my-weird-filter) "+"))
+*WEIRD-REGEX*
+
+* (scan *weird-regex* "+A++a+AA+")
+Trying at position 1
+Trying at position 3
+Trying at position 4
+Trying at position 6
+5
+9
+#()
+#()
+
+* (fmakunbound 'my-weird-filter)
+MY-WEIRD-FILTER
+
+* (scan *weird-regex* "+A++a+AA+")
+Trying at position 1
+Trying at position 3
+Trying at position 4
+Trying at position 6
+5
+9
+#()
+#()
+
+
+Note that in the second call to SCAN
our filter wasn't
+invoked at all - it was optimized away by the regex engine because it
+knew that it couldn't match. Also note that *WEIRD-REGEX*
+still worked after we removed the global function definition of
+MY-WEIRD-FILTER
because the regular expression had
+captured the original definition.
+
+
+
+For more ideas about what you can do with filters see this
+thread on the mailing list.
+
+
+
+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"
.
+
+
+
+Depending on your Perl version you might encounter a couple of small
+incompatibilities with Perl most of which aren't due to CL-PPCRE:
+
+
+
+(Cf. case #629 of testdata
.)
+This is a
+bug in Perl 5.6.1 and earlier which has been fixed in 5.8.0.
+
+
+
+(Cf. case #430 of testdata
.)
+This is a
+bug in Perl 5.6.1 and earlier which has been fixed in 5.8.0.
+
+
+
+(Cf. case #662 of testdata
.)
+This is a
+bug in Perl which hasn't been fixed yet.
+
+
+
+(Cf. case #1439 of testdata
.)
+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
+disagree... :)
+
+
+
+(Cf. case #790 of testdata
.) I
+also think this a Perl bug but I currently have lost the drive to
+report it.
+
+
+
+(Cf. case #9 of testdata
.) For
+some strange reason that I don't understand MCL translates
+#\Return
to (CODE-CHAR 10)
while MacPerl
+translates "\r"
to (CODE-CHAR
+13)
. Hmmm...
+
+
+
+CL-PPCRE uses ALPHANUMERICP
+to decide whether a character matches Perl's
+"\w"
, so depending on your CL implementation
+you might encounter differences between Perl and CL-PPCRE when
+matching non-ASCII characters.
+
+
+
+
+
+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+):
+
+
+
+Test case | Repetitions | Perl (sec) | CL-PPCRE (sec) | Ratio CL-PPCRE/Perl |
+"@{['x' x 100]}" =~ /(.)*/s | 100000 | 0.1394 | 0.0700 | 0.5022 |
+"@{['x' x 1000]}" =~ /(.)*/s | 100000 | 0.1628 | 0.0600 | 0.3685 |
+"@{['x' x 10000]}" =~ /(.)*/s | 100000 | 0.5071 | 0.0600 | 0.1183 |
+"@{['x' x 100000]}" =~ /(.)*/s | 10000 | 0.3902 | 0.0000 | 0.0000 |
+"@{['x' x 100]}" =~ /.*/ | 100000 | 0.1520 | 0.0800 | 0.5262 |
+"@{['x' x 1000]}" =~ /.*/ | 100000 | 0.3786 | 0.5400 | 1.4263 |
+"@{['x' x 10000]}" =~ /.*/ | 10000 | 0.2709 | 0.5100 | 1.8826 |
+"@{['x' x 100000]}" =~ /.*/ | 1000 | 0.2734 | 0.5100 | 1.8656 |
+"@{['x' x 100]}" =~ /.*/s | 100000 | 0.1320 | 0.0300 | 0.2274 |
+"@{['x' x 1000]}" =~ /.*/s | 100000 | 0.1634 | 0.0300 | 0.1836 |
+"@{['x' x 10000]}" =~ /.*/s | 100000 | 0.5304 | 0.0300 | 0.0566 |
+"@{['x' x 100000]}" =~ /.*/s | 10000 | 0.3966 | 0.0000 | 0.0000 |
+"@{['x' x 100]}" =~ /x*/ | 100000 | 0.1507 | 0.0900 | 0.5970 |
+"@{['x' x 1000]}" =~ /x*/ | 100000 | 0.3782 | 0.6300 | 1.6658 |
+"@{['x' x 10000]}" =~ /x*/ | 10000 | 0.2730 | 0.6000 | 2.1981 |
+"@{['x' x 100000]}" =~ /x*/ | 1000 | 0.2708 | 0.5900 | 2.1790 |
+"@{['x' x 100]}" =~ /[xy]*/ | 100000 | 0.2637 | 0.1500 | 0.5688 |
+"@{['x' x 1000]}" =~ /[xy]*/ | 10000 | 0.1449 | 0.1200 | 0.8282 |
+"@{['x' x 10000]}" =~ /[xy]*/ | 1000 | 0.1344 | 0.1100 | 0.8185 |
+"@{['x' x 100000]}" =~ /[xy]*/ | 100 | 0.1355 | 0.1200 | 0.8857 |
+"@{['x' x 100]}" =~ /(.)*/ | 100000 | 0.1523 | 0.1100 | 0.7220 |
+"@{['x' x 1000]}" =~ /(.)*/ | 100000 | 0.3735 | 0.5700 | 1.5262 |
+"@{['x' x 10000]}" =~ /(.)*/ | 10000 | 0.2735 | 0.5100 | 1.8647 |
+"@{['x' x 100000]}" =~ /(.)*/ | 1000 | 0.2598 | 0.5000 | 1.9242 |
+"@{['x' x 100]}" =~ /(x)*/ | 100000 | 0.1565 | 0.1300 | 0.8307 |
+"@{['x' x 1000]}" =~ /(x)*/ | 100000 | 0.3783 | 0.6600 | 1.7446 |
+"@{['x' x 10000]}" =~ /(x)*/ | 10000 | 0.2720 | 0.6000 | 2.2055 |
+"@{['x' x 100000]}" =~ /(x)*/ | 1000 | 0.2725 | 0.6000 | 2.2020 |
+"@{['x' x 100]}" =~ /(y|x)*/ | 10000 | 0.2411 | 0.1000 | 0.4147 |
+"@{['x' x 1000]}" =~ /(y|x)*/ | 1000 | 0.2313 | 0.0900 | 0.3891 |
+"@{['x' x 10000]}" =~ /(y|x)*/ | 100 | 0.2336 | 0.0900 | 0.3852 |
+"@{['x' x 100000]}" =~ /(y|x)*/ | 10 | 0.4165 | 0.0900 | 0.2161 |
+"@{['x' x 100]}" =~ /([xy])*/ | 100000 | 0.2678 | 0.1800 | 0.6721 |
+"@{['x' x 1000]}" =~ /([xy])*/ | 10000 | 0.1459 | 0.1200 | 0.8227 |
+"@{['x' x 10000]}" =~ /([xy])*/ | 1000 | 0.1372 | 0.1100 | 0.8017 |
+"@{['x' x 100000]}" =~ /([xy])*/ | 100 | 0.1358 | 0.1100 | 0.8098 |
+"@{['x' x 100]}" =~ /((x){2})*/ | 10000 | 0.1073 | 0.0400 | 0.3727 |
+"@{['x' x 1000]}" =~ /((x){2})*/ | 10000 | 0.9146 | 0.2400 | 0.2624 |
+"@{['x' x 10000]}" =~ /((x){2})*/ | 1000 | 0.9020 | 0.2300 | 0.2550 |
+"@{['x' x 100000]}" =~ /((x){2})*/ | 100 | 0.8983 | 0.2300 | 0.2560 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}FOOBARBAZ" =~ /[a-z]*FOOBARBAZ/ | 100000 | 0.2829 | 0.2300 | 0.8129 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}FOOBARBAZ" =~ /[a-z]*FOOBARBAZ/ | 10000 | 0.1859 | 0.1700 | 0.9143 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}FOOBARBAZ" =~ /[a-z]*FOOBARBAZ/ | 1000 | 0.1420 | 0.1700 | 1.1968 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /[a-z]*FOOBARBAZ/ | 1000000 | 0.9196 | 0.4600 | 0.5002 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /[a-z]*FOOBARBAZ/ | 100000 | 0.2166 | 0.2500 | 1.1542 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /[a-z]*FOOBARBAZ/ | 10000 | 0.1465 | 0.2300 | 1.5696 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}FOOBARBAZ" =~ /([a-z])*FOOBARBAZ/ | 100000 | 0.2917 | 0.2600 | 0.8915 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}FOOBARBAZ" =~ /([a-z])*FOOBARBAZ/ | 10000 | 0.1811 | 0.1800 | 0.9942 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}FOOBARBAZ" =~ /([a-z])*FOOBARBAZ/ | 1000 | 0.1424 | 0.1600 | 1.1233 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /([a-z])*FOOBARBAZ/ | 1000000 | 0.9154 | 0.7400 | 0.8083 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /([a-z])*FOOBARBAZ/ | 100000 | 0.2170 | 0.2800 | 1.2901 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /([a-z])*FOOBARBAZ/ | 10000 | 0.1497 | 0.2300 | 1.5360 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}FOOBARBAZ" =~ /([a-z]|ab)*FOOBARBAZ/ | 10000 | 0.4359 | 0.1500 | 0.3441 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}FOOBARBAZ" =~ /([a-z]|ab)*FOOBARBAZ/ | 1000 | 0.5456 | 0.1500 | 0.2749 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}FOOBARBAZ" =~ /([a-z]|ab)*FOOBARBAZ/ | 10 | 0.2039 | 0.0600 | 0.2943 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /([a-z]|ab)*FOOBARBAZ/ | 1000000 | 0.9311 | 0.7400 | 0.7947 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /([a-z]|ab)*FOOBARBAZ/ | 100000 | 0.2162 | 0.2700 | 1.2489 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /([a-z]|ab)*FOOBARBAZ/ | 10000 | 0.1488 | 0.2300 | 1.5455 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..100)]}NOPE" =~ /[a-z]*FOOBARBAZ/i | 1000 | 0.1555 | 0.0000 | 0.0000 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..1000)]}NOPE" =~ /[a-z]*FOOBARBAZ/i | 10 | 0.1441 | 0.0000 | 0.0000 |
+"@{[join undef, map { chr(ord('a') + rand 26) } (1..10000)]}NOPE" =~ /[a-z]*FOOBARBAZ/i | 10 | 13.7150 | 0.0100 | 0.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.
+
+
+
+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 occurences of SCHAR
to CHAR
and
+redefine the macro in util.lisp
where the coercion takes
+place - that's all.
+
+
+
+
+
+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...
+
+
+
+In Perl the following code works as expected, i.e. it prints 1
.
+
+#!/usr/bin/perl -l
+
+$a = '\E*';
+print 1
+ if '\E*\E*' =~ /(?:\Q$a\E){2}/;
+
+
+If you try to do something similar in CL-PPCRE you get an error:
+
+
+* (let ((cl-ppcre:*allow-quoting* t)
+ (a "\\E*"))
+ (cl-ppcre:scan (concatenate 'string "(?:\\Q" a "\\E){2}") "\\E*\\E*"))
+Quantifier '*' not allowed at position 3 in string "(?:*\\E){2}"
+
+
+The error message might give you a hint as to why this happens:
+Because *ALLOW-QUOTING*
+was true the concatenated string was pre-processed before it
+was fed to CL-PPCRE's parser - the result of this pre-processing is
+"(?:*\\E){2}"
because the
+"\\E"
in the string A
was taken to
+be the end of the quoted section started by
+"\\Q"
. This cannot happen in Perl due to its
+complicated interpolation rules - see man perlop
for
+the scary details. It can happen in CL-PPCRE, though.
+Bummer!
+
+What gives? "\\Q...\\E"
in CL-PPCRE should only
+be used in literal strings. If you want to quote arbitrary strings
+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*"))
+0
+6
+#()
+#()
+
+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*"))
+0
+6
+#()
+#()
+
+
+
+
+
+* (let ((a "y\\y"))
+ (cl-ppcre: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
+
+
+'y\y' =~ /y\y/;
+
+
+or to
+
+
+$a = 'y\y';
+$a =~ /$a/;
+
+
+which should explain why it doesn't match.
+
+Still confused? You might want to try CL-INTERPOL.
+
+
+
+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.
+
+
+
+Since autumn 2004 AllegroCL offers
+a
+new regular expression API with a syntax very similar to
+CL-PPCRE. Although CL-PPCRE is quite fast already, AllegroCL's engine will
+most likely be even faster (but only on AllegroCL, of course). However, you might want to
+stick to CL-PPCRE because you have a "legacy" application or because
+you want your code to be portable to other Lisp implementations.
+Therefore, beginning from version 1.2.0, CL-PPCRE offers a
+"compatibility mode" where you can continue using the CL-PPCRE API as
+described above but deploy the AllegroCL regex
+engine under the hood. (The details are: Calls to CREATE-SCANNER
and SCAN
are dispatched to their AllegroCL
+counterparts EXCL:COMPILE-RE
+and EXCL:MATCH-RE
+while everything else is left as is.)
+
+The advantage of this mode is that you'll get a much smaller image and
+most likely faster code. (But note that CL-PPCRE needs to do a small amount of work to massage AllegroCL's output into the format expected by CL-PPCRE.) The downside is that your code won't be
+fully compatible with CL-PPCRE anymore. Here are some of the
+differences (most of which probably don't matter very often):
+
+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
+
+(push :use-acl-regexp2-engine *features*)
+
+before you compile CL-PPCRE.
+
+
+
+Although I didn't use their code I was heavily inspired by looking at
+the Scheme/CL regex implementations of Dorai
+Sitaram and Michael
+Parker. Also, the nice folks from CMUCL's 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.
+
+
+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.
+
+
+$Header: /usr/local/cvsrep/cl-ppcre/doc/index.html,v 1.113 2005/02/02 18:35:54 edi Exp $
+
BACK TO MY HOMEPAGE
+
+
+
\ No newline at end of file
diff --git a/practicals/libraries/cl-ppcre-1.2.3/errors.lisp b/practicals/libraries/cl-ppcre-1.2.3/errors.lisp
new file mode 100644
index 0000000..a279e6d
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/errors.lisp
@@ -0,0 +1,84 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/errors.lisp,v 1.13 2004/09/30 09:58:42 edi Exp $
+
+;;; Copyright (c) 2002-2004, 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)
+
+(defvar *syntax-error-string* nil
+ "The string which caused the syntax error.")
+
+(define-condition ppcre-error (simple-error)
+ ()
+ (:documentation "All errors signaled by CL-PPCRE are of
+this type."))
+
+(define-condition ppcre-syntax-error (ppcre-error)
+ ((string :initarg :string
+ :reader ppcre-syntax-error-string)
+ (pos :initarg :pos
+ :reader ppcre-syntax-error-pos))
+ (:default-initargs
+ :pos nil
+ :string *syntax-error-string*)
+ (:report (lambda (condition stream)
+ (format stream "~?~@[ at position ~A~]~@[ in string ~S~]"
+ (simple-condition-format-control condition)
+ (simple-condition-format-arguments condition)
+ (ppcre-syntax-error-pos condition)
+ (ppcre-syntax-error-string condition))))
+ (:documentation "Signaled if CL-PPCRE's parser encounters an error
+when trying to parse a regex string or to convert a parse tree into
+its internal representation."))
+
+(setf (documentation 'ppcre-syntax-error-string 'function)
+ "Returns the string the parser was parsing when the error was
+encountered \(or NIL if the error happened while trying to convert a
+parse tree).")
+
+(setf (documentation 'ppcre-syntax-error-pos 'function)
+ "Returns the position within the string where the error occured
+\(or NIL if the error happened while trying to convert a parse tree")
+
+(define-condition ppcre-invocation-error (ppcre-error)
+ ()
+ (:documentation "Signaled when CL-PPCRE functions are
+invoked with wrong arguments."))
+
+(defmacro signal-ppcre-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-ppcre-invocation-error (format-control &rest format-arguments)
+ `(error 'ppcre-invocation-error
+ :format-control ,format-control
+ :format-arguments (list ,@format-arguments)))
diff --git a/practicals/libraries/cl-ppcre-1.2.3/lexer.lisp b/practicals/libraries/cl-ppcre-1.2.3/lexer.lisp
new file mode 100644
index 0000000..e464fb1
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/lexer.lisp
@@ -0,0 +1,769 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/lexer.lisp,v 1.21 2004/09/30 09:58:42 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
+;;; strings like "\\10" correctly.)
+
+;;; Copyright (c) 2002-2004, 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)
+
+(declaim (inline map-char-to-special-class))
+(defun map-char-to-special-char-class (chr)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Maps escaped characters like \"\\d\" to the tokens which represent
+their associated character classes."
+ (case chr
+ ((#\d)
+ :digit-class)
+ ((#\D)
+ :non-digit-class)
+ ((#\w)
+ :word-char-class)
+ ((#\W)
+ :non-word-char-class)
+ ((#\s)
+ :whitespace-char-class)
+ ((#\S)
+ :non-whitespace-char-class)))
+
+(locally
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (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)))
+
+(defun make-lexer (string)
+ (declare (inline make-lexer-internal)
+ #-genera (type string string))
+ (make-lexer-internal :str (maybe-coerce-to-simple-string string)
+ :len (length string)))
+
+(declaim (inline end-of-string-p))
+(defun end-of-string-p (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Tests whether we're at the end of the regex string."
+ (<= (lexer-len lexer)
+ (lexer-pos lexer)))
+
+(declaim (inline looking-at-p))
+(defun looking-at-p (lexer chr)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Tests whether the next character the lexer would see is CHR.
+Does not respect extended mode."
+ (and (not (end-of-string-p lexer))
+ (char= (schar (lexer-str lexer) (lexer-pos lexer))
+ chr)))
+
+(declaim (inline next-char-non-extended))
+(defun next-char-non-extended (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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))))))
+
+(defun next-char (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Returns the next character which is to be examined and updates the
+POS slot. Respects extended mode, i.e. whitespace, comments, and also
+nested comments are skipped if applicable."
+ (let ((next-char (next-char-non-extended lexer))
+ last-loop-pos)
+ (loop
+ ;; remember where we started
+ (setq last-loop-pos (lexer-pos lexer))
+ ;; first we look for nested comments like (?#foo)
+ (when (and next-char
+ (char= next-char #\()
+ (looking-at-p lexer #\?))
+ (incf (lexer-pos lexer))
+ (cond ((looking-at-p lexer #\#)
+ ;; must be a nested comment - so we have to search for
+ ;; the closing parenthesis
+ (let ((error-pos (- (lexer-pos lexer) 2)))
+ (unless
+ ;; loop 'til ')' or end of regex string and
+ ;; return NIL if ')' wasn't encountered
+ (loop for skip-char = next-char
+ then (next-char-non-extended lexer)
+ while (and skip-char
+ (char/= skip-char #\)))
+ finally (return skip-char))
+ (signal-ppcre-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 #
+ (decf (lexer-pos lexer)))))
+ (when *extended-mode-p*
+ ;; now - if we're in extended mode - we skip whitespace and
+ ;; comments; repeat the following loop while we look at
+ ;; whitespace or #\#
+ (loop while (and next-char
+ (or (char= next-char #\#)
+ (whitespacep next-char)))
+ do (setq next-char
+ (if (char= next-char #\#)
+ ;; if we saw a comment marker skip until
+ ;; we're behind #\Newline...
+ (loop for skip-char = next-char
+ then (next-char-non-extended lexer)
+ while (and skip-char
+ (char/= skip-char #\Newline))
+ finally (return (next-char-non-extended lexer)))
+ ;; ...otherwise (whitespace) skip until we
+ ;; see the next non-whitespace character
+ (loop for skip-char = next-char
+ then (next-char-non-extended lexer)
+ while (and skip-char
+ (whitespacep skip-char))
+ finally (return skip-char))))))
+ ;; if the position has moved we have to repeat our tests
+ ;; because of cases like /^a (?#xxx) (?#yyy) {3}c/x which
+ ;; would be equivalent to /^a{3}c/ in Perl
+ (unless (> (lexer-pos lexer) last-loop-pos)
+ (return next-char)))))
+
+(declaim (inline fail))
+(defun fail (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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))
+ (setf (lexer-pos lexer) (pop (lexer-last-pos lexer)))
+ nil)
+
+(defun get-number (lexer &key (radix 10) max-length no-whitespace-p)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Read and consume the number the lexer is currently looking at and
+return it. Returns NIL if no number could be identified.
+RADIX is used as in PARSE-INTEGER. If MAX-LENGTH is not NIL we'll read
+at most the next MAX-LENGTH characters. If NO-WHITESPACE-P is not NIL
+we don't tolerate whitespace in front of the number."
+ (when (or (end-of-string-p lexer)
+ (and no-whitespace-p
+ (whitespacep (schar (lexer-str lexer) (lexer-pos lexer)))))
+ (return-from get-number nil))
+ (multiple-value-bind (integer new-pos)
+ (parse-integer (lexer-str lexer)
+ :start (lexer-pos lexer)
+ :end (if max-length
+ (let ((end-pos (+ (lexer-pos lexer)
+ (the fixnum max-length)))
+ (lexer-len (lexer-len lexer)))
+ (if (< end-pos lexer-len)
+ end-pos
+ lexer-len))
+ (lexer-len lexer))
+ :radix radix
+ :junk-allowed t)
+ (cond ((and integer (>= (the fixnum integer) 0))
+ (setf (lexer-pos lexer) new-pos)
+ integer)
+ (t nil))))
+
+(declaim (inline try-number))
+(defun try-number (lexer &key (radix 10) max-length no-whitespace-p)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Like GET-NUMBER but won't consume anything if no number is seen."
+ ;; remember current position
+ (push (lexer-pos lexer) (lexer-last-pos lexer))
+ (let ((number (get-number lexer
+ :radix radix
+ :max-length max-length
+ :no-whitespace-p no-whitespace-p)))
+ (or number (fail lexer))))
+
+(declaim (inline make-char-from-code))
+(defun make-char-from-code (number error-pos)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Create character from char-code NUMBER. NUMBER can be NIL
+which is interpreted as 0. ERROR-POS is the position where
+the corresponding number started within the regex string."
+ ;; Only look at rightmost eight bits in compliance with Perl
+ (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))))
+
+(defun unescape-char (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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"))
+ (let ((chr (next-char-non-extended lexer)))
+ (case chr
+ ((#\E)
+ ;; if \Q quoting is on this is ignored, otherwise it's just an
+ ;; #\E
+ (if *allow-quoting*
+ :void
+ #\E))
+ ((#\c)
+ ;; \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"))
+ (code-char (logxor #x40 (char-code (char-upcase next-char))))))
+ ((#\x)
+ ;; \x should be followed by a hexadecimal char code,
+ ;; two digits or less
+ (let* ((error-pos (lexer-pos lexer))
+ (number (get-number lexer :radix 16 :max-length 2 :no-whitespace-p t)))
+ ;; note that it is OK if \x is followed by zero digits
+ (make-char-from-code number error-pos)))
+ ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9)
+ ;; \x should be followed by an octal char code,
+ ;; three digits or less
+ (let* ((error-pos (decf (lexer-pos lexer)))
+ (number (get-number lexer :radix 8 :max-length 3)))
+ (make-char-from-code number error-pos)))
+ ;; the following five character names are 'semi-standard'
+ ;; according to the CLHS but I'm not aware of any implementation
+ ;; that doesn't implement them
+ ((#\t)
+ #\Tab)
+ ((#\n)
+ #\Newline)
+ ((#\r)
+ #\Return)
+ ((#\f)
+ #\Page)
+ ((#\b)
+ #\Backspace)
+ ((#\a)
+ (code-char 7)) ; ASCII bell
+ ((#\e)
+ (code-char 27)) ; ASCII escape
+ (otherwise
+ ;; all other characters aren't affected by a backslash
+ chr))))
+
+(defun collect-char-class (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Reads and consumes characters from regex string until a right
+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."
+ (let ((start-pos (lexer-pos lexer)) ; remember start for error message
+ hyphen-seen
+ last-char
+ list)
+ (flet ((handle-char (c)
+ "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))
+ (t
+ (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
+ (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"))))
+
+(defun maybe-parse-flags (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Reads a sequence of modifiers \(including #\\- to reverse their
+meaning) and returns a corresponding list of \"flag\" tokens. The
+\"x\" modifier is treated specially in that it dynamically modifies
+the behaviour of the lexer itself via the special variable
+*EXTENDED-MODE-P*."
+ (prog1
+ (loop with set = t
+ for chr = (next-char-non-extended lexer)
+ unless chr
+ do (signal-ppcre-syntax-error "Unexpected end of string")
+ while (find chr "-imsx" :test #'char=)
+ ;; the first #\- will invert the meaning of all modifiers
+ ;; following it
+ if (char= chr #\-)
+ do (setq set nil)
+ else if (char= chr #\x)
+ do (setq *extended-mode-p* set)
+ else collect (if set
+ (case chr
+ ((#\i)
+ :case-insensitive-p)
+ ((#\m)
+ :multi-line-mode-p)
+ ((#\s)
+ :single-line-mode-p))
+ (case chr
+ ((#\i)
+ :case-sensitive-p)
+ ((#\m)
+ :not-multi-line-mode-p)
+ ((#\s)
+ :not-single-line-mode-p))))
+ (decf (lexer-pos lexer))))
+
+(defun get-quantifier (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Returns a list of two values (min max) if what the lexer is looking
+at can be interpreted as a quantifier. Otherwise returns NIL and
+resets the lexer to its old position."
+ ;; remember starting position for FAIL and UNGET-TOKEN functions
+ (push (lexer-pos lexer) (lexer-last-pos lexer))
+ (let ((next-char (next-char lexer)))
+ (case next-char
+ ((#\*)
+ ;; * (Kleene star): match 0 or more times
+ '(0 nil))
+ ((#\+)
+ ;; +: match 1 or more times
+ '(1 nil))
+ ((#\?)
+ ;; ?: match 0 or 1 times
+ '(0 1))
+ ((#\{)
+ ;; one of
+ ;; {n}: match exactly n times
+ ;; {n,}: match at least n times
+ ;; {n,m}: match at least n but not more than m times
+ ;; note that anything not matching one of these patterns will
+ ;; be interpreted literally - even whitespace isn't allowed
+ (let ((num1 (get-number lexer :no-whitespace-p t)))
+ (if num1
+ (let ((next-char (next-char-non-extended lexer)))
+ (case next-char
+ ((#\,)
+ (let* ((num2 (get-number lexer :no-whitespace-p t))
+ (next-char (next-char-non-extended lexer)))
+ (case next-char
+ ((#\})
+ ;; this is the case {n,} (NUM2 is NIL) or {n,m}
+ (list num1 num2))
+ (otherwise
+ (fail lexer)))))
+ ((#\})
+ ;; this is the case {n}
+ (list num1 num1))
+ (otherwise
+ (fail lexer))))
+ ;; no number following left curly brace, so we treat it
+ ;; like a normal character
+ (fail lexer))))
+ ;; cannot be a quantifier
+ (otherwise
+ (fail lexer)))))
+
+(defun get-token (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Returns and consumes the next token from the regex string (or NIL)."
+ ;; remember starting position for UNGET-TOKEN function
+ (push (lexer-pos lexer)
+ (lexer-last-pos lexer))
+ (let ((next-char (next-char lexer)))
+ (cond (next-char
+ (case next-char
+ ;; the easy cases first - the following six characters
+ ;; always have a special meaning and get translated
+ ;; into tokens immediately
+ ((#\))
+ :close-paren)
+ ((#\|)
+ :vertical-bar)
+ ((#\?)
+ :question-mark)
+ ((#\.)
+ :everything)
+ ((#\^)
+ :start-anchor)
+ ((#\$)
+ :end-anchor)
+ ((#\+ #\*)
+ ;; 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))
+ ((#\{)
+ ;; left brace isn't a special character in it's own
+ ;; right but we must check if what follows might
+ ;; look like a quantifier
+ (let ((this-pos (lexer-pos lexer))
+ (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))))
+ (setf (lexer-pos lexer) this-pos
+ (lexer-last-pos lexer) this-last-pos)
+ next-char))
+ ((#\[)
+ ;; left bracket always starts a character class
+ (cons (cond ((looking-at-p lexer #\^)
+ (incf (lexer-pos lexer))
+ :inverted-char-class)
+ (t
+ :char-class))
+ (collect-char-class lexer)))
+ ((#\\)
+ ;; backslash might mean different things so we have
+ ;; to peek one char ahead:
+ (let ((next-char (next-char-non-extended lexer)))
+ (case next-char
+ ((#\A)
+ :modeless-start-anchor)
+ ((#\Z)
+ :modeless-end-anchor)
+ ((#\z)
+ :modeless-end-anchor-no-newline)
+ ((#\b)
+ :word-boundary)
+ ((#\B)
+ :non-word-boundary)
+ ((#\d #\D #\w #\W #\s #\S)
+ ;; these will be treated like character classes
+ (map-char-to-special-char-class next-char))
+ ((#\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9)
+ ;; uh, a digit...
+ (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))
+ (cond ((and (> backref-number (lexer-reg lexer))
+ (<= 10 backref-number))
+ ;; \10 and higher are treated as octal
+ ;; character codes if we haven't
+ ;; opened that much register groups
+ ;; yet
+ (setf (lexer-pos lexer) old-pos)
+ ;; re-read the number from the old
+ ;; position and convert it to its
+ ;; corresponding character
+ (make-char-from-code (get-number lexer :radix 8 :max-length 3)
+ old-pos))
+ (t
+ ;; otherwise this must refer to a
+ ;; backreference
+ (list :back-reference backref-number)))))
+ ((#\0)
+ ;; this always means an octal character code
+ ;; (at most three digits)
+ (let ((old-pos (decf (lexer-pos lexer))))
+ (make-char-from-code (get-number lexer :radix 8 :max-length 3)
+ old-pos)))
+ (otherwise
+ ;; in all other cases just unescape the
+ ;; character
+ (decf (lexer-pos lexer))
+ (unescape-char lexer)))))
+ ((#\()
+ ;; an open parenthesis might mean different things
+ ;; depending on what follows...
+ (cond ((looking-at-p lexer #\?)
+ ;; this is the case '(?' (and probably more behind)
+ (incf (lexer-pos lexer))
+ ;; we have to check for modifiers first
+ ;; because a colon might follow
+ (let* ((flags (maybe-parse-flags lexer))
+ (next-char (next-char-non-extended lexer)))
+ ;; modifiers are only allowed if a colon
+ ;; 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))))
+ (case next-char
+ ((nil)
+ ;; syntax error
+ (signal-ppcre-syntax-error
+ "End of string following '(?'"))
+ ((#\))
+ ;; an empty group except for the flags
+ ;; (if there are any)
+ (or (and flags
+ (cons :flags flags))
+ :void))
+ ((#\()
+ ;; branch
+ :open-paren-paren)
+ ((#\>)
+ ;; standalone
+ :open-paren-greater)
+ ((#\=)
+ ;; positive look-ahead
+ :open-paren-equal)
+ ((#\!)
+ ;; negative look-ahead
+ :open-paren-exclamation)
+ ((#\:)
+ ;; non-capturing group - return flags as
+ ;; second value
+ (values :open-paren-colon flags))
+ ((#\<)
+ ;; might be a look-behind assertion, so
+ ;; check next character
+ (let ((next-char (next-char-non-extended lexer)))
+ (case next-char
+ ((#\=)
+ ;; positive look-behind
+ :open-paren-less-equal)
+ ((#\!)
+ ;; negative look-behind
+ :open-paren-less-exclamation)
+ ((#\))
+ ;; Perl allows "(?<)" and treats
+ ;; it like a null string
+ :void)
+ ((nil)
+ ;; syntax error
+ (signal-ppcre-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 )))))
+ (otherwise
+ (signal-ppcre-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
+ ;; parenthesis and leave it like that
+ :open-paren)))
+ (otherwise
+ ;; all other characters are their own tokens
+ next-char)))
+ ;; we didn't get a character (this if the "else" branch from
+ ;; the first IF), so we don't return a token but NIL
+ (t
+ (pop (lexer-last-pos lexer))
+ nil))))
+
+(declaim (inline unget-token))
+(defun unget-token (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Moves the lexer back to the last position stored in the LAST-POS stack."
+ (if (lexer-last-pos lexer)
+ (setf (lexer-pos lexer)
+ (pop (lexer-last-pos lexer)))
+ (error "No token to unget \(this should not happen)")))
+
+(declaim (inline start-of-subexpr-p))
+(defun start-of-subexpr-p (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Tests whether the next token can start a valid sub-expression, i.e.
+a stand-alone regex."
+ (let* ((pos (lexer-pos lexer))
+ (next-char (next-char lexer)))
+ (not (or (null next-char)
+ (prog1
+ (member (the character next-char)
+ '(#\) #\|)
+ :test #'char=)
+ (setf (lexer-pos lexer) pos))))))
diff --git a/practicals/libraries/cl-ppcre-1.2.3/load.lisp b/practicals/libraries/cl-ppcre-1.2.3/load.lisp
new file mode 100644
index 0000000..28a68a8
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/load.lisp
@@ -0,0 +1,67 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/load.lisp,v 1.12 2005/02/02 18:34:30 edi Exp $
+
+;;; Copyright (c) 2002-2004, 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/practicals/libraries/cl-ppcre-1.2.3/optimize.lisp b/practicals/libraries/cl-ppcre-1.2.3/optimize.lisp
new file mode 100644
index 0000000..d704dd3
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/optimize.lisp
@@ -0,0 +1,582 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/optimize.lisp,v 1.22 2005/01/24 14:06:38 edi Exp $
+
+;;; This file contains optimizations which can be applied to converted
+;;; parse trees.
+
+;;; Copyright (c) 2002-2004, 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)
+
+(defgeneric flatten (regex)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Merges adjacent sequences and alternations, i.e. it
+transforms # # #>> to
+# # #>. This is a destructive
+operation on REGEX."))
+
+(defmethod flatten ((seq seq))
+ ;; this looks more complicated than it is because we modify SEQ in
+ ;; place to avoid unnecessary consing
+ (let ((elements-rest (elements seq)))
+ (loop
+ (unless elements-rest
+ (return))
+ (let ((flattened-element (flatten (car elements-rest)))
+ (next-elements-rest (cdr elements-rest)))
+ (cond ((typep flattened-element 'seq)
+ ;; FLATTENED-ELEMENT is a SEQ object, so we "splice"
+ ;; it into out list of elements
+ (let ((flattened-element-elements
+ (elements flattened-element)))
+ (setf (car elements-rest)
+ (car flattened-element-elements)
+ (cdr elements-rest)
+ (nconc (cdr flattened-element-elements)
+ (cdr elements-rest)))))
+ (t
+ ;; otherwise we just replace the current element with
+ ;; its flattened counterpart
+ (setf (car elements-rest) flattened-element)))
+ (setq elements-rest next-elements-rest))))
+ (let ((elements (elements seq)))
+ (cond ((cadr elements)
+ seq)
+ ((cdr elements)
+ (first elements))
+ (t (make-instance 'void)))))
+
+(defmethod flatten ((alternation alternation))
+ ;; same algorithm as above
+ (let ((choices-rest (choices alternation)))
+ (loop
+ (unless choices-rest
+ (return))
+ (let ((flattened-choice (flatten (car choices-rest)))
+ (next-choices-rest (cdr choices-rest)))
+ (cond ((typep flattened-choice 'alternation)
+ (let ((flattened-choice-choices
+ (choices flattened-choice)))
+ (setf (car choices-rest)
+ (car flattened-choice-choices)
+ (cdr choices-rest)
+ (nconc (cdr flattened-choice-choices)
+ (cdr choices-rest)))))
+ (t
+ (setf (car choices-rest) flattened-choice)))
+ (setq choices-rest next-choices-rest))))
+ (let ((choices (choices alternation)))
+ (cond ((cadr choices)
+ alternation)
+ ((cdr choices)
+ (first choices))
+ (t (signal-ppcre-syntax-error
+ "Encountered alternation without choices.")))))
+
+(defmethod flatten ((branch branch))
+ (with-slots ((test test)
+ (then-regex then-regex)
+ (else-regex else-regex))
+ branch
+ (setq test
+ (if (numberp test)
+ test
+ (flatten test))
+ then-regex (flatten then-regex)
+ else-regex (flatten else-regex))
+ branch))
+
+(defmethod flatten ((regex regex))
+ (typecase regex
+ ((or repetition register lookahead lookbehind standalone)
+ ;; if REGEX contains exactly one inner REGEX object flatten it
+ (setf (regex regex)
+ (flatten (regex regex)))
+ regex)
+ (t
+ ;; otherwise (ANCHOR, BACK-REFERENCE, CHAR-CLASS, EVERYTHING,
+ ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY)
+ ;; do nothing
+ regex)))
+
+(defgeneric gather-strings (regex)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Collects adjacent strings or characters into one
+string provided they have the same case mode. This is a destructive
+operation on REGEX."))
+
+(defmethod gather-strings ((seq seq))
+ ;; note that GATHER-STRINGS is to be applied after FLATTEN, i.e. it
+ ;; expects SEQ to be flattened already; in particular, SEQ cannot be
+ ;; empty and cannot contain embedded SEQ objects
+ (let* ((start-point (cons nil (elements seq)))
+ (curr-point start-point)
+ old-case-mode
+ collector
+ collector-start
+ (collector-length 0)
+ skip)
+ (declare (type fixnum collector-length))
+ (loop
+ (let ((elements-rest (cdr curr-point)))
+ (unless elements-rest
+ (return))
+ (let* ((element (car elements-rest))
+ (case-mode (case-mode element old-case-mode)))
+ (cond ((and case-mode
+ (eq case-mode old-case-mode))
+ ;; if ELEMENT is a STR and we have collected a STR of
+ ;; the same case mode in the last iteration we
+ ;; concatenate ELEMENT onto COLLECTOR and remember the
+ ;; value of its SKIP slot
+ (let ((old-collector-length collector-length))
+ (unless (and (adjustable-array-p collector)
+ (array-has-fill-pointer-p collector))
+ (setq collector
+ (make-array collector-length
+ :initial-contents collector
+ :element-type 'character
+ :fill-pointer t
+ :adjustable t)
+ collector-start nil))
+ (adjust-array collector
+ (incf collector-length (len element))
+ :fill-pointer t)
+ (setf (subseq collector
+ old-collector-length)
+ (str element)
+ ;; it suffices to remember the last SKIP slot
+ ;; because due to the way MAYBE-ACCUMULATE
+ ;; works adjacent STR objects have the same
+ ;; SKIP value
+ skip (skip element)))
+ (setf (cdr curr-point) (cdr elements-rest)))
+ (t
+ (let ((collected-string
+ (cond (collector-start
+ collector-start)
+ (collector
+ ;; if we have collected something already
+ ;; we convert it into a STR
+ (make-instance 'str
+ :skip skip
+ :str collector
+ :case-insensitive-p
+ (eq old-case-mode
+ :case-insensitive)))
+ (t nil))))
+ (cond (case-mode
+ ;; if ELEMENT is a string with a different case
+ ;; mode than the last one we have either just
+ ;; converted COLLECTOR into a STR or COLLECTOR
+ ;; is still empty; in both cases we can now
+ ;; begin to fill it anew
+ (setq collector (str element)
+ collector-start element
+ ;; and we remember the SKIP value as above
+ skip (skip element)
+ collector-length (len element))
+ (cond (collected-string
+ (setf (car elements-rest)
+ collected-string
+ curr-point
+ (cdr curr-point)))
+ (t
+ (setf (cdr curr-point)
+ (cdr elements-rest)))))
+ (t
+ ;; otherwise this is not a STR so we apply
+ ;; GATHER-STRINGS to it and collect it directly
+ ;; into RESULT
+ (cond (collected-string
+ (setf (car elements-rest)
+ collected-string
+ curr-point
+ (cdr curr-point)
+ (cdr curr-point)
+ (cons (gather-strings element)
+ (cdr curr-point))
+ curr-point
+ (cdr curr-point)))
+ (t
+ (setf (car elements-rest)
+ (gather-strings element)
+ curr-point
+ (cdr curr-point))))
+ ;; we also have to empty COLLECTOR here in case
+ ;; it was still filled from the last iteration
+ (setq collector nil
+ collector-start nil))))))
+ (setq old-case-mode case-mode))))
+ (when collector
+ (setf (cdr curr-point)
+ (cons
+ (make-instance 'str
+ :skip skip
+ :str collector
+ :case-insensitive-p
+ (eq old-case-mode
+ :case-insensitive))
+ nil)))
+ (setf (elements seq) (cdr start-point))
+ seq))
+
+(defmethod gather-strings ((alternation alternation))
+ ;; loop ON the choices of ALTERNATION so we can modify them directly
+ (loop for choices-rest on (choices alternation)
+ while choices-rest
+ do (setf (car choices-rest)
+ (gather-strings (car choices-rest))))
+ alternation)
+
+(defmethod gather-strings ((branch branch))
+ (with-slots ((test test)
+ (then-regex then-regex)
+ (else-regex else-regex))
+ branch
+ (setq test
+ (if (numberp test)
+ test
+ (gather-strings test))
+ then-regex (gather-strings then-regex)
+ else-regex (gather-strings else-regex))
+ branch))
+
+(defmethod gather-strings ((regex regex))
+ (typecase regex
+ ((or repetition register lookahead lookbehind standalone)
+ ;; if REGEX contains exactly one inner REGEX object apply
+ ;; GATHER-STRINGS to it
+ (setf (regex regex)
+ (gather-strings (regex regex)))
+ regex)
+ (t
+ ;; otherwise (ANCHOR, BACK-REFERENCE, CHAR-CLASS, EVERYTHING,
+ ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY)
+ ;; do nothing
+ regex)))
+
+;; Note that START-ANCHORED-P will be called after FLATTEN and GATHER-STRINGS.
+
+(defgeneric start-anchored-p (regex &optional in-seq-p)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Returns T if REGEX starts with a \"real\" start
+anchor, i.e. one that's not in multi-line mode, NIL otherwise. If
+IN-SEQ-P is true the function will return :ZERO-LENGTH if REGEX is a
+zero-length assertion."))
+
+(defmethod start-anchored-p ((seq seq) &optional in-seq-p)
+ (declare (ignore in-seq-p))
+ ;; note that START-ANCHORED-P is to be applied after FLATTEN and
+ ;; GATHER-STRINGS, i.e. SEQ cannot be empty and cannot contain
+ ;; embedded SEQ objects
+ (loop for element in (elements seq)
+ for anchored-p = (start-anchored-p element t)
+ ;; skip zero-length elements because they won't affect the
+ ;; "anchoredness" of the sequence
+ while (eq anchored-p :zero-length)
+ finally (return (and anchored-p (not (eq anchored-p :zero-length))))))
+
+(defmethod start-anchored-p ((alternation alternation) &optional in-seq-p)
+ (declare (ignore in-seq-p))
+ ;; clearly an alternation can only be start-anchored if all of its
+ ;; choices are start-anchored
+ (loop for choice in (choices alternation)
+ always (start-anchored-p choice)))
+
+(defmethod start-anchored-p ((branch branch) &optional in-seq-p)
+ (declare (ignore in-seq-p))
+ (and (start-anchored-p (then-regex branch))
+ (start-anchored-p (else-regex branch))))
+
+(defmethod start-anchored-p ((repetition repetition) &optional in-seq-p)
+ (declare (ignore in-seq-p))
+ ;; well, this wouldn't make much sense, but anyway...
+ (and (plusp (minimum repetition))
+ (start-anchored-p (regex repetition))))
+
+(defmethod start-anchored-p ((register register) &optional in-seq-p)
+ (declare (ignore in-seq-p))
+ (start-anchored-p (regex register)))
+
+(defmethod start-anchored-p ((standalone standalone) &optional in-seq-p)
+ (declare (ignore in-seq-p))
+ (start-anchored-p (regex standalone)))
+
+(defmethod start-anchored-p ((anchor anchor) &optional in-seq-p)
+ (declare (ignore in-seq-p))
+ (and (startp anchor)
+ (not (multi-line-p anchor))))
+
+(defmethod start-anchored-p ((regex regex) &optional in-seq-p)
+ (typecase regex
+ ((or lookahead lookbehind word-boundary void)
+ ;; zero-length assertions
+ (if in-seq-p
+ :zero-length
+ nil))
+ (filter
+ (if (and in-seq-p
+ (len regex)
+ (zerop (len regex)))
+ :zero-length
+ nil))
+ (t
+ ;; BACK-REFERENCE, CHAR-CLASS, EVERYTHING, and STR
+ nil)))
+
+;; Note that END-STRING-AUX will be called after FLATTEN and GATHER-STRINGS.
+
+(defgeneric end-string-aux (regex &optional old-case-insensitive-p)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Returns the constant string (if it exists) REGEX
+ends with wrapped into a STR object, otherwise NIL.
+OLD-CASE-INSENSITIVE-P is the CASE-INSENSITIVE-P slot of the last STR
+collected or :VOID if no STR has been collected yet. (This is a helper
+function called by END-STRIN.)"))
+
+(defmethod end-string-aux ((str str)
+ &optional (old-case-insensitive-p :void))
+ (declare (special last-str))
+ (cond ((and (not (skip str)) ; avoid constituents of STARTS-WITH
+ ;; only use STR if nothing has been collected yet or if
+ ;; the collected string has the same value for
+ ;; CASE-INSENSITIVE-P
+ (or (eq old-case-insensitive-p :void)
+ (eq (case-insensitive-p str) old-case-insensitive-p)))
+ (setf last-str str
+ ;; set the SKIP property of this STR
+ (skip str) t)
+ str)
+ (t nil)))
+
+(defmethod end-string-aux ((seq seq)
+ &optional (old-case-insensitive-p :void))
+ (declare (special continuep))
+ (let (case-insensitive-p
+ concatenated-string
+ concatenated-start
+ (concatenated-length 0))
+ (declare (type fixnum concatenated-length))
+ (loop for element in (reverse (elements seq))
+ ;; remember the case-(in)sensitivity of the last relevant
+ ;; STR object
+ for loop-old-case-insensitive-p = old-case-insensitive-p
+ then (if skip
+ loop-old-case-insensitive-p
+ (case-insensitive-p element-end))
+ ;; the end-string of the current element
+ for element-end = (end-string-aux element
+ loop-old-case-insensitive-p)
+ ;; whether we encountered a zero-length element
+ for skip = (if element-end
+ (zerop (len element-end))
+ nil)
+ ;; set CONTINUEP to NIL if we have to stop collecting to
+ ;; alert END-STRING-AUX methods on enclosing SEQ objects
+ unless element-end
+ do (setq continuep nil)
+ ;; end loop if we neither got a STR nor a zero-length
+ ;; element
+ while element-end
+ ;; only collect if not zero-length
+ unless skip
+ do (cond (concatenated-string
+ (when concatenated-start
+ (setf concatenated-string
+ (make-array concatenated-length
+ :initial-contents (reverse (str concatenated-start))
+ :element-type 'character
+ :fill-pointer t
+ :adjustable t)
+ concatenated-start nil))
+ (let ((len (len element-end))
+ (str (str element-end)))
+ (declare (type fixnum len))
+ (incf concatenated-length len)
+ (loop for i of-type fixnum downfrom (1- len) to 0
+ do (vector-push-extend (char str i)
+ concatenated-string))))
+ (t
+ (setf concatenated-string
+ t
+ concatenated-start
+ element-end
+ concatenated-length
+ (len element-end)
+ case-insensitive-p
+ (case-insensitive-p element-end))))
+ ;; stop collecting if END-STRING-AUX on inner SEQ has said so
+ while continuep)
+ (cond ((zerop concatenated-length)
+ ;; don't bother to return zero-length strings
+ nil)
+ (concatenated-start
+ concatenated-start)
+ (t
+ (make-instance 'str
+ :str (nreverse concatenated-string)
+ :case-insensitive-p case-insensitive-p)))))
+
+(defmethod end-string-aux ((register register)
+ &optional (old-case-insensitive-p :void))
+ (end-string-aux (regex register) old-case-insensitive-p))
+
+(defmethod end-string-aux ((standalone standalone)
+ &optional (old-case-insensitive-p :void))
+ (end-string-aux (regex standalone) old-case-insensitive-p))
+
+(defmethod end-string-aux ((regex regex)
+ &optional (old-case-insensitive-p :void))
+ (declare (special last-str end-anchored-p continuep))
+ (typecase regex
+ ((or anchor lookahead lookbehind word-boundary void)
+ ;; a zero-length REGEX object - for the sake of END-STRING-AUX
+ ;; this is a zero-length string
+ (when (and (typep regex 'anchor)
+ (not (startp regex))
+ (or (no-newline-p regex)
+ (not (multi-line-p regex)))
+ (eq old-case-insensitive-p :void))
+ ;; if this is a "real" end-anchor and we haven't collected
+ ;; anything so far we can set END-ANCHORED-P (where 1 or 0
+ ;; indicate whether we accept a #\Newline at the end or not)
+ (setq end-anchored-p (if (no-newline-p regex) 0 1)))
+ (make-instance 'str
+ :str ""
+ :case-insensitive-p :void))
+ (t
+ ;; (ALTERNATION, BACK-REFERENCE, BRANCH, CHAR-CLASS, EVERYTHING,
+ ;; REPETITION, FILTER)
+ nil)))
+
+(defmethod end-string ((regex regex))
+ (declare (special end-string-offset))
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Returns the constant string (if it exists) REGEX ends with wrapped
+into a STR object, otherwise NIL."
+ ;; LAST-STR points to the last STR object (seen from the end) that's
+ ;; part of END-STRING; CONTINUEP is set to T if we stop collecting
+ ;; in the middle of a SEQ
+ (let ((continuep t)
+ last-str)
+ (declare (special continuep last-str))
+ (prog1
+ (end-string-aux regex)
+ (when last-str
+ ;; if we've found something set the START-OF-END-STRING-P of
+ ;; the leftmost STR collected accordingly and remember the
+ ;; OFFSET of this STR (in a special variable provided by the
+ ;; caller of this function)
+ (setf (start-of-end-string-p last-str) t
+ end-string-offset (offset last-str))))))
+
+(defgeneric compute-min-rest (regex current-min-rest)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Returns the minimal length of REGEX plus
+CURRENT-MIN-REST. This is similar to REGEX-MIN-LENGTH except that it
+recurses down into REGEX and sets the MIN-REST slots of REPETITION
+objects."))
+
+(defmethod compute-min-rest ((seq seq) current-min-rest)
+ (loop for element in (reverse (elements seq))
+ for last-min-rest = current-min-rest then this-min-rest
+ for this-min-rest = (compute-min-rest element last-min-rest)
+ finally (return this-min-rest)))
+
+(defmethod compute-min-rest ((alternation alternation) current-min-rest)
+ (loop for choice in (choices alternation)
+ minimize (compute-min-rest choice current-min-rest)))
+
+(defmethod compute-min-rest ((branch branch) current-min-rest)
+ (min (compute-min-rest (then-regex branch) current-min-rest)
+ (compute-min-rest (else-regex branch) current-min-rest)))
+
+(defmethod compute-min-rest ((str str) current-min-rest)
+ (+ current-min-rest (len str)))
+
+(defmethod compute-min-rest ((filter filter) current-min-rest)
+ (+ current-min-rest (or (len filter) 0)))
+
+(defmethod compute-min-rest ((repetition repetition) current-min-rest)
+ (setf (min-rest repetition) current-min-rest)
+ (compute-min-rest (regex repetition) current-min-rest)
+ (+ current-min-rest (* (minimum repetition) (min-len repetition))))
+
+(defmethod compute-min-rest ((register register) current-min-rest)
+ (compute-min-rest (regex register) current-min-rest))
+
+(defmethod compute-min-rest ((standalone standalone) current-min-rest)
+ (declare (ignore current-min-rest))
+ (compute-min-rest (regex standalone) 0))
+
+(defmethod compute-min-rest ((lookahead lookahead) current-min-rest)
+ (compute-min-rest (regex lookahead) 0)
+ current-min-rest)
+
+(defmethod compute-min-rest ((lookbehind lookbehind) current-min-rest)
+ (compute-min-rest (regex lookbehind) (+ current-min-rest (len lookbehind)))
+ current-min-rest)
+
+(defmethod compute-min-rest ((regex regex) current-min-rest)
+ (typecase regex
+ ((or char-class everything)
+ (1+ current-min-rest))
+ (t
+ ;; zero min-len and no embedded regexes (ANCHOR,
+ ;; BACK-REFERENCE, VOID, and WORD-BOUNDARY)
+ current-min-rest)))
diff --git a/practicals/libraries/cl-ppcre-1.2.3/packages.lisp b/practicals/libraries/cl-ppcre-1.2.3/packages.lisp
new file mode 100644
index 0000000..2cecea8
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/packages.lisp
@@ -0,0 +1,104 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/packages.lisp,v 1.17 2004/09/30 09:58:42 edi Exp $
+
+;;; Copyright (c) 2002-2004, 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)
+
+#-: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*
+ #: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*"
+ "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"))
diff --git a/practicals/libraries/cl-ppcre-1.2.3/parser.lisp b/practicals/libraries/cl-ppcre-1.2.3/parser.lisp
new file mode 100644
index 0000000..559869f
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/parser.lisp
@@ -0,0 +1,347 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/parser.lisp,v 1.17 2004/04/20 11:37:36 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.
+
+;;; Copyright (c) 2002-2004, 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 group (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Parses and consumes a .
+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."
+ (multiple-value-bind (open-token flags)
+ (get-token lexer)
+ (cond ((eq open-token :open-paren-paren)
+ ;; special case for conditional regular expressions; note
+ ;; that at this point we accept a couple of illegal
+ ;; combinations which'll be sorted out later by the
+ ;; converter
+ (let* ((open-paren-pos (car (lexer-last-pos lexer)))
+ ;; check if what follows "(?(" is a number
+ (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))
+ (cond (number
+ ;; condition is a number (i.e. refers to a
+ ;; back-reference)
+ (let* ((inner-close-token (get-token lexer))
+ (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"))
+ (unless (eq close-token :close-paren)
+ (signal-ppcre-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
+ ;; look-behind or look-ahead); and here comes a
+ ;; terrible kludge: instead of being cleanly
+ ;; separated from the lexer, the parser pushes
+ ;; back the lexer by one position, thereby
+ ;; landing in the middle of the 'token' "(?(" -
+ ;; yuck!!
+ (decf (lexer-pos lexer))
+ (let* ((inner-reg-expr (group lexer))
+ (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"))
+ (list :branch inner-reg-expr reg-expr))))))
+ ((member open-token '(:open-paren
+ :open-paren-colon
+ :open-paren-greater
+ :open-paren-equal
+ :open-paren-exclamation
+ :open-paren-less-equal
+ :open-paren-less-exclamation)
+ :test #'eq)
+ ;; make changes to extended-mode-p local
+ (let ((*extended-mode-p* *extended-mode-p*))
+ ;; we saw one of the six token representing opening
+ ;; parentheses
+ (let* ((open-paren-pos (car (lexer-last-pos lexer)))
+ (reg-expr (reg-expr lexer))
+ (close-token (get-token lexer)))
+ (when (eq open-token :open-paren)
+ ;; if this is the "("")" production we have to
+ ;; increment the register counter of the lexer
+ (incf (lexer-reg lexer)))
+ (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"))
+ (if flags
+ ;; if the lexer has returned a list of flags this must
+ ;; have been the "(?:"")" production
+ (cons :group (nconc flags (list reg-expr)))
+ (list (case open-token
+ ((:open-paren)
+ :register)
+ ((:open-paren-colon)
+ :group)
+ ((:open-paren-greater)
+ :standalone)
+ ((:open-paren-equal)
+ :positive-lookahead)
+ ((:open-paren-exclamation)
+ :negative-lookahead)
+ ((:open-paren-less-equal)
+ :positive-lookbehind)
+ ((:open-paren-less-exclamation)
+ :negative-lookbehind))
+ reg-expr)))))
+ (t
+ ;; this is the production; is
+ ;; any token which passes START-OF-SUBEXPR-P (otherwise
+ ;; parsing had already stopped in the SEQ method)
+ open-token))))
+
+(defun greedy-quant (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Parses and consumes a .
+The productions are: -> |
+where is parsed by the lexer function GET-QUANTIFIER.
+Will return or (:GREEDY-REPETITION )."
+ (let* ((group (group lexer))
+ (token (get-quantifier lexer)))
+ (if token
+ ;; if GET-QUANTIFIER returned a non-NIL value it's the
+ ;; two-element list ( )
+ (list :greedy-repetition (first token) (second token) group)
+ group)))
+
+(defun quant (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Parses and consumes a .
+The productions are: -> | \"?\".
+Will return the returned by GREEDY-QUANT and optionally
+change :GREEDY-REPETITION to :NON-GREEDY-REPETITION."
+ (let* ((greedy-quant (greedy-quant lexer))
+ (pos (lexer-pos lexer))
+ (next-char (next-char lexer)))
+ (when next-char
+ (if (char= next-char #\?)
+ (setf (car greedy-quant) :non-greedy-repetition)
+ (setf (lexer-pos lexer) pos)))
+ greedy-quant))
+
+(defun seq (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Parses and consumes a .
+The productions are: -> | .
+Will return or (:SEQUENCE )."
+ (flet ((make-array-from-two-chars (char1 char2)
+ (let ((string (make-array 2
+ :element-type 'character
+ :fill-pointer t
+ :adjustable t)))
+ (setf (aref string 0) char1)
+ (setf (aref string 1) char2)
+ string)))
+ ;; Note that we're calling START-OF-SUBEXPR-P before we actually try
+ ;; to parse a or in order to catch empty regular
+ ;; expressions
+ (if (start-of-subexpr-p lexer)
+ (let ((quant (quant lexer)))
+ (if (start-of-subexpr-p lexer)
+ (let* ((seq (seq lexer))
+ (quant-is-char-p (characterp quant))
+ (seq-is-sequence-p (and (consp seq)
+ (eq (first seq) :sequence))))
+ (cond ((and quant-is-char-p
+ (characterp seq))
+ (make-array-from-two-chars seq quant))
+ ((and quant-is-char-p
+ (stringp seq))
+ (vector-push-extend quant seq)
+ seq)
+ ((and quant-is-char-p
+ seq-is-sequence-p
+ (characterp (second seq)))
+ (cond ((cddr seq)
+ (setf (cdr seq)
+ (cons
+ (make-array-from-two-chars (second seq)
+ quant)
+ (cddr seq)))
+ seq)
+ (t (make-array-from-two-chars (second seq) quant))))
+ ((and quant-is-char-p
+ seq-is-sequence-p
+ (stringp (second seq)))
+ (cond ((cddr seq)
+ (setf (cdr seq)
+ (cons
+ (progn
+ (vector-push-extend quant (second seq))
+ (second seq))
+ (cddr seq)))
+ seq)
+ (t
+ (vector-push-extend quant (second seq))
+ (second seq))))
+ (seq-is-sequence-p
+ ;; if is also a :SEQUENCE parse tree we merge
+ ;; both lists into one to avoid unnecessary consing
+ (setf (cdr seq)
+ (cons quant (cdr seq)))
+ seq)
+ (t (list :sequence quant seq))))
+ quant))
+ :void)))
+
+(defun reg-expr (lexer)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Parses and consumes a , a complete regular expression.
+The productions are: -> | \"|\".
+Will return or (:ALTERNATION )."
+ (let ((pos (lexer-pos lexer)))
+ (case (next-char lexer)
+ ((nil)
+ ;; if we didn't get any token we return :VOID which stands for
+ ;; "empty regular expression"
+ :void)
+ ((#\|)
+ ;; now check whether the expression started with a vertical
+ ;; bar, i.e. - the left alternation - is empty
+ (list :alternation :void (reg-expr lexer)))
+ (otherwise
+ ;; otherwise un-read the character we just saw and parse a
+ ;; plus the character following it
+ (setf (lexer-pos lexer) pos)
+ (let* ((seq (seq lexer))
+ (pos (lexer-pos lexer)))
+ (case (next-char lexer)
+ ((nil)
+ ;; no further character, just a
+ seq)
+ ((#\|)
+ ;; if the character was a vertical bar, this is an
+ ;; alternation and we have the second production
+ (let ((reg-expr (reg-expr lexer)))
+ (cond ((and (consp reg-expr)
+ (eq (first reg-expr) :alternation))
+ ;; again we try to merge as above in SEQ
+ (setf (cdr reg-expr)
+ (cons seq (cdr reg-expr)))
+ reg-expr)
+ (t (list :alternation seq reg-expr)))))
+ (otherwise
+ ;; a character which is not a vertical bar - this is
+ ;; either a syntax error or we're inside of a group and
+ ;; the next character is a closing parenthesis; so we
+ ;; just un-read the character and let another function
+ ;; take care of it
+ (setf (lexer-pos lexer) pos)
+ seq)))))))
+
+(defun reverse-strings (parse-tree)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (cond ((stringp parse-tree)
+ (nreverse parse-tree))
+ ((consp parse-tree)
+ (loop for parse-tree-rest on parse-tree
+ while parse-tree-rest
+ do (setf (car parse-tree-rest)
+ (reverse-strings (car parse-tree-rest))))
+ parse-tree)
+ (t parse-tree)))
+
+(defun parse-string (string)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Translate the regex string STRING into a parse tree."
+ (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"))))
\ No newline at end of file
diff --git a/practicals/libraries/cl-ppcre-1.2.3/perltest.pl b/practicals/libraries/cl-ppcre-1.2.3/perltest.pl
new file mode 100644
index 0000000..8e79287
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/perltest.pl
@@ -0,0 +1,174 @@
+#!/usr/bin/perl
+
+# This is a heavily modified version of the file 'perltest' which
+# comes with the PCRE library package, which is open source software,
+# written by Philip Hazel, and copyright by the University of
+# Cambridge, England.
+
+# The PCRE library package is available from
+#
+
+use Time::HiRes qw(time);
+
+sub string_for_lisp {
+ my(@a, $t, $in_string, $switch);
+
+ my $string = shift;
+ $string =~ s/\\/\\\\/g;
+ $string =~ s/"/\\"/g;
+
+ return "\"$string\""
+ if $string =~ /^[\n\x20-\x7f]*$/;
+
+ $in_string = 1;
+ foreach $c (split(//, $string)) {
+ if (ord $c >= 32 and ord $c < 127) {
+ if ($in_string) {
+ $t .= $c;
+ } else {
+ $in_string = 1;
+ $t = $c;
+ }
+ } else {
+ if ($in_string) {
+ push @a, "\"$t\"";
+ $in_string = 0;
+ $switch = 1;
+ }
+ push @a, ord $c;
+ }
+ }
+ if ($switch) {
+ if ($in_string) {
+ push @a, "\"$t\"";
+ }
+ '(' . (join ' ', @a) . ')';
+ } else {
+ "\"$t\"";
+ }
+}
+
+$min_time = shift;
+
+NEXT_RE: while (1) {
+ last
+ if !($_ = <>);
+ next
+ if $_ eq "";
+
+ $pattern = $_;
+
+ while ($pattern !~ /^\s*(.).*\1/s) {
+ last
+ if !($_ = <>);
+ $pattern .= $_;
+ }
+
+ chomp($pattern);
+ $pattern =~ s/\s+$//;
+ $pattern =~ s/\+(?=[a-z]*$)//;
+
+ $multi_line_mode = ($pattern =~ /m[a-z]*$/) ? 't' : 'nil';
+ $single_line_mode = ($pattern =~ /s[a-z]*$/) ? 't' : 'nil';
+ $extended_mode = ($pattern =~ /x[a-z]*$/) ? 't' : 'nil';
+ $case_insensitive_mode = ($pattern =~ /i[a-z]*$/) ? 't' : 'nil';
+ $pattern =~ s/^(.*)g([a-z]*)$/\1\2/;
+
+ $pattern_for_lisp = $pattern;
+ $pattern_for_lisp =~ s/[a-z]*$//;
+ $pattern_for_lisp =~ s/^\s*(.)(.*)\1/$2/s;
+ $pattern_for_lisp =~ s/\\/\\\\/g;
+ $pattern_for_lisp =~ s/"/\\"/g;
+
+ $pattern = "/(?#)/$2"
+ if ($pattern =~ /^(.)\1(.*)$/);
+
+ while (1) {
+ last NEXT_RE
+ if !($_ = <>);
+
+ chomp;
+
+ s/\s+$//;
+ s/^\s+//;
+
+ last
+ if ($_ eq "");
+
+ $info_string = string_for_lisp "\"$_\" =~ $pattern";
+ $x = eval "\"$_\"";
+
+ @subs = ();
+
+ eval <<"END";
+if (\$x =~ ${pattern}) {
+ push \@subs,\$&;
+ push \@subs,\$1;
+ push \@subs,\$2;
+ push \@subs,\$3;
+ push \@subs,\$4;
+ push \@subs,\$5;
+ push \@subs,\$6;
+ push \@subs,\$7;
+ push \@subs,\$8;
+ push \@subs,\$9;
+ push \@subs,\$10;
+ push \@subs,\$11;
+ push \@subs,\$12;
+ push \@subs,\$13;
+ push \@subs,\$14;
+ push \@subs,\$15;
+ push \@subs,\$16;
+}
+
+\$test = sub {
+ my \$times = shift;
+
+ my \$start = time;
+ for (my \$i = 0; \$i < \$times; \$i++) {
+ \$x =~ ${pattern};
+ }
+ return time - \$start;
+};
+END
+
+ $times = 1;
+ $used = 0;
+ $counter++;
+ print STDERR "$counter\n";
+
+ if ($@) {
+ $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 ";
+ if (!@subs) {
+ print 'nil nil';
+ } else {
+ print string_for_lisp($subs[0]) . ' (';
+ undef $not_first;
+ for ($i = 1; $i <= 16; $i++) {
+ print ' '
+ unless $i == 1;
+ if (defined $subs[$i]) {
+ print string_for_lisp $subs[$i];
+ } else {
+ print 'nil';
+ }
+ }
+ print ')';
+ }
+ print ")\n";
+ }
+}
diff --git a/practicals/libraries/cl-ppcre-1.2.3/ppcre-tests.lisp b/practicals/libraries/cl-ppcre-1.2.3/ppcre-tests.lisp
new file mode 100644
index 0000000..b419914
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/ppcre-tests.lisp
@@ -0,0 +1,284 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/ppcre-tests.lisp,v 1.26 2004/09/30 09:58:42 edi Exp $
+
+;;; Copyright (c) 2002-2004, 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))
+ #+:lispworks (hcl:mark-and-sweep 3)
+ #+: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 (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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 (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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 (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (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)
+ :external-format
+ #+(or :allegro :clisp :scl)
+ (if file-name-provided-p
+ :default
+ #+:allegro :iso-8859-1
+ #+:clisp charset:iso-8859-1
+ #+:scl :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 full
+ ;; Unicode support
+ 255)
+ 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/practicals/libraries/cl-ppcre-1.2.3/regex-class.lisp b/practicals/libraries/cl-ppcre-1.2.3/regex-class.lisp
new file mode 100644
index 0000000..247f4fd
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/regex-class.lisp
@@ -0,0 +1,809 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class.lisp,v 1.21 2005/02/02 17:47:38 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
+
+;;; Copyright (c) 2002-2004, 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)
+
+;; 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 (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (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 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 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.
+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."))
+
+ (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*."))
+ (:documentation "REGISTER objects represent register groups."))
+
+ (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
+reference refers to.")
+ (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)
+ ((hash :initarg :hash
+ :reader hash
+ :type (or hash-table null)
+ :documentation "A hash table the keys of which are the
+characters; the values are always T.")
+ (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."))
+
+ (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
+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
+STR which starts END-STRING (a slot of MATCHER)."))
+ (: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,
+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 \"$\"."))
+
+ (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
+\"everything\", i.e. dots."))
+
+ (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."))
+
+ (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
+test succeeds.")
+ (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
+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
+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 (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Make large hash tables smaller, if possible."
+ (let ((hash (getf init-args :hash)))
+ (when (and hash
+ (> *regex-char-code-limit* 256)
+ (> (hash-table-count hash)
+ (/ *regex-char-code-limit* 2)))
+ (setf (slot-value char-class 'hash)
+ (merge-inverted-hash (make-hash-table)
+ hash)
+ (slot-value char-class 'invertedp)
+ (not (slot-value char-class 'invertedp))))))
+
+(declaim (ftype (function (t) simple-string) str))
+
+;;; The following four methods allow a VOID object to behave like a
+;;; zero-length STR object (only readers needed)
+
+(defmethod initialize-instance :after ((str str) &rest init-args)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (declare (ignore init-args))
+ "Automatically computes the length of a STR after initialization."
+ (let ((str-slot (slot-value str 'str)))
+ (unless (typep str-slot 'simple-string)
+ (setf (slot-value str 'str) (coerce str-slot 'simple-string))))
+ (setf (len str) (length (str str))))
+
+(defmethod len ((void void))
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ 0)
+
+(defmethod str ((void void))
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "")
+
+(defmethod skip ((void void))
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ nil)
+
+(defmethod start-of-end-string-p ((void void))
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ nil)
+
+(defgeneric case-mode (regex old-case-mode)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (: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)
+ (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 (ignore old-case-mode))
+ nil)
+
+(defgeneric copy-regex (regex)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Implements a deep copy of a REGEX object."))
+
+(defmethod copy-regex ((anchor anchor))
+ (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))
+ (make-instance 'everything
+ :single-line-p (single-line-p everything)))
+
+(defmethod copy-regex ((word-boundary word-boundary))
+ (make-instance 'word-boundary
+ :negatedp (negatedp word-boundary)))
+
+(defmethod copy-regex ((void void))
+ (make-instance 'void))
+
+(defmethod copy-regex ((lookahead lookahead))
+ (make-instance 'lookahead
+ :regex (copy-regex (regex lookahead))
+ :positivep (positivep lookahead)))
+
+(defmethod copy-regex ((seq seq))
+ (make-instance 'seq
+ :elements (mapcar #'copy-regex (elements seq))))
+
+(defmethod copy-regex ((alternation alternation))
+ (make-instance 'alternation
+ :choices (mapcar #'copy-regex (choices alternation))))
+
+(defmethod copy-regex ((branch branch))
+ (with-slots ((test 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))
+ (make-instance 'lookbehind
+ :regex (copy-regex (regex lookbehind))
+ :positivep (positivep lookbehind)
+ :len (len lookbehind)))
+
+(defmethod copy-regex ((repetition repetition))
+ (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))
+ (make-instance 'register
+ :regex (copy-regex (regex register))
+ :num (num register)))
+
+(defmethod copy-regex ((standalone standalone))
+ (make-instance 'standalone
+ :regex (copy-regex (regex standalone))))
+
+(defmethod copy-regex ((back-reference back-reference))
+ (make-instance 'back-reference
+ :num (num back-reference)
+ :case-insensitive-p (case-insensitive-p back-reference)))
+
+(defmethod copy-regex ((char-class char-class))
+ (make-instance 'char-class
+ :hash (hash 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))
+ (make-instance 'str
+ :str (str str)
+ :case-insensitive-p (case-insensitive-p str)))
+
+(defmethod copy-regex ((filter filter))
+ (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 (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (: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 (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))
+ (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))
+ (make-instance 'standalone
+ :regex (remove-registers (regex standalone))))
+
+(defmethod remove-registers ((lookahead lookahead))
+ (make-instance 'lookahead
+ :regex (remove-registers (regex lookahead))
+ :positivep (positivep lookahead)))
+
+(defmethod remove-registers ((lookbehind lookbehind))
+ (make-instance 'lookbehind
+ :regex (remove-registers (regex lookbehind))
+ :positivep (positivep lookbehind)
+ :len (len lookbehind)))
+
+(defmethod remove-registers ((branch branch))
+ (with-slots ((test 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 (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))
+ (copy-regex regex))
+
+(defmethod remove-registers ((seq seq))
+ (make-instance 'seq
+ :elements (mapcar #'remove-registers (elements seq))))
+
+(defgeneric everythingp (regex)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (: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))
+ ;; 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))
+ (with-slots ((choices 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))
+ (with-slots ((maximum maximum)
+ (minimum minimum)
+ (regex regex))
+ repetition
+ (and maximum
+ (= 1 minimum maximum)
+ ;; treat "{1,1}" like ""
+ (everythingp regex))))
+
+(defmethod everythingp ((register register))
+ (everythingp (regex register)))
+
+(defmethod everythingp ((standalone standalone))
+ (everythingp (regex standalone)))
+
+(defmethod everythingp ((everything everything))
+ everything)
+
+(defmethod everythingp ((regex regex))
+ ;; the general case for ANCHOR, BACK-REFERENCE, BRANCH, CHAR-CLASS,
+ ;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY
+ nil)
+
+(defgeneric regex-length (regex)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Return the length of REGEX if it is fixed, NIL otherwise."))
+
+(defmethod regex-length ((seq seq))
+ ;; 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))
+ ;; 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))
+ ;; 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))
+ ;; 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 len)
+ (minimum minimum)
+ (maximum maximum))
+ repetition
+ (if (and len
+ (eq minimum maximum))
+ (* minimum len)
+ nil)))
+
+(defmethod regex-length ((register register))
+ (regex-length (regex register)))
+
+(defmethod regex-length ((standalone standalone))
+ (regex-length (regex standalone)))
+
+(defmethod regex-length ((back-reference back-reference))
+ ;; 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))
+ 1)
+
+(defmethod regex-length ((everything everything))
+ 1)
+
+(defmethod regex-length ((str str))
+ (len str))
+
+(defmethod regex-length ((filter filter))
+ (len filter))
+
+(defmethod regex-length ((regex regex))
+ ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and
+ ;; WORD-BOUNDARY (which all have zero-length)
+ 0)
+
+(defgeneric regex-min-length (regex)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (:documentation "Returns the minimal length of REGEX."))
+
+(defmethod regex-min-length ((seq seq))
+ ;; 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))
+ ;; 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))
+ ;; minimal length of both alternations
+ (min (regex-min-length (then-regex branch))
+ (regex-min-length (else-regex branch))))
+
+(defmethod regex-min-length ((repetition repetition))
+ ;; 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))
+ (regex-min-length (regex register)))
+
+(defmethod regex-min-length ((standalone standalone))
+ (regex-min-length (regex standalone)))
+
+(defmethod regex-min-length ((char-class char-class))
+ 1)
+
+(defmethod regex-min-length ((everything everything))
+ 1)
+
+(defmethod regex-min-length ((str str))
+ (len str))
+
+(defmethod regex-min-length ((filter filter))
+ (or (len filter)
+ 0))
+
+(defmethod regex-min-length ((regex regex))
+ ;; the general case for ANCHOR, BACK-REFERENCE, LOOKAHEAD,
+ ;; LOOKBEHIND, VOID, and WORD-BOUNDARY
+ 0)
+
+(defgeneric compute-offsets (regex start-pos)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (: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)
+ (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)
+ (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)
+ ;; 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)
+ ;; no need to descend into the inner regex
+ (with-slots ((len len)
+ (minimum minimum)
+ (maximum 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)
+ (compute-offsets (regex register) start-pos))
+
+(defmethod compute-offsets ((standalone standalone) start-pos)
+ (compute-offsets (regex standalone) start-pos))
+
+(defmethod compute-offsets ((char-class char-class) start-pos)
+ (1+ start-pos))
+
+(defmethod compute-offsets ((everything everything) start-pos)
+ (1+ start-pos))
+
+(defmethod compute-offsets ((str str) start-pos)
+ (setf (offset str) start-pos)
+ (+ start-pos (len str)))
+
+(defmethod compute-offsets ((back-reference back-reference) start-pos)
+ ;; 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)
+ (let ((len (len filter)))
+ (if len
+ (+ start-pos len)
+ nil)))
+
+(defmethod compute-offsets ((regex regex) start-pos)
+ ;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and
+ ;; WORD-BOUNDARY (which all have zero-length)
+ start-pos)
diff --git a/practicals/libraries/cl-ppcre-1.2.3/repetition-closures.lisp b/practicals/libraries/cl-ppcre-1.2.3/repetition-closures.lisp
new file mode 100644
index 0000000..f0a8667
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/repetition-closures.lisp
@@ -0,0 +1,868 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/repetition-closures.lisp,v 1.20 2004/04/20 11:37:36 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
+;;; REPETITIONs here. Note that this part of the code contains some
+;;; rather crazy micro-optimizations which were introduced to be as
+;;; competitive with Perl as possible in tight loops.
+
+;;; Copyright (c) 2002-2004, 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)
+
+(defmacro incf-after (place &optional (delta 1) &environment env)
+ "Utility macro inspired by C's \"place++\", i.e. first return the
+value of PLACE and afterwards increment it by DELTA."
+ (with-unique-names (%temp)
+ (multiple-value-bind (vars vals store-vars writer-form reader-form)
+ (get-setf-expansion place env)
+ `(let* (,@(mapcar #'list vars vals)
+ (,%temp ,reader-form)
+ (,(car store-vars) (+ ,%temp ,delta)))
+ ,writer-form
+ ,%temp))))
+
+;; code for greedy repetitions with minimum zero
+
+(defmacro greedy-constant-length-closure (check-curr-pos)
+ "This is the template for simple 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).
+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))
+ ;; 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 (1+ (- *end-pos* len min-rest))
+ ;; don't go further than MAXIMUM
+ ;; repetitions, of course
+ (+ start-pos
+ (the fixnum (* len maximum)))))
+ (curr-pos start-pos))
+ (declare (type 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
+ ;; version (at least in CMUCL)
+ (tagbody
+ forward-loop
+ ;; first go forward as far as possible, i.e. while
+ ;; the inner regex matches
+ (when (>= curr-pos target-end-pos)
+ (go backward-loop))
+ (when ,check-curr-pos
+ (incf curr-pos len)
+ (go forward-loop))
+ backward-loop
+ ;; now go back LEN steps each until we're able to match
+ ;; the rest of the regex
+ (when (< curr-pos start-pos)
+ (return-from greedy-constant-length-matcher nil))
+ (let ((result (funcall next-fn curr-pos)))
+ (when result
+ (return-from greedy-constant-length-matcher result)))
+ (decf curr-pos len)
+ (go backward-loop)))))
+ ;; 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))
+ (let ((target-end-pos (1+ (- *end-pos* len min-rest)))
+ (curr-pos start-pos))
+ (declare (type fixnum target-end-pos curr-pos))
+ (block greedy-constant-length-matcher
+ (tagbody
+ forward-loop
+ (when (>= curr-pos target-end-pos)
+ (go backward-loop))
+ (when ,check-curr-pos
+ (incf curr-pos len)
+ (go forward-loop))
+ backward-loop
+ (when (< curr-pos start-pos)
+ (return-from greedy-constant-length-matcher nil))
+ (let ((result (funcall next-fn curr-pos)))
+ (when result
+ (return-from greedy-constant-length-matcher result)))
+ (decf curr-pos len)
+ (go backward-loop)))))))
+
+(defun create-greedy-everything-matcher (maximum min-rest next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (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."
+ (if maximum
+ (lambda (start-pos)
+ (declare (type 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))
+ ;; 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
+ thereis (funcall next-fn 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))
+ (let ((target-end-pos (- *end-pos* min-rest)))
+ (declare (type fixnum target-end-pos))
+ (loop for curr-pos of-type fixnum from target-end-pos downto start-pos
+ thereis (funcall next-fn curr-pos))))))
+
+(defmethod create-greedy-constant-length-matcher ((repetition repetition)
+ next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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."
+ (let ((len (len repetition))
+ (maximum (maximum repetition))
+ (regex (regex repetition))
+ (min-rest (min-rest repetition)))
+ (declare (type fixnum len min-rest)
+ (type function next-fn))
+ (cond ((zerop len)
+ ;; inner regex has zero-length, so we can discard it
+ ;; completely
+ next-fn)
+ (t
+ ;; now first try to optimize for a couple of common cases
+ (typecase regex
+ (str
+ (let ((str (str regex)))
+ (if (= 1 len)
+ ;; a single character
+ (let ((chr (schar str 0)))
+ (if (case-insensitive-p regex)
+ (greedy-constant-length-closure
+ (char-equal chr (schar *string* curr-pos)))
+ (greedy-constant-length-closure
+ (char= chr (schar *string* curr-pos)))))
+ ;; a string
+ (if (case-insensitive-p regex)
+ (greedy-constant-length-closure
+ (*string*-equal str curr-pos (+ curr-pos len) 0 len))
+ (greedy-constant-length-closure
+ (*string*= str curr-pos (+ curr-pos len) 0 len))))))
+ (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)))))
+ (everything
+ ;; an EVERYTHING object, i.e. a dot
+ (if (single-line-p regex)
+ (create-greedy-everything-matcher maximum min-rest next-fn)
+ (greedy-constant-length-closure
+ (char/= #\Newline (schar *string* curr-pos)))))
+ (t
+ ;; 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))
+ (greedy-constant-length-closure
+ (funcall inner-matcher curr-pos)))))))))
+
+(defmethod create-greedy-no-zero-matcher ((repetition repetition) next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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)."
+ (let ((maximum (maximum repetition))
+ ;; 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))
+ (cond
+ ((eql maximum 1)
+ ;; this is essentially like the next case but with a known
+ ;; MAXIMUM of 1 we can get away without a counter; note that
+ ;; we always arrive here if CONVERT optimizes * to
+ ;; (?:*)?
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) next-fn))
+ (lambda (start-pos)
+ (declare (type function repeat-matcher))
+ (or (funcall repeat-matcher start-pos)
+ (funcall next-fn start-pos))))
+ (maximum
+ ;; we make a reservation for our slot in *REPEAT-COUNTERS*
+ ;; because we need to keep track whether we've reached MAXIMUM
+ ;; 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))
+ ;; 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
+ (or (and (< (aref *repeat-counters* rep-num) maximum)
+ (incf (aref *repeat-counters* rep-num))
+ ;; note that REPEAT-MATCHER will call
+ ;; GREEDY-AUX again recursively
+ (prog1
+ (funcall repeat-matcher start-pos)
+ (decf (aref *repeat-counters* rep-num))))
+ (funcall next-fn start-pos))))
+ ;; create a closure to match the inner regex and to
+ ;; implement backtracking via GREEDY-AUX
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'greedy-aux))
+ ;; 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))
+ (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))
+ (or (funcall repeat-matcher start-pos)
+ (funcall next-fn start-pos))))
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'greedy-aux))
+ #'greedy-aux)))))
+
+(defmethod create-greedy-matcher ((repetition repetition) next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Creates a closure which tries to match REPETITION. It is assumed
+that REPETITION is greedy and the minimal number of repetitions is
+zero."
+ (let ((maximum (maximum repetition))
+ ;; we make a reservation for our slot in *LAST-POS-STORES* because
+ ;; we have to watch out for endless loops as the inner regex might
+ ;; match zero-length strings
+ (zero-length-num (incf-after *zero-length-num*))
+ ;; 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))
+ (cond
+ (maximum
+ ;; we make a reservation for our slot in *REPEAT-COUNTERS*
+ ;; because we need to keep track whether we've reached MAXIMUM
+ ;; repetitions
+ (let ((rep-num (incf-after *rep-num*)))
+ (flet ((greedy-aux (start-pos)
+ ;; 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))
+ (let ((old-last-pos
+ (svref *last-pos-stores* zero-length-num)))
+ (when (and old-last-pos
+ (= (the fixnum old-last-pos) start-pos))
+ ;; stop immediately if we've been here before,
+ ;; i.e. if the last attempt matched a zero-length
+ ;; string
+ (return-from greedy-aux (funcall next-fn start-pos)))
+ ;; otherwise remember this position for the next
+ ;; repetition
+ (setf (svref *last-pos-stores* zero-length-num) start-pos)
+ (or (and (< (aref *repeat-counters* rep-num) maximum)
+ (incf (aref *repeat-counters* rep-num))
+ ;; note that REPEAT-MATCHER will call
+ ;; GREEDY-AUX again recursively
+ (prog1
+ (funcall repeat-matcher start-pos)
+ (decf (aref *repeat-counters* rep-num))
+ (setf (svref *last-pos-stores* zero-length-num)
+ old-last-pos)))
+ (funcall next-fn start-pos)))))
+ ;; create a closure to match the inner regex and to
+ ;; implement backtracking via GREEDY-AUX
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'greedy-aux))
+ ;; the closure we return is just a thin wrapper around
+ ;; GREEDY-AUX to initialize the repetition counter and our
+ ;; slot in *LAST-POS-STORES*
+ (lambda (start-pos)
+ (declare (type fixnum start-pos))
+ (setf (aref *repeat-counters* rep-num) 0
+ (svref *last-pos-stores* zero-length-num) nil)
+ (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))
+ (let ((old-last-pos
+ (svref *last-pos-stores* zero-length-num)))
+ (when (and old-last-pos
+ (= (the fixnum old-last-pos) start-pos))
+ (return-from greedy-aux (funcall next-fn start-pos)))
+ (setf (svref *last-pos-stores* zero-length-num) start-pos)
+ (or (prog1
+ (funcall repeat-matcher start-pos)
+ (setf (svref *last-pos-stores* zero-length-num) old-last-pos))
+ (funcall next-fn start-pos)))))
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'greedy-aux))
+ (lambda (start-pos)
+ (declare (type 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
+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).
+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))
+ ;; 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 (1+ (- *end-pos* len min-rest))
+ (+ start-pos
+ (the fixnum (* len maximum))))))
+ ;; move forward by LEN and always try NEXT-FN first, then
+ ;; CHECK-CUR-POS
+ (loop for curr-pos of-type fixnum from start-pos
+ below target-end-pos
+ by len
+ thereis (funcall next-fn curr-pos)
+ while ,check-curr-pos
+ finally (return (funcall next-fn 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))
+ (let ((target-end-pos (1+ (- *end-pos* len min-rest))))
+ (loop for curr-pos of-type fixnum from start-pos
+ below target-end-pos
+ by len
+ thereis (funcall next-fn curr-pos)
+ while ,check-curr-pos
+ finally (return (funcall next-fn curr-pos)))))))
+
+(defmethod create-non-greedy-constant-length-matcher ((repetition repetition) next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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."
+ (let ((len (len repetition))
+ (maximum (maximum repetition))
+ (regex (regex repetition))
+ (min-rest (min-rest repetition)))
+ (declare (type fixnum len min-rest)
+ (type function next-fn))
+ (cond ((zerop len)
+ ;; inner regex has zero-length, so we can discard it
+ ;; completely
+ next-fn)
+ (t
+ ;; now first try to optimize for a couple of common cases
+ (typecase regex
+ (str
+ (let ((str (str regex)))
+ (if (= 1 len)
+ ;; a single character
+ (let ((chr (schar str 0)))
+ (if (case-insensitive-p regex)
+ (non-greedy-constant-length-closure
+ (char-equal chr (schar *string* curr-pos)))
+ (non-greedy-constant-length-closure
+ (char= chr (schar *string* curr-pos)))))
+ ;; a string
+ (if (case-insensitive-p regex)
+ (non-greedy-constant-length-closure
+ (*string*-equal str curr-pos (+ curr-pos len) 0 len))
+ (non-greedy-constant-length-closure
+ (*string*= str curr-pos (+ curr-pos len) 0 len))))))
+ (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)))))
+ (everything
+ (if (single-line-p regex)
+ ;; a dot which really can match everything; we rely
+ ;; on the compiler to optimize this away
+ (non-greedy-constant-length-closure
+ t)
+ ;; a dot which has to watch out for #\Newline
+ (non-greedy-constant-length-closure
+ (char/= #\Newline (schar *string* curr-pos)))))
+ (t
+ ;; 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))
+ (non-greedy-constant-length-closure
+ (funcall inner-matcher curr-pos)))))))))
+
+(defmethod create-non-greedy-no-zero-matcher ((repetition repetition) next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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)."
+ (let ((maximum (maximum repetition))
+ ;; 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))
+ (cond
+ ((eql maximum 1)
+ ;; this is essentially like the next case but with a known
+ ;; MAXIMUM of 1 we can get away without a counter
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) next-fn))
+ (lambda (start-pos)
+ (declare (type function repeat-matcher))
+ (or (funcall next-fn start-pos)
+ (funcall repeat-matcher start-pos))))
+ (maximum
+ ;; we make a reservation for our slot in *REPEAT-COUNTERS*
+ ;; because we need to keep track whether we've reached MAXIMUM
+ ;; repetitions
+ (let ((rep-num (incf-after *rep-num*)))
+ (flet ((non-greedy-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 maximum rep-num)
+ (type function repeat-matcher))
+ (or (funcall next-fn start-pos)
+ (and (< (aref *repeat-counters* rep-num) maximum)
+ (incf (aref *repeat-counters* rep-num))
+ ;; note that REPEAT-MATCHER will call
+ ;; NON-GREEDY-AUX again recursively
+ (prog1
+ (funcall repeat-matcher start-pos)
+ (decf (aref *repeat-counters* rep-num)))))))
+ ;; create a closure to match the inner regex and to
+ ;; implement backtracking via NON-GREEDY-AUX
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'non-greedy-aux))
+ ;; 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))
+ (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))
+ (or (funcall next-fn start-pos)
+ (funcall repeat-matcher start-pos))))
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'non-greedy-aux))
+ #'non-greedy-aux)))))
+
+(defmethod create-non-greedy-matcher ((repetition repetition) next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Creates a closure which tries to match REPETITION. It is assumed
+that REPETITION is non-greedy and the minimal number of repetitions is
+zero."
+ ;; we make a reservation for our slot in *LAST-POS-STORES* because
+ ;; we have to watch out for endless loops as the inner regex might
+ ;; match zero-length strings
+ (let ((zero-length-num (incf-after *zero-length-num*))
+ (maximum (maximum repetition))
+ ;; 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))
+ (cond
+ (maximum
+ ;; we make a reservation for our slot in *REPEAT-COUNTERS*
+ ;; because we need to keep track whether we've reached MAXIMUM
+ ;; repetitions
+ (let ((rep-num (incf-after *rep-num*)))
+ (flet ((non-greedy-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 maximum rep-num)
+ (type function repeat-matcher))
+ (let ((old-last-pos
+ (svref *last-pos-stores* zero-length-num)))
+ (when (and old-last-pos
+ (= (the fixnum old-last-pos) start-pos))
+ ;; stop immediately if we've been here before,
+ ;; i.e. if the last attempt matched a zero-length
+ ;; string
+ (return-from non-greedy-aux (funcall next-fn start-pos)))
+ ;; otherwise remember this position for the next
+ ;; repetition
+ (setf (svref *last-pos-stores* zero-length-num) start-pos)
+ (or (funcall next-fn start-pos)
+ (and (< (aref *repeat-counters* rep-num) maximum)
+ (incf (aref *repeat-counters* rep-num))
+ ;; note that REPEAT-MATCHER will call
+ ;; NON-GREEDY-AUX again recursively
+ (prog1
+ (funcall repeat-matcher start-pos)
+ (decf (aref *repeat-counters* rep-num))
+ (setf (svref *last-pos-stores* zero-length-num)
+ old-last-pos)))))))
+ ;; create a closure to match the inner regex and to
+ ;; implement backtracking via NON-GREEDY-AUX
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'non-greedy-aux))
+ ;; the closure we return is just a thin wrapper around
+ ;; NON-GREEDY-AUX to initialize the repetition counter and our
+ ;; slot in *LAST-POS-STORES*
+ (lambda (start-pos)
+ (declare (type fixnum start-pos))
+ (setf (aref *repeat-counters* rep-num) 0
+ (svref *last-pos-stores* zero-length-num) nil)
+ (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))
+ (let ((old-last-pos
+ (svref *last-pos-stores* zero-length-num)))
+ (when (and old-last-pos
+ (= (the fixnum old-last-pos) start-pos))
+ (return-from non-greedy-aux (funcall next-fn start-pos)))
+ (setf (svref *last-pos-stores* zero-length-num) start-pos)
+ (or (funcall next-fn start-pos)
+ (prog1
+ (funcall repeat-matcher start-pos)
+ (setf (svref *last-pos-stores* zero-length-num)
+ old-last-pos))))))
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'non-greedy-aux))
+ (lambda (start-pos)
+ (declare (type fixnum start-pos))
+ (setf (svref *last-pos-stores* zero-length-num) nil)
+ (non-greedy-aux start-pos)))))))
+
+;; code for constant repetitions, i.e. those with a fixed number of repetitions
+
+(defmacro constant-repetition-constant-length-closure (check-curr-pos)
+ "This is the template for simple constant repetitions (where simple
+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."
+ `(lambda (start-pos)
+ (declare (type fixnum start-pos))
+ (let ((target-end-pos (+ start-pos
+ (the fixnum (* len repetitions)))))
+ (declare (type 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
+ (loop for curr-pos of-type fixnum from start-pos
+ below target-end-pos
+ by len
+ always ,check-curr-pos)
+ ;; finally call NEXT-FN if we made it that far
+ (funcall next-fn target-end-pos)))))
+
+(defmethod create-constant-repetition-constant-length-matcher
+ ((repetition repetition) next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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."
+ (let ((len (len repetition))
+ (repetitions (minimum repetition))
+ (regex (regex repetition)))
+ (declare (type fixnum len repetitions)
+ (type function next-fn))
+ (if (zerop len)
+ ;; if the length is zero it suffices to try once
+ (create-matcher-aux regex next-fn)
+ ;; otherwise try to optimize for a couple of common cases
+ (typecase regex
+ (str
+ (let ((str (str regex)))
+ (if (= 1 len)
+ ;; a single character
+ (let ((chr (schar str 0)))
+ (if (case-insensitive-p regex)
+ (constant-repetition-constant-length-closure
+ (and (char-equal chr (schar *string* curr-pos))
+ (1+ curr-pos)))
+ (constant-repetition-constant-length-closure
+ (and (char= chr (schar *string* curr-pos))
+ (1+ curr-pos)))))
+ ;; a string
+ (if (case-insensitive-p regex)
+ (constant-repetition-constant-length-closure
+ (let ((next-pos (+ curr-pos len)))
+ (declare (type 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))
+ (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))))))
+ (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))
+ (let ((next-pos (+ start-pos repetitions)))
+ (declare (type 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
+ ;; don't match #\Newline
+ (constant-repetition-constant-length-closure
+ (and (char/= #\Newline (schar *string* curr-pos))
+ (1+ curr-pos)))))
+ (t
+ ;; 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))
+ (constant-repetition-constant-length-closure
+ (funcall inner-matcher curr-pos))))))))
+
+(defmethod create-constant-repetition-matcher ((repetition repetition) next-fn)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Creates a closure which tries to match REPETITION. It is assumed
+that REPETITION has a constant number of repetitions."
+ (let ((repetitions (minimum repetition))
+ ;; we make a reservation for our slot in *REPEAT-COUNTERS*
+ ;; because we need to keep track of the number of repetitions
+ (rep-num (incf-after *rep-num*))
+ ;; 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))
+ (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))
+ (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))
+ (let ((old-last-pos
+ (svref *last-pos-stores* zero-length-num)))
+ (when (and old-last-pos
+ (= (the fixnum old-last-pos) start-pos))
+ ;; if we've been here before we matched a
+ ;; zero-length string the last time, so we can
+ ;; just carry on because we will definitely be
+ ;; able to do this again often enough
+ (return-from constant-aux (funcall next-fn start-pos)))
+ ;; otherwise remember this position for the next
+ ;; repetition
+ (setf (svref *last-pos-stores* zero-length-num) start-pos)
+ (cond ((< (aref *repeat-counters* rep-num) repetitions)
+ ;; not enough repetitions yet, try it again
+ (incf (aref *repeat-counters* rep-num))
+ ;; note that REPEAT-MATCHER will call
+ ;; CONSTANT-AUX again recursively
+ (prog1
+ (funcall repeat-matcher start-pos)
+ (decf (aref *repeat-counters* rep-num))
+ (setf (svref *last-pos-stores* zero-length-num)
+ old-last-pos)))
+ (t
+ ;; we're done - call NEXT-FN
+ (funcall next-fn start-pos))))))
+ ;; create a closure to match the inner regex and to
+ ;; implement backtracking via CONSTANT-AUX
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'constant-aux))
+ ;; 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))
+ (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))
+ (cond ((< (aref *repeat-counters* rep-num) repetitions)
+ (incf (aref *repeat-counters* rep-num))
+ (prog1
+ (funcall repeat-matcher start-pos)
+ (decf (aref *repeat-counters* rep-num))))
+ (t (funcall next-fn start-pos)))))
+ (setq repeat-matcher
+ (create-matcher-aux (regex repetition) #'constant-aux))
+ (lambda (start-pos)
+ (declare (type fixnum start-pos))
+ (setf (aref *repeat-counters* rep-num) 0)
+ (constant-aux start-pos))))))
+
+;; the actual CREATE-MATCHER-AUX method for REPETITION objects which
+;; utilizes all the functions and macros defined above
+
+(defmethod create-matcher-aux ((repetition repetition) next-fn)
+ (with-slots ((minimum minimum)
+ (maximum maximum)
+ (len len)
+ (min-len min-len)
+ (greedyp greedyp)
+ (contains-register-p contains-register-p))
+ repetition
+ (cond ((and maximum
+ (zerop maximum))
+ ;; this should have been optimized away by CONVERT but just
+ ;; in case...
+ (error "Got REPETITION with MAXIMUM 0 \(should not happen)"))
+ ((and maximum
+ (= minimum maximum 1))
+ ;; this should have been optimized away by CONVERT but just
+ ;; in case...
+ (error "Got REPETITION with MAXIMUM 1 and MINIMUM 1 \(should not happen)"))
+ ((and (eql minimum maximum)
+ len
+ (not contains-register-p))
+ (create-constant-repetition-constant-length-matcher repetition next-fn))
+ ((eql minimum maximum)
+ (create-constant-repetition-matcher repetition next-fn))
+ ((and greedyp
+ len
+ (not contains-register-p))
+ (create-greedy-constant-length-matcher repetition next-fn))
+ ((and greedyp
+ (or (plusp min-len)
+ (eql maximum 1)))
+ (create-greedy-no-zero-matcher repetition next-fn))
+ (greedyp
+ (create-greedy-matcher repetition next-fn))
+ ((and len
+ (plusp len)
+ (not contains-register-p))
+ (create-non-greedy-constant-length-matcher repetition next-fn))
+ ((or (plusp min-len)
+ (eql maximum 1))
+ (create-non-greedy-no-zero-matcher repetition next-fn))
+ (t
+ (create-non-greedy-matcher repetition next-fn)))))
diff --git a/practicals/libraries/cl-ppcre-1.2.3/scanner.lisp b/practicals/libraries/cl-ppcre-1.2.3/scanner.lisp
new file mode 100644
index 0000000..9df5d21
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/scanner.lisp
@@ -0,0 +1,526 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/scanner.lisp,v 1.22 2004/12/09 09:23:37 edi Exp $
+
+;;; Here the scanner for the actual regex as well as utility scanners
+;;; for the constant start and end strings are created.
+
+;;; Copyright (c) 2002-2004, 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)
+
+(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))
+ (if (or (minusp start-pos)
+ (> (the fixnum (+ start-pos m)) *end-pos*))
+ nil
+ (loop named bmh-matcher
+ for k of-type fixnum = (+ start-pos m -1)
+ then (+ k (max 1 (aref skip (char-code (schar *string* k)))))
+ while (< k *end-pos*)
+ do (loop for j of-type fixnum downfrom (1- m)
+ for i of-type fixnum downfrom k
+ while (and (>= j 0)
+ (,char-compare (schar *string* i)
+ (schar pattern j)))
+ finally (if (minusp j)
+ (return-from bmh-matcher (1+ i)))))))))
+
+(defun create-bmh-matcher (pattern case-insensitive-p)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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
+variable *USE-BMH-MATCHERS* is NIL, use the standard SEARCH function
+instead. (BMH matchers are faster but need much more space.)"
+ ;; 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))
+ (and (not (minusp start-pos))
+ (search pattern
+ *string*
+ :start2 start-pos
+ :end2 *end-pos*
+ :test test))))))
+ (let* ((m (length pattern))
+ (skip (make-array *regex-char-code-limit*
+ :element-type 'fixnum
+ :initial-element m)))
+ (declare (type 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)
+ (aref skip (char-code (char-downcase (schar pattern k)))) (- m k 1))
+ else
+ do (setf (aref skip (char-code (schar pattern k))) (- m k 1)))
+ (if case-insensitive-p
+ (bmh-matcher-aux :case-insensitive-p t)
+ (bmh-matcher-aux))))
+
+(defmacro char-searcher-aux (&key case-insensitive-p)
+ "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))
+ (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 (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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
+case-insensitive or not."
+ (if case-insensitive-p
+ (char-searcher-aux :case-insensitive-p t)
+ (char-searcher-aux)))
+
+(declaim (inline newline-skipper))
+
+(defun newline-skipper (start-pos)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (declare (type fixnum start-pos))
+ "Find the next occurence of a character in *STRING* which is behind
+a #\Newline."
+ ;; 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
+ (loop for i of-type fixnum from (1- start-pos) below *end-pos*
+ thereis (and (char= (schar *string* i)
+ #\Newline)
+ (1+ i))))
+
+(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."
+ (subst
+ advance-fn '(advance-fn-definition)
+ '(lambda (string start end)
+ (block scan
+ ;; initialize a couple of special variables used by the
+ ;; matchers (see file specials.lisp)
+ (let* ((*string* string)
+ (*start-pos* start)
+ (*end-pos* end)
+ ;; we will search forward for END-STRING if this value
+ ;; isn't at least as big as POS (see ADVANCE-FN), so it
+ ;; is safe to start to the left of *START-POS*; note
+ ;; that this value will _never_ be decremented - this
+ ;; is crucial to the scanning process
+ (*end-string-pos* (1- *start-pos*))
+ ;; the next five will shadow the variables defined by
+ ;; DEFPARAMETER; at this point, we don't know if we'll
+ ;; actually use them, though
+ (*repeat-counters* *repeat-counters*)
+ (*last-pos-stores* *last-pos-stores*)
+ (*reg-starts* *reg-starts*)
+ (*regs-maybe-start* *regs-maybe-start*)
+ (*reg-ends* *reg-ends*)
+ ;; we might be able to optimize the scanning process by
+ ;; (virtually) shifting *START-POS* to the right
+ (scan-start-pos *start-pos*)
+ (starts-with-str (if start-string-test
+ (str starts-with)
+ 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))
+ ;; definition of ADVANCE-FN will be inserted here by macrology
+ (labels ((advance-fn-definition))
+ (declare (inline advance-fn))
+ (when (plusp rep-num)
+ ;; we have at least one REPETITION which needs to count
+ ;; the number of repetitions
+ (setq *repeat-counters* (make-array rep-num
+ :initial-element 0
+ :element-type 'fixnum)))
+ (when (plusp zero-length-num)
+ ;; we have at least one REPETITION which needs to watch
+ ;; out for zero-length repetitions
+ (setq *last-pos-stores* (make-array zero-length-num
+ :initial-element nil)))
+ (when (plusp reg-num)
+ ;; we have registers in our regular expression
+ (setq *reg-starts* (make-array reg-num :initial-element nil)
+ *regs-maybe-start* (make-array reg-num :initial-element nil)
+ *reg-ends* (make-array reg-num :initial-element nil)))
+ (when end-anchored-p
+ ;; the regular expression has a constant end string which
+ ;; 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))
+ (unless (setq *end-string-pos* (funcall end-string-test
+ end-test-pos))
+ (when (and (= 1 (the fixnum end-anchored-p))
+ (> *end-pos* scan-start-pos)
+ (char= #\Newline (schar *string* (1- *end-pos*))))
+ ;; if we didn't find an end string candidate from
+ ;; END-TEST-POS and if a #\Newline at the end is
+ ;; allowed we try it again from one position to the
+ ;; left
+ (setq *end-string-pos* (funcall end-string-test
+ (1- end-test-pos))))))
+ (unless (and *end-string-pos*
+ (<= *start-pos* *end-string-pos*))
+ ;; no end string candidate found, so give up
+ (return-from scan nil))
+ (when end-string-offset
+ ;; if the offset of the constant end string from the
+ ;; left of the regular expression is known we can start
+ ;; scanning further to the right; this is similar to
+ ;; what we might do in ADVANCE-FN
+ (setq scan-start-pos (max scan-start-pos
+ (- (the fixnum *end-string-pos*)
+ (the fixnum end-string-offset))))))
+ (cond
+ (start-anchored-p
+ ;; we're anchored at the start of the target string,
+ ;; so no need to try again after first failure
+ (when (or (/= *start-pos* scan-start-pos)
+ (< max-end-pos *start-pos*))
+ ;; if END-STRING-OFFSET has proven that we don't
+ ;; need to bother to scan from *START-POS* or if the
+ ;; minimal length of the regular expression is
+ ;; longer than the target string we give up
+ (return-from scan nil))
+ (when starts-with-str
+ (locally
+ (declare (type fixnum starts-with-len))
+ (cond ((and (case-insensitive-p starts-with)
+ (not (*string*-equal starts-with-str
+ *start-pos*
+ (+ *start-pos*
+ starts-with-len)
+ 0 starts-with-len)))
+ ;; the regular expression has a
+ ;; case-insensitive constant start string
+ ;; and we didn't find it
+ (return-from scan nil))
+ ((and (not (case-insensitive-p starts-with))
+ (not (*string*= starts-with-str
+ *start-pos*
+ (+ *start-pos* starts-with-len)
+ 0 starts-with-len)))
+ ;; the regular expression has a
+ ;; case-sensitive constant start string
+ ;; and we didn't find it
+ (return-from scan nil))
+ (t nil))))
+ (when (and end-string-test
+ (not end-anchored-p))
+ ;; the regular expression has a constant end string
+ ;; which isn't anchored so we didn't check for it
+ ;; already
+ (block end-string-loop
+ ;; we temporarily use *END-STRING-POS* as our
+ ;; starting position to look for end string
+ ;; candidates
+ (setq *end-string-pos* *start-pos*)
+ (loop
+ (unless (setq *end-string-pos*
+ (funcall (the function end-string-test)
+ *end-string-pos*))
+ ;; no end string candidate found, so give up
+ (return-from scan nil))
+ (unless end-string-offset
+ ;; end string doesn't have an offset so we
+ ;; can start scanning now
+ (return-from end-string-loop))
+ (let ((maybe-start-pos (- (the fixnum *end-string-pos*)
+ (the fixnum end-string-offset))))
+ (cond ((= maybe-start-pos *start-pos*)
+ ;; offset of end string into regular
+ ;; expression matches start anchor -
+ ;; fine...
+ (return-from end-string-loop))
+ ((and (< maybe-start-pos *start-pos*)
+ (< (+ *end-string-pos* end-string-len) *end-pos*))
+ ;; no match but maybe we find another
+ ;; one to the right - try again
+ (incf *end-string-pos*))
+ (t
+ ;; otherwise give up
+ (return-from scan nil)))))))
+ ;; if we got here we scan exactly once
+ (let ((next-pos (funcall match-fn *start-pos*)))
+ (when next-pos
+ (values (if next-pos *start-pos* nil)
+ next-pos
+ *reg-starts*
+ *reg-ends*))))
+ (t
+ (loop for pos = (if starts-with-everything
+ ;; don't jump to the next
+ ;; #\Newline on the first
+ ;; iteration
+ scan-start-pos
+ (advance-fn scan-start-pos))
+ then (advance-fn pos)
+ ;; give up if the regular expression can't fit
+ ;; into the rest of the target string
+ while (and pos
+ (<= (the fixnum pos) max-end-pos))
+ do (let ((next-pos (funcall match-fn pos)))
+ (when next-pos
+ (return-from scan (values pos
+ next-pos
+ *reg-starts*
+ *reg-ends*)))
+ ;; not yet found, increment POS
+ #-cormanlisp (incf (the fixnum pos))
+ #+cormanlisp (incf pos)))))))))
+ :test #'equalp))
+
+(defun create-scanner-aux (match-fn
+ min-len
+ start-anchored-p
+ starts-with
+ start-string-test
+ end-anchored-p
+ end-string-test
+ end-string-len
+ end-string-offset
+ rep-num
+ zero-length-num
+ reg-num)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ (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."
+ (let ((starts-with-len (if (typep starts-with 'str)
+ (len starts-with)))
+ (starts-with-everything (typep starts-with 'everything)))
+ (cond
+ ;; this COND statement dispatches on the different versions we
+ ;; have for ADVANCE-FN and creates different closures for each;
+ ;; note that you see only the bodies of ADVANCE-FN below - the
+ ;; actual scanner is defined in INSERT-ADVANCE-FN above; (we
+ ;; could have done this with closures instead of macrology but
+ ;; would have consed a lot more)
+ ((and start-string-test end-string-test end-string-offset)
+ ;; we know that the regular expression has constant start and
+ ;; end strings and we know the end string's offset (from the
+ ;; left)
+ (insert-advance-fn
+ (advance-fn (pos)
+ (declare (type fixnum end-string-offset starts-with-len)
+ (type 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
+ ;; candidate
+ (return-from scan nil))
+ (locally
+ ;; from here we know that POS is a FIXNUM
+ (declare (type 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
+ ;; candidate we're done
+ (return-from advance-fn pos))
+ (let ((try-pos (+ pos starts-with-len)))
+ ;; otherwise try (again) to find an end string
+ ;; candidate which starts behind the start string
+ ;; candidate
+ (loop
+ (unless (setq *end-string-pos*
+ (funcall end-string-test try-pos))
+ ;; no end string candidate found, so give up
+ (return-from scan nil))
+ ;; NEW-POS is where we should start scanning
+ ;; 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*))
+ (cond ((= new-pos pos)
+ ;; if POS and NEW-POS are equal then the
+ ;; two candidates agree so we're fine
+ (return-from advance-fn pos))
+ ((> new-pos pos)
+ ;; if NEW-POS is further to the right we
+ ;; advance POS and try again, i.e. we go
+ ;; back to the start of the outer LOOP
+ (setq pos new-pos)
+ ;; this means "return from inner LOOP"
+ (return))
+ (t
+ ;; otherwise NEW-POS is smaller than POS,
+ ;; so we have to redo the inner LOOP to
+ ;; find another end string candidate
+ ;; further to the right
+ (setq try-pos (1+ *end-string-pos*))))))))))))
+ ((and starts-with-everything end-string-test end-string-offset)
+ ;; we know that the regular expression starts with ".*" (which
+ ;; is not in single-line-mode, see CREATE-SCANNER-AUX) and ends
+ ;; with a constant end string and we know the end string's
+ ;; offset (from the left)
+ (insert-advance-fn
+ (advance-fn (pos)
+ (declare (type fixnum end-string-offset)
+ (type 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))
+ (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
+ ;; #\Newline we're done
+ (return-from advance-fn pos))
+ (let ((try-pos pos))
+ ;; otherwise try (again) to find an end string
+ ;; candidate which starts behind the #\Newline
+ (loop
+ (unless (setq *end-string-pos*
+ (funcall end-string-test try-pos))
+ ;; no end string candidate found, so we give up
+ (return-from scan nil))
+ ;; NEW-POS is where we should start scanning
+ ;; 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*))
+ (cond ((= new-pos pos)
+ ;; if POS and NEW-POS are equal then the
+ ;; the end string candidate agrees with
+ ;; the #\Newline so we're fine
+ (return-from advance-fn pos))
+ ((> new-pos pos)
+ ;; if NEW-POS is further to the right we
+ ;; advance POS and try again, i.e. we go
+ ;; back to the start of the outer LOOP
+ (setq pos new-pos)
+ ;; this means "return from inner LOOP"
+ (return))
+ (t
+ ;; otherwise NEW-POS is smaller than POS,
+ ;; so we have to redo the inner LOOP to
+ ;; find another end string candidate
+ ;; further to the right
+ (setq try-pos (1+ *end-string-pos*))))))))))))
+ ((and start-string-test end-string-test)
+ ;; we know that the regular expression has constant start and
+ ;; end strings; similar to the first case but we only need to
+ ;; check for the end string, it doesn't provide enough
+ ;; information to advance POS
+ (insert-advance-fn
+ (advance-fn (pos)
+ (declare (type function start-string-test end-string-test))
+ (unless (setq pos (funcall start-string-test pos))
+ (return-from scan nil))
+ (if (<= (the fixnum pos)
+ (the fixnum *end-string-pos*))
+ (return-from advance-fn pos))
+ (unless (setq *end-string-pos* (funcall end-string-test pos))
+ (return-from scan nil))
+ pos)))
+ ((and starts-with-everything end-string-test)
+ ;; we know that the regular expression starts with ".*" (which
+ ;; is not in single-line-mode, see CREATE-SCANNER-AUX) and ends
+ ;; with a constant end string; similar to the second case but we
+ ;; only need to check for the end string, it doesn't provide
+ ;; enough information to advance POS
+ (insert-advance-fn
+ (advance-fn (pos)
+ (declare (type function end-string-test))
+ (unless (setq pos (newline-skipper pos))
+ (return-from scan nil))
+ (if (<= (the fixnum pos)
+ (the fixnum *end-string-pos*))
+ (return-from advance-fn pos))
+ (unless (setq *end-string-pos* (funcall end-string-test pos))
+ (return-from scan nil))
+ pos)))
+ (start-string-test
+ ;; just check for constant start string candidate
+ (insert-advance-fn
+ (advance-fn (pos)
+ (declare (type function start-string-test))
+ (unless (setq pos (funcall start-string-test pos))
+ (return-from scan nil))
+ pos)))
+ (starts-with-everything
+ ;; just advance POS with NEWLINE-SKIPPER
+ (insert-advance-fn
+ (advance-fn (pos)
+ (unless (setq pos (newline-skipper pos))
+ (return-from scan nil))
+ pos)))
+ (end-string-test
+ ;; just check for the next end string candidate if POS has
+ ;; advanced beyond the last one
+ (insert-advance-fn
+ (advance-fn (pos)
+ (declare (type function end-string-test))
+ (if (<= (the fixnum pos)
+ (the fixnum *end-string-pos*))
+ (return-from advance-fn pos))
+ (unless (setq *end-string-pos* (funcall end-string-test pos))
+ (return-from scan nil))
+ pos)))
+ (t
+ ;; not enough optimization information about the regular
+ ;; expression to optimize so we just return POS
+ (insert-advance-fn
+ (advance-fn (pos)
+ pos))))))
\ No newline at end of file
diff --git a/practicals/libraries/cl-ppcre-1.2.3/specials.lisp b/practicals/libraries/cl-ppcre-1.2.3/specials.lisp
new file mode 100644
index 0000000..86d60d4
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/specials.lisp
@@ -0,0 +1,126 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/specials.lisp,v 1.19 2004/04/22 18:50:16 edi Exp $
+
+;;; globally declared special variables
+
+;;; Copyright (c) 2002-2004, 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)
+
+;;; special variables used by the lexer/parser combo
+
+(defvar *extended-mode-p* nil
+ "Whether the parser will start in extended mode.")
+(declaim (type boolean *extended-mode-p*))
+
+;;; special variables used by the SCAN function and the matchers
+
+(defvar *string* ""
+ "The string which is currently scanned by SCAN.
+Will always be coerced to a SIMPLE-STRING.")
+(declaim (type simple-string *string*))
+
+(defvar *start-pos* 0
+ "Where to start scanning within *STRING*.")
+(declaim (type fixnum *start-pos*))
+
+(defvar *real-start-pos* nil
+ "The real start of *STRING*. This is for repeated scans and is only used internally.")
+(declaim (type (or null fixnum) *real-start-pos*))
+
+(defvar *end-pos* 0
+ "Where to stop scanning within *STRING*.")
+(declaim (type 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*))
+
+(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*))
+
+(defvar *reg-ends* (make-array 0)
+ "An array which holds the end positions
+of the current register candidates.")
+(declaim (type simple-vector *reg-ends*))
+
+(defvar *end-string-pos* nil
+ "Start of the next possible end-string candidate.")
+
+(defvar *rep-num* 0
+ "Counts the number of \"complicated\" repetitions while the matchers
+are built.")
+(declaim (type 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*))
+
+(defvar *repeat-counters* (make-array 0
+ :initial-element 0
+ :element-type 'fixnum)
+ "An array to keep track of how often
+repetitive patterns have been tested already.")
+(declaim (type (array fixnum (*)) *repeat-counters*))
+
+(defvar *last-pos-stores* (make-array 0)
+ "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*))
+
+(defvar *use-bmh-matchers* t
+ "Whether the scanners created by CREATE-SCANNER should use the \(fast
+but large) Boyer-Moore-Horspool matchers.")
+
+(defvar *allow-quoting* nil
+ "Whether the parser should support Perl's \\Q and \\E.")
+
+(pushnew :cl-ppcre *features*)
+
+;; stuff for Nikodemus Siivola's HYPERDOC
+;; see
+;; and
+
+(defvar *hyperdoc-base-uri* "http://weitz.de/cl-ppcre/")
+
+(let ((exported-symbols-alist
+ (loop for symbol being the external-symbols of :cl-ppcre
+ collect (cons symbol
+ (concatenate 'string
+ "#"
+ (string-downcase symbol))))))
+ (defun hyperdoc-lookup (symbol type)
+ (declare (ignore type))
+ (cdr (assoc symbol
+ exported-symbols-alist
+ :test #'eq))))
+
\ No newline at end of file
diff --git a/practicals/libraries/cl-ppcre-1.2.3/testdata b/practicals/libraries/cl-ppcre-1.2.3/testdata
new file mode 100644
index 0000000..925d0ef
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/testdata
@@ -0,0 +1,14288 @@
+(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))
+(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)
+(263 "\"12\\n34\" =~ /^12.34/s" "^12.34" nil nil t nil "12
+34" nil 1 0 "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)
+(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))
+(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))
+(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))
+(289 "\"Alan Other \" =~ / (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\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))
+(290 "\"\" =~ / (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\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))
+(291 "\"user\\@dom.ain\" =~ / (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\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))
+(292 "\"\\\"A. Other\\\" (a comment)\" =~ / (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\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))
+(293 "\"A. Other (a comment)\" =~ / (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\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))
+(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
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\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))
+(295 "\"A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+" nil nil nil t "A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+/x" " (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional leading comment
+(?: (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
+\\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) | # comments, or...
+
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+# quoted strings
+)*
+< (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # leading <
+(?: @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* , (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* )? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) # initial word
+(?: (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\" (?: # opening quote...
+[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
+| # or
+\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
+)* \" # closing quote
+) )* # further okay, if led by a period
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* @ (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # initial subdomain
+(?: #
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* \\. # if led by a period...
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* (?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+| \\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* > # trailing >
+# name and address
+) (?: [\\040\\t] | \\(
+(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
+\\) )* # optional trailing comment
+" nil nil nil t "The quick brown fox" nil 1 0 nil nil)
+(297 "\"Alan Other \" =~ /[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# 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))
+(298 "\"\" =~ /[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# 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))
+(299 "\"user\\@dom.ain\" =~ /[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# 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))
+(300 "\"\\\"A. Other\\\" (a comment)\" =~ /[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# 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))
+(301 "\"A. Other (a comment)\" =~ /[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# 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))
+(302 "\"\\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\" =~ /[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# 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))
+(303 "\"A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+" nil nil nil t "A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x" "[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+# leading word
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
+(?:
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+|
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+) # \"special\" comment or quoted string
+[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
+)*
+<
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+\" # \"
+[^\\\\\\x80-\\xff\\n\\015\"] * # normal
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
+\" # \"
+# Quoted string
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\\.
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
+(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
+|
+\\[ # [
+(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
+\\] # ]
+)
+[\\040\\t]* # Nab whitespace.
+(?:
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: # (
+(?: \\\\ [^\\x80-\\xff] |
+\\( # (
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
+\\) # )
+) # special
+[^\\\\\\x80-\\xff\\n\\015()] * # normal*
+)* # )*
+\\) # )
+[\\040\\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# 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))
+(322 "\"\\nabc\" =~ /^\\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))
+(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)
+(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))
+(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))
+(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))
+(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))
+(369 "\"qqq\\nabc\" =~ /^abc$/" "^abc$" nil nil nil nil "qqq
+abc" nil 1 0 nil nil)
+(370 "\"abc\\nzzz\" =~ /^abc$/" "^abc$" nil nil nil nil "abc
+zzz" nil 1 0 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))
+(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))
+(374 "\"qqq\\nabc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq
+abc" nil 1 0 nil nil)
+(375 "\"abc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc
+zzz" nil 1 0 nil nil)
+(376 "\"qqq\\nabc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq
+abc
+zzz" nil 1 0 nil nil)
+(377 "\"abc\\ndef\" =~ /\\A(.)*\\Z/s" "\\A(.)*\\Z" nil nil t nil "abc
+def" nil 1 0 "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))
+(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))
+(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))
+(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))
+(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" ("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))
+(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))
+(442 "\"bbb\\nccc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "bbb
+ccc" nil 1 0 "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))
+(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))
+(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))
+(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))
+(547 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/s" ".*\\.gif" nil nil t nil "borfle
+bib.gif
+no" nil 1 0 "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
+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))
+(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))
+(551 "\"borfle\\nbib.gif\\nno\" =~ /.*$/s" ".*$" nil nil t nil "borfle
+bib.gif
+no" nil 1 0 "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
+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))
+(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))
+(555 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/s" ".*$" nil nil t nil "borfle
+bib.gif
+no
+" nil 1 0 "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
+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))
+(559 "\"abcde\\nBar\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "abcde
+Bar" nil 1 0 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))
+(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))
+(563 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde
+1234Xyz" nil 1 0 "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))
+(565 "\"abcde\\nBar\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde
+Bar" nil 1 0 nil nil)
+(566 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "abcde
+1234Xyz" nil 1 0 "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))
+(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))
+(569 "\"abcde\\n1234Xyz\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde
+1234Xyz" nil 1 0 "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))
+(571 "\"abcde\\nBar\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde
+Bar" nil 1 0 nil nil)
+(572 "\"abcde\\n1234Xyz\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde
+1234Xyz" nil 1 0 "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))
+(574 "\"abcde\\nBar\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde
+Bar" nil 1 0 nil nil)
+(575 "\"abc\\nB\" =~ /^.*B/" "^.*B" nil nil nil nil "abc
+B" nil 1 0 nil nil)
+(576 "\"abc\\nB\" =~ /(?s)^.*B/" "(?s)^.*B" nil nil nil nil "abc
+B" nil 1 0 "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))
+(578 "\"abc\\nB\" =~ /(?ms)^.*B/" "(?ms)^.*B" nil nil nil nil "abc
+B" nil 1 0 "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))
+(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.com | CA - 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.com | CA - Statewide |
" nil 1 0 "43.Word Processor (N-1286) | Lega lstaff.com | CA - 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))
+(609 "\"a\\nb\" =~ /a[^a]b/" "a[^a]b" 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 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))
+(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))
+(613 "\"a\\nb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "a
+b" nil 1 0 "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))
+(615 "\"a\\nb\" =~ /a.b/s" "a.b" nil nil t nil "a
+b" nil 1 0 "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))
+(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)
+(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))
+(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))
+(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))
+(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))
+(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))
+(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 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)
+(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))
+(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 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)
+(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)
+(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)
+(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\" =~ /(?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)
+(1498 "\"a\\nb\\n\" =~ /a\\Z/" "a\\Z" nil nil nil nil "a
+b
+" nil 1 0 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))
+(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))
+(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}...)(?\\s*)=(?>\\s*) # find \\s*)=(?>\\s*) # find \\s*)=(?>\\s*) # find \\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)
+(1617 "\"a\" =~ /a#comment\\Q...
+{2}/x" "a#comment\\Q...
+{2}" nil nil nil t "a" nil 1 0 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))
+(1619 "\"a\" =~ /a(?#comment\\Q...
+){2}/x" "a(?#comment\\Q...
+){2}" nil nil nil t "a" nil 1 0 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))
+(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))
+(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))
diff --git a/practicals/libraries/cl-ppcre-1.2.3/testinput b/practicals/libraries/cl-ppcre-1.2.3/testinput
new file mode 100644
index 0000000..8f1ad56
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/testinput
@@ -0,0 +1,3948 @@
+/the quick brown fox/
+ the quick brown fox
+ The quick brown FOX
+ What do you know about the quick brown fox?
+ What do you know about THE QUICK BROWN FOX?
+
+/The quick brown fox/i
+ the quick brown fox
+ The quick brown FOX
+ What do you know about the quick brown fox?
+ What do you know about THE QUICK BROWN FOX?
+
+/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
+ abcd\t\n\r\f\a\e9;\$\\?caxyz
+
+/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
+ abxyzpqrrrabbxyyyypqAzz
+ abxyzpqrrrabbxyyyypqAzz
+ aabxyzpqrrrabbxyyyypqAzz
+ aaabxyzpqrrrabbxyyyypqAzz
+ aaaabxyzpqrrrabbxyyyypqAzz
+ abcxyzpqrrrabbxyyyypqAzz
+ aabcxyzpqrrrabbxyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypAzz
+ aaabcxyzpqrrrabbxyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqqAzz
+ aaaabcxyzpqrrrabbxyyyypqAzz
+ abxyzzpqrrrabbxyyyypqAzz
+ aabxyzzzpqrrrabbxyyyypqAzz
+ aaabxyzzzzpqrrrabbxyyyypqAzz
+ aaaabxyzzzzpqrrrabbxyyyypqAzz
+ abcxyzzpqrrrabbxyyyypqAzz
+ aabcxyzzzpqrrrabbxyyyypqAzz
+ aaabcxyzzzzpqrrrabbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypABzz
+ aaabcxyzpqrrrabbxyyyypABBzz
+ >>>aaabxyzpqrrrabbxyyyypqAzz
+ >aaaabxyzpqrrrabbxyyyypqAzz
+ >>>>abcxyzpqrrrabbxyyyypqAzz
+ abxyzpqrrabbxyyyypqAzz
+ abxyzpqrrrrabbxyyyypqAzz
+ abxyzpqrrrabxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyypqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
+
+/^(abc){1,2}zz/
+ abczz
+ abcabczz
+ zz
+ abcabcabczz
+ >>abczz
+
+/^(b+?|a){1,2}?c/
+ bc
+ bbc
+ bbbc
+ bac
+ bbac
+ aac
+ abbbbbbbbbbbc
+ bbbbbbbbbbbac
+ aaac
+ abbbbbbbbbbbac
+
+/^(b+|a){1,2}c/
+ bc
+ bbc
+ bbbc
+ bac
+ bbac
+ aac
+ abbbbbbbbbbbc
+ bbbbbbbbbbbac
+ aaac
+ abbbbbbbbbbbac
+
+/^(b+|a){1,2}?bc/
+ bbc
+
+/^(b*|ba){1,2}?bc/
+ babc
+ bbabc
+ bababc
+ bababbc
+ babababc
+
+/^(ba|b*){1,2}?bc/
+ babc
+ bbabc
+ bababc
+ bababbc
+ babababc
+
+/^\ca\cA\c[\c{\c:/
+ \x01\x01\e;z
+
+/^[ab\]cde]/
+ athing
+ bthing
+ ]thing
+ cthing
+ dthing
+ ething
+ fthing
+ [thing
+ \\thing
+
+/^[]cde]/
+ ]thing
+ cthing
+ dthing
+ ething
+ athing
+ fthing
+
+/^[^ab\]cde]/
+ fthing
+ [thing
+ \\thing
+ athing
+ bthing
+ ]thing
+ cthing
+ dthing
+ ething
+
+/^[^]cde]/
+ athing
+ fthing
+ ]thing
+ cthing
+ dthing
+ ething
+
+/^\/
+
+
+/^ÿ/
+ ÿ
+
+/^[0-9]+$/
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 100
+ abc
+
+/^.*nter/
+ enter
+ inter
+ uponter
+
+/^xxx[0-9]+$/
+ xxx0
+ xxx1234
+ xxx
+
+/^.+[0-9][0-9][0-9]$/
+ x123
+ xx123
+ 123456
+ 123
+ x1234
+
+/^.+?[0-9][0-9][0-9]$/
+ x123
+ xx123
+ 123456
+ 123
+ x1234
+
+/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
+ abc!pqr=apquxz.ixr.zzz.ac.uk
+ !pqr=apquxz.ixr.zzz.ac.uk
+ abc!=apquxz.ixr.zzz.ac.uk
+ abc!pqr=apquxz:ixr.zzz.ac.uk
+ abc!pqr=apquxz.ixr.zzz.ac.ukk
+
+/:/
+ Well, we need a colon: somewhere
+ Fail if we don't
+
+/([\da-f:]+)$/i
+ 0abc
+ abc
+ fed
+ E
+ ::
+ 5f03:12C0::932e
+ fed def
+ Any old stuff
+ 0zzz
+ gzzz
+ fed\x20
+ Any old rubbish
+
+/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
+ .1.2.3
+ A.12.123.0
+ .1.2.3333
+ 1.2.3
+ 1234.2.3
+
+/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
+ 1 IN SOA non-sp1 non-sp2(
+ 1 IN SOA non-sp1 non-sp2 (
+ 1IN SOA non-sp1 non-sp2(
+
+/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
+ a.
+ Z.
+ 2.
+ ab-c.pq-r.
+ sxk.zzz.ac.uk.
+ x-.y-.
+ -abc.peq.
+
+/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
+ *.a
+ *.b0-a
+ *.c3-b.c
+ *.c-a.b-c
+ *.0
+ *.a-
+ *.a-b.c-
+ *.c-a.0-c
+
+/^(?=ab(de))(abd)(e)/
+ abde
+
+/^(?!(ab)de|x)(abd)(f)/
+ abdf
+
+/^(?=(ab(cd)))(ab)/
+ abcd
+
+/^[\da-f](\.[\da-f])*$/i
+ a.b.c.d
+ A.B.C.D
+ a.b.c.1.2.3.C
+
+/^\".*\"\s*(;.*)?$/
+ \"1234\"
+ \"abcd\" ;
+ \"\" ; rhubarb
+ \"1234\" : things
+
+/^$/
+ \
+
+/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
+ ab c
+ abc
+ ab cde
+
+/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
+ ab c
+ abc
+ ab cde
+
+/^ a\ b[c ]d $/x
+ a bcd
+ a b d
+ abcd
+ ab d
+
+/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
+ abcdefhijklm
+
+/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
+ abcdefhijklm
+
+/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
+ a+ Z0+\x08\n\x1d\x12
+
+/^[.^$|()*+?{,}]+/
+ .^\$(*+)|{?,?}
+
+/^a*\w/
+ z
+ az
+ aaaz
+ a
+ aa
+ aaaa
+ a+
+ aa+
+
+/^a*?\w/
+ z
+ az
+ aaaz
+ a
+ aa
+ aaaa
+ a+
+ aa+
+
+/^a+\w/
+ az
+ aaaz
+ aa
+ aaaa
+ aa+
+
+/^a+?\w/
+ az
+ aaaz
+ aa
+ aaaa
+ aa+
+
+/^\d{8}\w{2,}/
+ 1234567890
+ 12345678ab
+ 12345678__
+ 1234567
+
+/^[aeiou\d]{4,5}$/
+ uoie
+ 1234
+ 12345
+ aaaaa
+ 123456
+
+/^[aeiou\d]{4,5}?/
+ uoie
+ 1234
+ 12345
+ aaaaa
+ 123456
+
+/\A(abc|def)=(\1){2,3}\Z/
+ abc=abcabc
+ def=defdefdef
+ abc=defdef
+
+/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
+ abcdefghijkcda2
+ abcdefghijkkkkcda2
+
+/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
+ cataract cataract23
+ catatonic catatonic23
+ caterpillar caterpillar23
+
+
+/^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 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 abcd Mon Sep 01 12:33:02 1997
+ From abcd Mon Sep 1 12:33:02 1997
+ From abcd Sep 01 12:33:02 1997
+
+/^12.34/s
+ 12\n34
+ 12\r34
+
+/\w+(?=\t)/
+ the quick brown\t fox
+
+/foo(?!bar)(.*)/
+ foobar is foolish see?
+
+/(?:(?!foo)...|^.{0,2})bar(.*)/
+ foobar crowbar etc
+ barrel
+ 2barrel
+ A barrel
+
+/^(\D*)(?=\d)(?!123)/
+ abc456
+ abc123
+
+/^1234(?# test newlines
+ inside)/
+ 1234
+
+/^1234 #comment in extended re
+ /x
+ 1234
+
+/#rhubarb
+ abcd/x
+ abcd
+
+/^abcd#rhubarb/x
+ abcd
+
+/^(a)\1{2,3}(.)/
+ aaab
+ aaaab
+ aaaaab
+ aaaaaab
+
+/(?!^)abc/
+ the abc
+ abc
+
+/(?=^)abc/
+ abc
+ the abc
+
+/^[ab]{1,3}(ab*|b)/
+ aabbbbb
+
+/^[ab]{1,3}?(ab*|b)/
+ aabbbbb
+
+/^[ab]{1,3}?(ab*?|b)/
+ aabbbbb
+
+/^[ab]{1,3}(ab*?|b)/
+ aabbbbb
+
+/ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # optional leading comment
+(?: (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # initial word
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) )* # further okay, if led by a period
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or...
+\(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) | # comments, or...
+
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+# quoted strings
+)*
+< (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # leading <
+(?: @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* , (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* )? # optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # initial word
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) )* # further okay, if led by a period
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* > # trailing >
+# name and address
+) (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # optional trailing comment
+/x
+ Alan Other
+
+ user\@dom.ain
+ \"A. Other\" (a comment)
+ A. Other (a comment)
+ \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+# leading word
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces
+(?:
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+|
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+) # "special" comment or quoted string
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal"
+)*
+<
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x
+ Alan Other
+
+ user\@dom.ain
+ \"A. Other\" (a comment)
+ A. Other (a comment)
+ \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ A missing angle ]{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
+ | 43.Word Processor (N-1286) | Lega lstaff.com | CA - Statewide |
+
+/a[^a]b/
+ acb
+ a\nb
+
+/a.b/
+ acb
+ a\nb
+
+/a[^a]b/s
+ acb
+ a\nb
+
+/a.b/s
+ acb
+ a\nb
+
+/^(b+?|a){1,2}?c/
+ bac
+ bbac
+ bbbac
+ bbbbac
+ bbbbbac
+
+/^(b+|a){1,2}?c/
+ bac
+ bbac
+ bbbac
+ bbbbac
+ bbbbbac
+
+/(?!\A)x/m
+ x\nb\n
+ a\bx\n
+
+/\x0{ab}/
+ \0{ab}
+
+/(A|B)*?CD/
+ CD
+
+/(A|B)*CD/
+ CD
+
+/(AB)*?\1/
+ ABABAB
+
+/(AB)*\1/
+ ABABAB
+
+/(/
+ doesn't matter
+
+/(x)\2/
+ doesn't matter
+
+/((a{0,5}){0,5}){0,5}[c]/
+ aaaaaaaaaac
+ aaaaaaaaaa
+
+/((a{0,5}){0,5})*[c]/
+ aaaaaaaaaac
+ aaaaaaaaaa
+
+/(\b)*a/
+ a
+
+/(a)*b/
+ ab
+
+/(a|)*b/
+ ab
+ b
+ x
+
+/^(?:(a)|(b))*\1\2$/
+ abab
+
+/abc[^x]def/
+ abcxabcydef
+
+/^(a|\1x)*$/
+ aax
+ aaxa
+
+//
+ @{['']}
+
+/^(?:(a)|(b))*$/
+ ab
+
+/[\0]/
+ a
+ \0
+
+/[\1]/
+ a
+ \1
+
+/\10()()()()()()()()()/
+ doesn't matter
+
+/\10()()()()()()()()()()/
+ a
+
+/a(?<)b/
+ ab
+
+/[]/
+ doesn't matter
+
+/[\]/
+ doesn't matter
+
+/()/
+ a
+
+/[\x]/
+ x
+ \0
+
+/((a)*)*/
+ a
+
+/()a\1/
+ a
+
+/a\1()/
+ a
+
+/a(?i)a(?-i)a/
+ aaa
+ aAa
+ aAA
+
+/a(?i)a(?-i)a(?i)a(?-i)a/
+ aaaaa
+ aAaAa
+ AaAaA
+ aAAAa
+ AaaaA
+ AAAAA
+ aaAAA
+ AAaaa
+
+/\x/
+ a
+ X
+ \0
+
+/[a-c-e]/
+ a
+ b
+ d
+ -
+
+/[b-\d]/
+ b
+ c
+ d
+ -
+ 1
+
+/[\d-f]/
+ d
+ e
+ f
+ -
+ 1
+
+/[/
+ doesn't matter
+
+/]/
+ ]
+ a
+
+/[]/
+ doesn't matter
+
+/[-a-c]/
+ -
+ a
+ b
+ d
+
+/[a-c-]/
+ -
+ a
+ b
+ d
+
+/[-]/
+ a
+ -
+
+/[--]/
+ a
+ -
+
+/[---]/
+ a
+ -
+
+/[--b]/
+ -
+ a
+ c
+
+/[b--]/
+ doesn't matter
+
+/a{/
+ a{
+
+/a{}/
+ a{}
+
+/a{3/
+ a{3
+
+/a{3,/
+ a{3,
+
+/a{3, 3}/
+ a{3,3}
+ a{3, 3}
+ aaa
+
+/a{3, 3}/x
+ a{3,3}
+ a{3, 3}
+ aaa
+
+/a{3, }/
+ a{3,}
+ a{3, }
+ aaa
+
+/a{3, }/x
+ a{3,}
+ a{3, }
+ aaa
+
+/\x x/
+ \0 x
+ \0x
+
+/\x x/x
+ \0 x
+ \0x
+
+/\x 3/
+ \0003
+ \000 3
+ x3
+ x 3
+
+/\x 3/x
+ \0003
+ \000 3
+ x3
+ x 3
+
+/^a{ 1}$/
+ a
+ a{ 1}
+ a{1}
+
+/^a{ 1}$/x
+ a
+ a{ 1}
+ a{1}
+
+/{}/
+ {}
+ a
+
+/{1}/
+ doesn't matter
+
+/*/
+ doesn't matter
+
+/|/
+ x
+
+/\0000/
+ \0000
+
+/a(?<)b/
+ ab
+
+/a(?i)b/
+ ab
+ aB
+ Ab
+
+/a(?i=a)/
+ doesn't matter
+
+/a(?<=a){3000}a/
+ aa
+ xa
+ ax
+
+/a(?!=a){3000}a/
+ aa
+ ax
+ xa
+
+/a(){3000}a/
+ aa
+ ax
+ xa
+
+/a(?:){3000}a/
+ aa
+ ax
+
+/a(?<=a)*a/
+ aa
+ ax
+ xa
+
+/a(?!=a)*a/
+ aa
+ ax
+ xa
+
+/a()*a/
+ aa
+ ax
+ xa
+
+/a(?:)*a/
+ aa
+ ax
+ xa
+
+/x(?<=a)*a/
+ aa
+ xa
+ ax
+
+/a(?<=(a))*\1/
+ aa
+
+/a(?<=(a))*?\1/
+ aa
+
+/(?=(a)\1)*aa/
+ aa
+
+/^((a|b){2,5}){2}$/
+ aaaaabbbbb
+
+/^(b*|ba){1,2}bc/
+ babc
+ bbabc
+ bababc
+ bababbc
+ babababc
+
+/^a{4,5}(?:c|a)c$/
+ aaaaac
+ aaaaaac
+
+/^(a|){4,5}(?:c|a)c$/
+ aaaaac
+ aaaaaac
+
+/(?m:^).abc$/
+ eeexabc
+ eee\nxabc
+
+/(?m:^)abc/
+ abc
+ \nabc
+
+
+/^abc/
+ abc
+ \nabc
+
+/\Aabc/
+ abc
+ \nabc
+
+/(?.*/)foo"
+ /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
+
+"(?>.*/)foo"
+ /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
+
+/(?>(\.\d\d[1-9]?))\d+/
+ 1.230003938
+ 1.875000282
+ 1.235
+
+/^((?>\w+)|(?>\s+))*$/
+ now is the time for all good men to come to the aid of the party
+ this is not a line with only words and spaces!
+
+/(\d+)(\w)/
+ 12345a
+ 12345+
+
+/((?>\d+))(\w)/
+ 12345a
+ 12345+
+
+/(?>a+)b/
+ aaab
+
+/((?>a+)b)/
+ aaab
+
+/(?>(a+))b/
+ aaab
+
+/(?>b)+/
+ aaabbbccc
+
+/(?>a+|b+|c+)*c/
+ aaabbbbccccd
+
+/((?>[^()]+)|\([^()]*\))+/
+ ((abc(ade)ufh()()x
+
+/\(((?>[^()]+)|\([^()]+\))+\)/
+ (abc)
+ (abc(def)xyz)
+ ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/a(?-i)b/i
+ ab
+ Ab
+ aB
+ AB
+
+/(a (?x)b c)d e/
+ a bcd e
+ a b cd e
+ abcd e
+ a bcde
+
+/(a b(?x)c d (?-x)e f)/
+ a bcde f
+ abcdef
+
+/(a(?i)b)c/
+ abc
+ aBc
+ abC
+ aBC
+ Abc
+ ABc
+ ABC
+ AbC
+
+/a(?i:b)c/
+ abc
+ aBc
+ ABC
+ abC
+ aBC
+
+/a(?i:b)*c/
+ aBc
+ aBBc
+ aBC
+ aBBC
+
+/a(?=b(?i)c)\w\wd/
+ abcd
+ abCd
+ aBCd
+ abcD
+
+/(?s-i:more.*than).*million/i
+ more than million
+ more than MILLION
+ more \n than Million
+ MORE THAN MILLION
+ more \n than \n million
+
+/(?:(?s-i)more.*than).*million/i
+ more than million
+ more than MILLION
+ more \n than Million
+ MORE THAN MILLION
+ more \n than \n million
+
+/(?>a(?i)b+)+c/
+ abc
+ aBbc
+ aBBc
+ Abc
+ abAb
+ abbC
+
+/(?=a(?i)b)\w\wc/
+ abc
+ aBc
+ Ab
+ abC
+ aBC
+
+/(?<=a(?i)b)(\w\w)c/
+ abxxc
+ aBxxc
+ Abxxc
+ ABxxc
+ abxxC
+
+/(?:(a)|b)(?(1)A|B)/
+ aA
+ bB
+ aB
+ bA
+
+/^(a)?(?(1)a|b)+$/
+ aa
+ b
+ bb
+ ab
+
+/^(?(?=abc)\w{3}:|\d\d)$/
+ abc:
+ 12
+ 123
+ xyz
+
+/^(?(?!abc)\d\d|\w{3}:)$/
+ abc:
+ 12
+ 123
+ xyz
+
+/(?(?<=foo)bar|cat)/
+ foobar
+ cat
+ fcat
+ focat
+ foocat
+
+/(?(?a*)*/
+ a
+ aa
+ aaaa
+
+/(abc|)+/
+ abc
+ abcabc
+ abcabcabc
+ xyz
+
+/([a]*)*/
+ a
+ aaaaa
+
+/([ab]*)*/
+ a
+ b
+ ababab
+ aaaabcde
+ bbbb
+
+/([^a]*)*/
+ b
+ bbbb
+ aaa
+
+/([^ab]*)*/
+ cccc
+ abab
+
+/([a]*?)*/
+ a
+ aaaa
+
+/([ab]*?)*/
+ a
+ b
+ abab
+ baba
+
+/([^a]*?)*/
+ b
+ bbbb
+ aaa
+
+/([^ab]*?)*/
+ c
+ cccc
+ baba
+
+/(?>a*)*/
+ a
+ aaabcde
+
+/((?>a*))*/
+ aaaaa
+ aabbaa
+
+/((?>a*?))*/
+ aaaaa
+ aabbaa
+
+/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x
+ 12-sep-98
+ 12-09-98
+ sep-12-98
+
+/(?<=(foo))bar\1/
+ foobarfoo
+ foobarfootling
+ foobar
+ barfoo
+
+/(?i:saturday|sunday)/
+ saturday
+ sunday
+ Saturday
+ Sunday
+ SATURDAY
+ SUNDAY
+ SunDay
+
+/(a(?i)bc|BB)x/
+ abcx
+ aBCx
+ bbx
+ BBx
+ abcX
+ aBCX
+ bbX
+ BBX
+
+/^([ab](?i)[cd]|[ef])/
+ ac
+ aC
+ bD
+ elephant
+ Europe
+ frog
+ France
+ Africa
+
+/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
+ ab
+ aBd
+ xy
+ xY
+ zebra
+ Zambesi
+ aCD
+ XY
+
+/(?<=foo\n)^bar/m
+ foo\nbar
+ bar
+ baz\nbar
+
+/(?<=(?]&/
+ <&OUT
+
+/^(a\1?){4}$/
+ aaaaaaaaaa
+ AB
+ aaaaaaaaa
+ aaaaaaaaaaa
+
+/^(a(?(1)\1)){4}$/
+ aaaaaaaaaa
+ aaaaaaaaa
+ aaaaaaaaaaa
+
+/(?:(f)(o)(o)|(b)(a)(r))*/
+ foobar
+
+/(?<=a)b/
+ ab
+ cb
+ b
+
+/(?a+)ab/
+
+/(?>a+)b/
+ aaab
+
+/([[:]+)/
+ a:[b]:
+
+/([[=]+)/
+ a=[b]=
+
+/([[.]+)/
+ a.[b].
+
+/((?>a+)b)/
+ aaab
+
+/(?>(a+))b/
+ aaab
+
+/((?>[^()]+)|\([^()]*\))+/
+ ((abc(ade)ufh()()x
+
+/a\Z/
+ aaab
+ a\nb\n
+
+/b\Z/
+ a\nb\n
+
+/b\z/
+
+/b\Z/
+ a\nb
+
+/b\z/
+ a\nb
+
+/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
+ a
+ abc
+ a-b
+ 0-9
+ a.b
+ 5.6.7
+ the.quick.brown.fox
+ a100.b200.300c
+ 12-ab.1245
+ \
+ .a
+ -a
+ a-
+ a.
+ a_b
+ a.-
+ a..
+ ab..bc
+ the.quick.brown.fox-
+ the.quick.brown.fox.
+ the.quick.brown.fox_
+ the.quick.brown.fox+
+
+/(?>.*)(?<=(abcd|wxyz))/
+ alphabetabcd
+ endingwxyz
+ a rather long string that doesn't end with one of them
+
+/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ word cat dog elephant mussel cow horse canary baboon snake shark
+
+/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+ 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
+
+/(?<=\d{3}(?!999))foo/
+ 999foo
+ 123999foo
+ 123abcfoo
+
+/(?<=(?!...999)\d{3})foo/
+ 999foo
+ 123999foo
+ 123abcfoo
+
+/(?<=\d{3}(?!999)...)foo/
+ 123abcfoo
+ 123456foo
+ 123999foo
+
+/(?<=\d{3}...)(?\s*)=(?>\s*) # find Z)+|A)*/
+ ZABCDEFG
+
+/((?>)+|A)*/
+ ZABCDEFG
+
+/a*/g
+ abbab
+
+/^[a-\d]/
+ abcde
+ -things
+ 0digit
+ bcdef
+
+/^[\d-a]/
+ abcde
+ -things
+ 0digit
+ bcdef
+
+/(?<=abc).*(?=def)/
+ abcdef
+ abcxdef
+ abcxdefxdef
+
+/(?<=abc).*?(?=def)/
+ abcdef
+ abcxdef
+ abcxdefxdef
+
+/(?<=abc).+(?=def)/
+ abcdef
+ abcxdef
+ abcxdefxdef
+
+/(?<=abc).+?(?=def)/
+ abcdef
+ abcxdef
+ abcxdefxdef
+
+/(?<=\b)(.*)/
+ -abcdef
+ abcdef
+
+/(?<=\B)(.*)/
+ -abcdef
+ abcdef
+
+/^'[ab]'/
+ 'a'
+ 'b'
+ x'a'
+ 'a'x
+ 'ab'
+
+/^'[ab]'$/
+ 'a'
+ 'b'
+ x'a'
+ 'a'x
+ 'ab'
+
+/'[ab]'$/
+ 'a'
+ 'b'
+ x'a'
+ 'a'x
+ 'ab'
+
+/'[ab]'/
+ 'a'
+ 'b'
+ x'a'
+ 'a'x
+ 'ab'
+
+/abc\E/
+ abc
+ abcE
+
+/abc[\Ex]/
+ abcx
+ abcE
+
+/^\Qa*\E$/
+ a*
+ a
+
+/\Qa*x\E/
+ a*x
+ a*
+
+/\Qa*x/
+ a*x
+ a*
+
+/\Q\Qa*x\E\E/
+ a*x
+ a\\*x
+
+/\Q\Qa*x\E/
+ a*x
+ a\\*x
+
+/a\Q[x\E]/
+ a[x]
+ ax
+
+/a#comment\Q...
+{2}/x
+ a
+ aa
+
+/a(?#comment\Q...
+){2}/x
+ a
+ aa
+
+/(?x)a#\Q
+./
+ a.
+ aa
+
+/ab(?=.*q)cd/
+ abcdxklqj
+
+/a(?!.*$)b/
+ ab
+
+/.{2}[a-z]/
+ Axi
\ No newline at end of file
diff --git a/practicals/libraries/cl-ppcre-1.2.3/util.lisp b/practicals/libraries/cl-ppcre-1.2.3/util.lisp
new file mode 100644
index 0000000..9638283
--- /dev/null
+++ b/practicals/libraries/cl-ppcre-1.2.3/util.lisp
@@ -0,0 +1,313 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/cl-ppcre/util.lisp,v 1.27 2005/01/24 14:06:38 edi Exp $
+
+;;; Utility functions and constants dealing with the hash-tables
+;;; we use to encode character classes
+
+;;; Hash-tables are treated like sets, i.e. a character C is a member of the
+;;; hash-table H iff (GETHASH C H) is true.
+
+;;; Copyright (c) 2002-2004, 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)
+
+(defmacro with-unique-names ((&rest bindings) &body body)
+ "Syntax: WITH-UNIQUE-NAMES ( { var | (var x) }* ) declaration* form*
+
+Executes a series of forms with each VAR bound to a fresh,
+uninterned symbol. The uninterned symbol is as if returned by a call
+to GENSYM with the string denoted by X - or, if X is not supplied, the
+string denoted by VAR - as argument.
+
+The variable bindings created are lexical unless special declarations
+are specified. The scopes of the name bindings and declarations do not
+include the Xs.
+
+The forms are evaluated in order, and the values of all but the last
+are discarded \(that is, the body is an implicit PROGN)."
+ ;; reference implementation posted to comp.lang.lisp as
+ ;; by Vebjorn Ljosa - see also
+ ;;
+ `(let ,(mapcar #'(lambda (binding)
+ (check-type binding (or cons symbol))
+ (if (consp binding)
+ (destructuring-bind (var x) binding
+ (check-type var symbol)
+ `(,var (gensym ,(etypecase x
+ (symbol (symbol-name x))
+ (character (string x))
+ (string x)))))
+ `(,binding (gensym ,(symbol-name binding)))))
+ bindings)
+ ,@body))
+
+(defmacro with-rebinding (bindings &body body)
+ "WITH-REBINDING ( { var | (var prefix) }* ) form*
+
+Evaluates a series of forms in the lexical environment that is
+formed by adding the binding of each VAR to a fresh, uninterned
+symbol, and the binding of that fresh, uninterned symbol to VAR's
+original value, i.e., its value in the current lexical environment.
+
+The uninterned symbol is created as if by a call to GENSYM with the
+string denoted by PREFIX - or, if PREFIX is not supplied, the string
+denoted by VAR - as argument.
+
+The forms are evaluated in order, and the values of all but the last
+are discarded \(that is, the body is an implicit PROGN)."
+ ;; reference implementation posted to comp.lang.lisp as
+ ;; by Vebjorn Ljosa - see also
+ ;;
+ (loop for binding in bindings
+ for var = (if (consp binding) (car binding) binding)
+ for name = (gensym)
+ collect `(,name ,var) into renames
+ collect ``(,,var ,,name) into temps
+ finally (return `(let ,renames
+ (with-unique-names ,bindings
+ `(let (,,@temps)
+ ,,@body))))))
+
+(eval-when (:compile-toplevel :execute :load-toplevel)
+ (defvar *regex-char-code-limit* char-code-limit
+ "The upper exclusive bound on the char-codes of characters
+which can occur in character classes.
+Change this value BEFORE creating scanners if you don't need
+the full Unicode support of LW, ACL, or CLISP.")
+ (declaim (type fixnum *regex-char-code-limit*))
+
+ (defun make-char-hash (test)
+ (declare (optimize speed space))
+ "Returns a hash-table of all characters satisfying test."
+ (loop with hash = (make-hash-table)
+ for c of-type fixnum from 0 below char-code-limit
+ for chr = (code-char c)
+ if (and chr (funcall test chr))
+ do (setf (gethash chr hash) t)
+ finally (return hash)))
+
+ (declaim (inline word-char-p))
+
+ (defun word-char-p (chr)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "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 (optimize speed space))
+ "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-hash+)
+ (defconstant +digit-hash+
+ (make-char-hash (lambda (chr) (char<= #\0 chr #\9)))
+ "Hash-table containing the digits from 0 to 9."))
+
+(unless (boundp '+word-char-hash+)
+ (defconstant +word-char-hash+
+ (make-char-hash #'word-char-p)
+ "Hash-table containing all \"word\" characters."))
+
+(unless (boundp '+whitespace-char-hash+)
+ (defconstant +whitespace-char-hash+
+ (make-char-hash #'whitespacep)
+ "Hash-table containing all whitespace characters."))
+
+(defun merge-hash (hash1 hash2)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Returns the \"sum\" of two hashes. This is a destructive operation
+on HASH1."
+ (cond ((> (hash-table-count hash2)
+ *regex-char-code-limit*)
+ ;; don't walk through, e.g., the whole +WORD-CHAR-HASH+ if
+ ;; the user has set *REGEX-CHAR-CODE-LIMIT* to a lower value
+ (loop for c of-type fixnum from 0 below *regex-char-code-limit*
+ for chr = (code-char c)
+ if (and chr (gethash chr hash2))
+ do (setf (gethash chr hash1) t)))
+ (t
+ (loop for chr being the hash-keys of hash2
+ do (setf (gethash chr hash1) t))))
+ hash1)
+
+(defun merge-inverted-hash (hash1 hash2)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Returns the \"sum\" of HASH1 and the \"inverse\" of HASH2. This is
+a destructive operation on HASH1."
+ (loop for c of-type fixnum from 0 below *regex-char-code-limit*
+ for chr = (code-char c)
+ if (and chr (not (gethash chr hash2)))
+ do (setf (gethash chr hash1) t))
+ hash1)
+
+(defun create-ranges-from-hash (hash &key downcasep)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Tries to identify up to three intervals (with respect to CHAR<)
+which together comprise HASH. Returns NIL if this is not possible.
+If DOWNCASEP is true it will treat the hash-table 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 hash-tables
+ (unless (and hash (plusp (hash-table-count hash)))
+ (return-from create-ranges-from-hash nil))
+ (loop with min1 and min2 and min3
+ and max1 and max2 and max3
+ ;; loop through all characters in HASH, sorted by CHAR<
+ for chr in (sort (the list
+ (loop for chr being the hash-keys of hash
+ collect (if downcasep
+ (char-downcase chr)
+ chr)))
+ #'char<)
+ for code = (char-code chr)
+ ;; 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 CHR 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))
+ ;; CHR 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))
+ ;; CHR 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, CHR 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)))))))
+
+(defmacro maybe-coerce-to-simple-string (string)
+ (with-unique-names (=string=)
+ `(let ((,=string= ,string))
+ (cond ((simple-string-p ,=string=)
+ ,=string=)
+ (t
+ (coerce ,=string= 'simple-string))))))
+
+(declaim (inline nsubseq))
+(defun nsubseq (sequence start &optional (end (length sequence)))
+ "Return 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."
+ (loop for element in var-list
+ if (consp element)
+ nconc (loop for var in (rest element)
+ collect (list (first element) var))
+ else
+ collect (list '(function identity) element)))
+
+(defun string-list-to-simple-string (string-list)
+ (declare (optimize speed
+ (safety 0)
+ (space 0)
+ (debug 0)
+ (compilation-speed 0)
+ #+:lispworks (hcl:fixnum-safety 0)))
+ "Concatenates a list of strings to one simple-string."
+ ;; 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))
+ (dolist (string string-list)
+ #-genera (declare (type string string))
+ (incf total-size (length string)))
+ (let ((result-string (make-sequence 'simple-string total-size))
+ (curr-pos 0))
+ (declare (type fixnum curr-pos))
+ (dolist (string string-list)
+ #-genera (declare (type string string))
+ (replace result-string string :start1 curr-pos)
+ (incf curr-pos (length string)))
+ result-string)))
diff --git a/practicals/practicals.asd b/practicals/practicals.asd
new file mode 100644
index 0000000..2c8be55
--- /dev/null
+++ b/practicals/practicals.asd
@@ -0,0 +1,27 @@
+(defpackage :com.gigamonkeys.practicals-system (:use :asdf :cl))
+(in-package :com.gigamonkeys.practicals-system)
+
+(require :aserve)
+
+(defsystem practicals
+ :name "practicals"
+ :author "Peter Seibel "
+ :version "1.0"
+ :maintainer "Peter Seibel "
+ :licence "BSD"
+ :description "All code from Practical Common Lisp."
+ :depends-on
+ (:binary-data
+ :html
+ :id3v2
+ :macro-utilities
+ :mp3-browser
+ :mp3-database
+ :pathnames
+ :shoutcast
+ :simple-database
+ :spam
+ :test-framework
+ :url-function))
+
+