1# This set of tests is for features that are compatible with all versions of
2# Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and
3# 32-bit PCRE libraries, and also using the perltest.pl script.
4
5#forbid_utf
6#newline_default lf any anycrlf
7#perltest
8
9/the quick brown fox/
10    the quick brown fox
11 0: the quick brown fox
12    What do you know about the quick brown fox?
13 0: the quick brown fox
14\= Expect no match
15    The quick brown FOX
16No match
17    What do you know about THE QUICK BROWN FOX?
18No match
19
20/The quick brown fox/i
21    the quick brown fox
22 0: the quick brown fox
23    The quick brown FOX
24 0: The quick brown FOX
25    What do you know about the quick brown fox?
26 0: the quick brown fox
27    What do you know about THE QUICK BROWN FOX?
28 0: THE QUICK BROWN FOX
29
30/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
31    abcd\t\n\r\f\a\e9;\$\\?caxyz
32 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz
33
34/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
35    abxyzpqrrrabbxyyyypqAzz
36 0: abxyzpqrrrabbxyyyypqAzz
37    abxyzpqrrrabbxyyyypqAzz
38 0: abxyzpqrrrabbxyyyypqAzz
39    aabxyzpqrrrabbxyyyypqAzz
40 0: aabxyzpqrrrabbxyyyypqAzz
41    aaabxyzpqrrrabbxyyyypqAzz
42 0: aaabxyzpqrrrabbxyyyypqAzz
43    aaaabxyzpqrrrabbxyyyypqAzz
44 0: aaaabxyzpqrrrabbxyyyypqAzz
45    abcxyzpqrrrabbxyyyypqAzz
46 0: abcxyzpqrrrabbxyyyypqAzz
47    aabcxyzpqrrrabbxyyyypqAzz
48 0: aabcxyzpqrrrabbxyyyypqAzz
49    aaabcxyzpqrrrabbxyyyypAzz
50 0: aaabcxyzpqrrrabbxyyyypAzz
51    aaabcxyzpqrrrabbxyyyypqAzz
52 0: aaabcxyzpqrrrabbxyyyypqAzz
53    aaabcxyzpqrrrabbxyyyypqqAzz
54 0: aaabcxyzpqrrrabbxyyyypqqAzz
55    aaabcxyzpqrrrabbxyyyypqqqAzz
56 0: aaabcxyzpqrrrabbxyyyypqqqAzz
57    aaabcxyzpqrrrabbxyyyypqqqqAzz
58 0: aaabcxyzpqrrrabbxyyyypqqqqAzz
59    aaabcxyzpqrrrabbxyyyypqqqqqAzz
60 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz
61    aaabcxyzpqrrrabbxyyyypqqqqqqAzz
62 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz
63    aaaabcxyzpqrrrabbxyyyypqAzz
64 0: aaaabcxyzpqrrrabbxyyyypqAzz
65    abxyzzpqrrrabbxyyyypqAzz
66 0: abxyzzpqrrrabbxyyyypqAzz
67    aabxyzzzpqrrrabbxyyyypqAzz
68 0: aabxyzzzpqrrrabbxyyyypqAzz
69    aaabxyzzzzpqrrrabbxyyyypqAzz
70 0: aaabxyzzzzpqrrrabbxyyyypqAzz
71    aaaabxyzzzzpqrrrabbxyyyypqAzz
72 0: aaaabxyzzzzpqrrrabbxyyyypqAzz
73    abcxyzzpqrrrabbxyyyypqAzz
74 0: abcxyzzpqrrrabbxyyyypqAzz
75    aabcxyzzzpqrrrabbxyyyypqAzz
76 0: aabcxyzzzpqrrrabbxyyyypqAzz
77    aaabcxyzzzzpqrrrabbxyyyypqAzz
78 0: aaabcxyzzzzpqrrrabbxyyyypqAzz
79    aaaabcxyzzzzpqrrrabbxyyyypqAzz
80 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz
81    aaaabcxyzzzzpqrrrabbbxyyyypqAzz
82 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz
83    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
84 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
85    aaabcxyzpqrrrabbxyyyypABzz
86 0: aaabcxyzpqrrrabbxyyyypABzz
87    aaabcxyzpqrrrabbxyyyypABBzz
88 0: aaabcxyzpqrrrabbxyyyypABBzz
89    >>>aaabxyzpqrrrabbxyyyypqAzz
90 0: aaabxyzpqrrrabbxyyyypqAzz
91    >aaaabxyzpqrrrabbxyyyypqAzz
92 0: aaaabxyzpqrrrabbxyyyypqAzz
93    >>>>abcxyzpqrrrabbxyyyypqAzz
94 0: abcxyzpqrrrabbxyyyypqAzz
95\= Expect no match
96    abxyzpqrrabbxyyyypqAzz
97No match
98    abxyzpqrrrrabbxyyyypqAzz
99No match
100    abxyzpqrrrabxyyyypqAzz
101No match
102    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
103No match
104    aaaabcxyzzzzpqrrrabbbxyyypqAzz
105No match
106    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
107No match
108
109/^(abc){1,2}zz/
110    abczz
111 0: abczz
112 1: abc
113    abcabczz
114 0: abcabczz
115 1: abc
116\= Expect no match
117    zz
118No match
119    abcabcabczz
120No match
121    >>abczz
122No match
123
124/^(b+?|a){1,2}?c/
125    bc
126 0: bc
127 1: b
128    bbc
129 0: bbc
130 1: b
131    bbbc
132 0: bbbc
133 1: bb
134    bac
135 0: bac
136 1: a
137    bbac
138 0: bbac
139 1: a
140    aac
141 0: aac
142 1: a
143    abbbbbbbbbbbc
144 0: abbbbbbbbbbbc
145 1: bbbbbbbbbbb
146    bbbbbbbbbbbac
147 0: bbbbbbbbbbbac
148 1: a
149\= Expect no match
150    aaac
151No match
152    abbbbbbbbbbbac
153No match
154
155/^(b+|a){1,2}c/
156    bc
157 0: bc
158 1: b
159    bbc
160 0: bbc
161 1: bb
162    bbbc
163 0: bbbc
164 1: bbb
165    bac
166 0: bac
167 1: a
168    bbac
169 0: bbac
170 1: a
171    aac
172 0: aac
173 1: a
174    abbbbbbbbbbbc
175 0: abbbbbbbbbbbc
176 1: bbbbbbbbbbb
177    bbbbbbbbbbbac
178 0: bbbbbbbbbbbac
179 1: a
180\= Expect no match
181    aaac
182No match
183    abbbbbbbbbbbac
184No match
185
186/^(b+|a){1,2}?bc/
187    bbc
188 0: bbc
189 1: b
190
191/^(b*|ba){1,2}?bc/
192    babc
193 0: babc
194 1: ba
195    bbabc
196 0: bbabc
197 1: ba
198    bababc
199 0: bababc
200 1: ba
201\= Expect no match
202    bababbc
203No match
204    babababc
205No match
206
207/^(ba|b*){1,2}?bc/
208    babc
209 0: babc
210 1: ba
211    bbabc
212 0: bbabc
213 1: ba
214    bababc
215 0: bababc
216 1: ba
217\= Expect no match
218    bababbc
219No match
220    babababc
221No match
222
223#/^\ca\cA\c[;\c:/
224#    \x01\x01\e;z
225# 0: \x01\x01\x1b;z
226
227/^[ab\]cde]/
228    athing
229 0: a
230    bthing
231 0: b
232    ]thing
233 0: ]
234    cthing
235 0: c
236    dthing
237 0: d
238    ething
239 0: e
240\= Expect no match
241    fthing
242No match
243    [thing
244No match
245    \\thing
246No match
247
248/^[]cde]/
249    ]thing
250 0: ]
251    cthing
252 0: c
253    dthing
254 0: d
255    ething
256 0: e
257\= Expect no match
258    athing
259No match
260    fthing
261No match
262
263/^[^ab\]cde]/
264    fthing
265 0: f
266    [thing
267 0: [
268    \\thing
269 0: \
270\= Expect no match
271    athing
272No match
273    bthing
274No match
275    ]thing
276No match
277    cthing
278No match
279    dthing
280No match
281    ething
282No match
283
284/^[^]cde]/
285    athing
286 0: a
287    fthing
288 0: f
289\= Expect no match
290    ]thing
291No match
292    cthing
293No match
294    dthing
295No match
296    ething
297No match
298
299# DLC - I don't get this one
300#/^\/
301#    
302# 0: \x81
303
304#updated to handle 16-bits utf8
305/^ÿ/
306    ÿ
307 0: \xc3\xbf
308
309/^[0-9]+$/
310    0
311 0: 0
312    1
313 0: 1
314    2
315 0: 2
316    3
317 0: 3
318    4
319 0: 4
320    5
321 0: 5
322    6
323 0: 6
324    7
325 0: 7
326    8
327 0: 8
328    9
329 0: 9
330    10
331 0: 10
332    100
333 0: 100
334\= Expect no match
335    abc
336No match
337
338/^.*nter/
339    enter
340 0: enter
341    inter
342 0: inter
343    uponter
344 0: uponter
345
346/^xxx[0-9]+$/
347    xxx0
348 0: xxx0
349    xxx1234
350 0: xxx1234
351\= Expect no match
352    xxx
353No match
354
355/^.+[0-9][0-9][0-9]$/
356    x123
357 0: x123
358    x1234
359 0: x1234
360    xx123
361 0: xx123
362    123456
363 0: 123456
364\= Expect no match
365    123
366No match
367
368/^.+?[0-9][0-9][0-9]$/
369    x123
370 0: x123
371    x1234
372 0: x1234
373    xx123
374 0: xx123
375    123456
376 0: 123456
377\= Expect no match
378    123
379No match
380
381/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
382    abc!pqr=apquxz.ixr.zzz.ac.uk
383 0: abc!pqr=apquxz.ixr.zzz.ac.uk
384 1: abc
385 2: pqr
386\= Expect no match
387    !pqr=apquxz.ixr.zzz.ac.uk
388No match
389    abc!=apquxz.ixr.zzz.ac.uk
390No match
391    abc!pqr=apquxz:ixr.zzz.ac.uk
392No match
393    abc!pqr=apquxz.ixr.zzz.ac.ukk
394No match
395
396/:/
397    Well, we need a colon: somewhere
398 0: :
399\= Expect no match
400    Fail without a colon
401No match
402
403/([\da-f:]+)$/i
404    0abc
405 0: 0abc
406 1: 0abc
407    abc
408 0: abc
409 1: abc
410    fed
411 0: fed
412 1: fed
413    E
414 0: E
415 1: E
416    ::
417 0: ::
418 1: ::
419    5f03:12C0::932e
420 0: 5f03:12C0::932e
421 1: 5f03:12C0::932e
422    fed def
423 0: def
424 1: def
425    Any old stuff
426 0: ff
427 1: ff
428\= Expect no match
429    0zzz
430No match
431    gzzz
432No match
433    fed\x20
434No match
435    Any old rubbish
436No match
437
438/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
439    .1.2.3
440 0: .1.2.3
441 1: 1
442 2: 2
443 3: 3
444    A.12.123.0
445 0: A.12.123.0
446 1: 12
447 2: 123
448 3: 0
449\= Expect no match
450    .1.2.3333
451No match
452    1.2.3
453No match
454    1234.2.3
455No match
456
457/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
458    1 IN SOA non-sp1 non-sp2(
459 0: 1 IN SOA non-sp1 non-sp2(
460 1: 1
461 2: non-sp1
462 3: non-sp2
463    1    IN    SOA    non-sp1    non-sp2   (
464 0: 1    IN    SOA    non-sp1    non-sp2   (
465 1: 1
466 2: non-sp1
467 3: non-sp2
468\= Expect no match
469    1IN SOA non-sp1 non-sp2(
470No match
471
472/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
473    a.
474 0: a.
475    Z.
476 0: Z.
477    2.
478 0: 2.
479    ab-c.pq-r.
480 0: ab-c.pq-r.
481 1: .pq-r
482    sxk.zzz.ac.uk.
483 0: sxk.zzz.ac.uk.
484 1: .uk
485    x-.y-.
486 0: x-.y-.
487 1: .y-
488\= Expect no match
489    -abc.peq.
490No match
491
492/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
493    *.a
494 0: *.a
495    *.b0-a
496 0: *.b0-a
497 1: 0-a
498    *.c3-b.c
499 0: *.c3-b.c
500 1: 3-b
501 2: .c
502    *.c-a.b-c
503 0: *.c-a.b-c
504 1: -a
505 2: .b-c
506 3: -c
507\= Expect no match
508    *.0
509No match
510    *.a-
511No match
512    *.a-b.c-
513No match
514    *.c-a.0-c
515No match
516
517/^(?=ab(de))(abd)(e)/
518    abde
519 0: abde
520 1: de
521 2: abd
522 3: e
523
524/^(?!(ab)de|x)(abd)(f)/
525    abdf
526 0: abdf
527 1: <unset>
528 2: abd
529 3: f
530
531/^(?=(ab(cd)))(ab)/
532    abcd
533 0: ab
534 1: abcd
535 2: cd
536 3: ab
537
538/^[\da-f](\.[\da-f])*$/i
539    a.b.c.d
540 0: a.b.c.d
541 1: .d
542    A.B.C.D
543 0: A.B.C.D
544 1: .D
545    a.b.c.1.2.3.C
546 0: a.b.c.1.2.3.C
547 1: .C
548
549/^\".*\"\s*(;.*)?$/
550    \"1234\"
551 0: "1234"
552    \"abcd\" ;
553 0: "abcd" ;
554 1: ;
555    \"\" ; rhubarb
556 0: "" ; rhubarb
557 1: ; rhubarb
558\= Expect no match
559    \"1234\" : things
560No match
561
562/^$/
563    \
564 0:
565\= Expect no match
566    A non-empty line
567No match
568
569/   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/x
570    ab c
571 0: ab c
572\= Expect no match
573    abc
574No match
575    ab cde
576No match
577
578/(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
579    ab c
580 0: ab c
581\= Expect no match
582    abc
583No match
584    ab cde
585No match
586
587/^   a\ b[c ]d       $/x
588    a bcd
589 0: a bcd
590    a b d
591 0: a b d
592\= Expect no match
593    abcd
594No match
595    ab d
596No match
597
598/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
599    abcdefhijklm
600 0: abcdefhijklm
601 1: abc
602 2: bc
603 3: c
604 4: def
605 5: ef
606 6: f
607 7: hij
608 8: ij
609 9: j
61010: klm
61111: lm
61212: m
613
614/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
615    abcdefhijklm
616 0: abcdefhijklm
617 1: bc
618 2: c
619 3: ef
620 4: f
621 5: ij
622 6: j
623 7: lm
624 8: m
625
626#/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
627#    a+ Z0+\x08\n\x1d\x12
628# 0: a+ Z0+\x08\x0a\x1d\x12
629
630/^[.^$|()*+?{,}]+/
631    .^\$(*+)|{?,?}
632 0: .^$(*+)|{?,?}
633
634/^a*\w/
635    z
636 0: z
637    az
638 0: az
639    aaaz
640 0: aaaz
641    a
642 0: a
643    aa
644 0: aa
645    aaaa
646 0: aaaa
647    a+
648 0: a
649    aa+
650 0: aa
651
652/^a*?\w/
653    z
654 0: z
655    az
656 0: a
657    aaaz
658 0: a
659    a
660 0: a
661    aa
662 0: a
663    aaaa
664 0: a
665    a+
666 0: a
667    aa+
668 0: a
669
670/^a+\w/
671    az
672 0: az
673    aaaz
674 0: aaaz
675    aa
676 0: aa
677    aaaa
678 0: aaaa
679    aa+
680 0: aa
681
682/^a+?\w/
683    az
684 0: az
685    aaaz
686 0: aa
687    aa
688 0: aa
689    aaaa
690 0: aa
691    aa+
692 0: aa
693
694/^\d{8}\w{2,}/
695    1234567890
696 0: 1234567890
697    12345678ab
698 0: 12345678ab
699    12345678__
700 0: 12345678__
701\= Expect no match
702    1234567
703No match
704
705/^[aeiou\d]{4,5}$/
706    uoie
707 0: uoie
708    1234
709 0: 1234
710    12345
711 0: 12345
712    aaaaa
713 0: aaaaa
714\= Expect no match
715    123456
716No match
717
718/^[aeiou\d]{4,5}?/
719    uoie
720 0: uoie
721    1234
722 0: 1234
723    12345
724 0: 1234
725    aaaaa
726 0: aaaa
727    123456
728 0: 1234
729
730/\A(abc|def)=(\1){2,3}\Z/
731    abc=abcabc
732 0: abc=abcabc
733 1: abc
734 2: abc
735    def=defdefdef
736 0: def=defdefdef
737 1: def
738 2: def
739\= Expect no match
740    abc=defdef
741No match
742
743/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
744    abcdefghijkcda2
745 0: abcdefghijkcda2
746 1: a
747 2: b
748 3: c
749 4: d
750 5: e
751 6: f
752 7: g
753 8: h
754 9: i
75510: j
75611: k
75712: cd
758    abcdefghijkkkkcda2
759 0: abcdefghijkkkkcda2
760 1: a
761 2: b
762 3: c
763 4: d
764 5: e
765 6: f
766 7: g
767 8: h
768 9: i
76910: j
77011: k
77112: cd
772
773/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
774    cataract cataract23
775 0: cataract cataract23
776 1: cataract
777 2: aract
778 3: ract
779 4:
780 5: 3
781    catatonic catatonic23
782 0: catatonic catatonic23
783 1: catatonic
784 2: atonic
785 3: tonic
786 4:
787 5: 3
788    caterpillar caterpillar23
789 0: caterpillar caterpillar23
790 1: caterpillar
791 2: erpillar
792 3: <unset>
793 4:
794 5: 3
795
796
797/^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]/
798    From abcd  Mon Sep 01 12:33:02 1997
799 0: From abcd  Mon Sep 01 12:33
800 1: abcd
801
802/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
803    From abcd  Mon Sep 01 12:33:02 1997
804 0: From abcd  Mon Sep 01 12:33
805 1: Sep
806    From abcd  Mon Sep  1 12:33:02 1997
807 0: From abcd  Mon Sep  1 12:33
808 1: Sep
809\= Expect no match
810    From abcd  Sep 01 12:33:02 1997
811No match
812
813/^12.34/s
814    12\n34
815 0: 12\x0a34
816    12\r34
817 0: 12\x0d34
818
819/\w+(?=\t)/
820    the quick brown\t fox
821 0: brown
822
823/foo(?!bar)(.*)/
824    foobar is foolish see?
825 0: foolish see?
826 1: lish see?
827
828/(?:(?!foo)...|^.{0,2})bar(.*)/
829    foobar crowbar etc
830 0: rowbar etc
831 1:  etc
832    barrel
833 0: barrel
834 1: rel
835    2barrel
836 0: 2barrel
837 1: rel
838    A barrel
839 0: A barrel
840 1: rel
841
842/^(\D*)(?=\d)(?!123)/
843    abc456
844 0: abc
845 1: abc
846\= Expect no match
847    abc123
848No match
849
850/^1234(?# test newlines
851  inside)/
852    1234
853 0: 1234
854
855/^1234 #comment in extended re
856  /x
857    1234
858 0: 1234
859
860/#rhubarb
861  abcd/x
862    abcd
863 0: abcd
864
865/^abcd#rhubarb/x
866    abcd
867 0: abcd
868
869/^(a)\1{2,3}(.)/
870    aaab
871 0: aaab
872 1: a
873 2: b
874    aaaab
875 0: aaaab
876 1: a
877 2: b
878    aaaaab
879 0: aaaaa
880 1: a
881 2: a
882    aaaaaab
883 0: aaaaa
884 1: a
885 2: a
886
887/(?!^)abc/
888    the abc
889 0: abc
890\= Expect no match
891    abc
892No match
893
894/(?=^)abc/
895    abc
896 0: abc
897\= Expect no match
898    the abc
899No match
900
901/^[ab]{1,3}(ab*|b)/
902    aabbbbb
903 0: aabb
904 1: b
905
906/^[ab]{1,3}?(ab*|b)/
907    aabbbbb
908 0: aabbbbb
909 1: abbbbb
910
911/^[ab]{1,3}?(ab*?|b)/
912    aabbbbb
913 0: aa
914 1: a
915
916/^[ab]{1,3}(ab*?|b)/
917    aabbbbb
918 0: aabb
919 1: b
920
921/  (?: [\040\t] |  \(
922(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
923\)  )*                          # optional leading comment
924(?:    (?:
925[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
926(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
927|
928" (?:                      # opening quote...
929[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
930|                     #    or
931\\ [^\x80-\xff]           #   Escaped something (something != CR)
932)* "  # closing quote
933)                    # initial word
934(?:  (?: [\040\t] |  \(
935(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
936\)  )*  \.  (?: [\040\t] |  \(
937(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
938\)  )*   (?:
939[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
940(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
941|
942" (?:                      # opening quote...
943[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
944|                     #    or
945\\ [^\x80-\xff]           #   Escaped something (something != CR)
946)* "  # closing quote
947)  )* # further okay, if led by a period
948(?: [\040\t] |  \(
949(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
950\)  )*  @  (?: [\040\t] |  \(
951(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
952\)  )*    (?:
953[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
954(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
955|   \[                         # [
956(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
957\]                        #           ]
958)                           # initial subdomain
959(?:                                  #
960(?: [\040\t] |  \(
961(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
962\)  )*  \.                        # if led by a period...
963(?: [\040\t] |  \(
964(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
965\)  )*   (?:
966[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
967(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
968|   \[                         # [
969(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
970\]                        #           ]
971)                     #   ...further okay
972)*
973# address
974|                     #  or
975(?:
976[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
977(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
978|
979" (?:                      # opening quote...
980[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
981|                     #    or
982\\ [^\x80-\xff]           #   Escaped something (something != CR)
983)* "  # closing quote
984)             # one word, optionally followed by....
985(?:
986[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]  |  # atom and space parts, or...
987\(
988(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
989\)       |  # comments, or...
990
991" (?:                      # opening quote...
992[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
993|                     #    or
994\\ [^\x80-\xff]           #   Escaped something (something != CR)
995)* "  # closing quote
996# quoted strings
997)*
998<  (?: [\040\t] |  \(
999(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1000\)  )*                     # leading <
1001(?:  @  (?: [\040\t] |  \(
1002(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1003\)  )*    (?:
1004[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1005(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1006|   \[                         # [
1007(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
1008\]                        #           ]
1009)                           # initial subdomain
1010(?:                                  #
1011(?: [\040\t] |  \(
1012(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1013\)  )*  \.                        # if led by a period...
1014(?: [\040\t] |  \(
1015(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1016\)  )*   (?:
1017[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1018(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1019|   \[                         # [
1020(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
1021\]                        #           ]
1022)                     #   ...further okay
1023)*
1024
1025(?:  (?: [\040\t] |  \(
1026(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1027\)  )*  ,  (?: [\040\t] |  \(
1028(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1029\)  )*  @  (?: [\040\t] |  \(
1030(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1031\)  )*    (?:
1032[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1033(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1034|   \[                         # [
1035(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
1036\]                        #           ]
1037)                           # initial subdomain
1038(?:                                  #
1039(?: [\040\t] |  \(
1040(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1041\)  )*  \.                        # if led by a period...
1042(?: [\040\t] |  \(
1043(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1044\)  )*   (?:
1045[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1046(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1047|   \[                         # [
1048(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
1049\]                        #           ]
1050)                     #   ...further okay
1051)*
1052)* # further okay, if led by comma
1053:                                # closing colon
1054(?: [\040\t] |  \(
1055(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1056\)  )*  )? #       optional route
1057(?:
1058[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1059(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1060|
1061" (?:                      # opening quote...
1062[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
1063|                     #    or
1064\\ [^\x80-\xff]           #   Escaped something (something != CR)
1065)* "  # closing quote
1066)                    # initial word
1067(?:  (?: [\040\t] |  \(
1068(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1069\)  )*  \.  (?: [\040\t] |  \(
1070(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1071\)  )*   (?:
1072[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1073(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1074|
1075" (?:                      # opening quote...
1076[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
1077|                     #    or
1078\\ [^\x80-\xff]           #   Escaped something (something != CR)
1079)* "  # closing quote
1080)  )* # further okay, if led by a period
1081(?: [\040\t] |  \(
1082(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1083\)  )*  @  (?: [\040\t] |  \(
1084(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1085\)  )*    (?:
1086[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1087(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1088|   \[                         # [
1089(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
1090\]                        #           ]
1091)                           # initial subdomain
1092(?:                                  #
1093(?: [\040\t] |  \(
1094(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1095\)  )*  \.                        # if led by a period...
1096(?: [\040\t] |  \(
1097(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1098\)  )*   (?:
1099[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1100(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1101|   \[                         # [
1102(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
1103\]                        #           ]
1104)                     #   ...further okay
1105)*
1106#       address spec
1107(?: [\040\t] |  \(
1108(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1109\)  )*  > #                  trailing >
1110# name and address
1111)  (?: [\040\t] |  \(
1112(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
1113\)  )*                       # optional trailing comment
1114/x
1115    Alan Other <user\@dom.ain>
1116 0: Alan Other <user@dom.ain>
1117    <user\@dom.ain>
1118 0: user@dom.ain
1119    user\@dom.ain
1120 0: user@dom.ain
1121    \"A. Other\" <user.1234\@dom.ain> (a comment)
1122 0: "A. Other" <user.1234@dom.ain> (a comment)
1123    A. Other <user.1234\@dom.ain> (a comment)
1124 0:  Other <user.1234@dom.ain> (a comment)
1125    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
1126 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
1127    A missing angle <user\@some.where
1128 0: user@some.where
1129\= Expect no match
1130    The quick brown fox
1131No match
1132
1133/[\040\t]*                    # Nab whitespace.
1134(?:
1135\(                              #  (
1136[^\\\x80-\xff\n\015()] *                             #     normal*
1137(?:                                 #       (
1138(?:  \\ [^\x80-\xff]  |
1139\(                            #  (
1140[^\\\x80-\xff\n\015()] *                            #     normal*
1141(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1142\)                           #                       )
1143)    #         special
1144[^\\\x80-\xff\n\015()] *                         #         normal*
1145)*                                  #            )*
1146\)                             #                )
1147[\040\t]* )*    # If comment found, allow more spaces.
1148# optional leading comment
1149(?:
1150(?:
1151[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1152(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1153# Atom
1154|                       #  or
1155"                                     # "
1156[^\\\x80-\xff\n\015"] *                            #   normal
1157(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
1158"                                     #        "
1159# Quoted string
1160)
1161[\040\t]*                    # Nab whitespace.
1162(?:
1163\(                              #  (
1164[^\\\x80-\xff\n\015()] *                             #     normal*
1165(?:                                 #       (
1166(?:  \\ [^\x80-\xff]  |
1167\(                            #  (
1168[^\\\x80-\xff\n\015()] *                            #     normal*
1169(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1170\)                           #                       )
1171)    #         special
1172[^\\\x80-\xff\n\015()] *                         #         normal*
1173)*                                  #            )*
1174\)                             #                )
1175[\040\t]* )*    # If comment found, allow more spaces.
1176(?:
1177\.
1178[\040\t]*                    # Nab whitespace.
1179(?:
1180\(                              #  (
1181[^\\\x80-\xff\n\015()] *                             #     normal*
1182(?:                                 #       (
1183(?:  \\ [^\x80-\xff]  |
1184\(                            #  (
1185[^\\\x80-\xff\n\015()] *                            #     normal*
1186(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1187\)                           #                       )
1188)    #         special
1189[^\\\x80-\xff\n\015()] *                         #         normal*
1190)*                                  #            )*
1191\)                             #                )
1192[\040\t]* )*    # If comment found, allow more spaces.
1193(?:
1194[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1195(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1196# Atom
1197|                       #  or
1198"                                     # "
1199[^\\\x80-\xff\n\015"] *                            #   normal
1200(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
1201"                                     #        "
1202# Quoted string
1203)
1204[\040\t]*                    # Nab whitespace.
1205(?:
1206\(                              #  (
1207[^\\\x80-\xff\n\015()] *                             #     normal*
1208(?:                                 #       (
1209(?:  \\ [^\x80-\xff]  |
1210\(                            #  (
1211[^\\\x80-\xff\n\015()] *                            #     normal*
1212(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1213\)                           #                       )
1214)    #         special
1215[^\\\x80-\xff\n\015()] *                         #         normal*
1216)*                                  #            )*
1217\)                             #                )
1218[\040\t]* )*    # If comment found, allow more spaces.
1219# additional words
1220)*
1221@
1222[\040\t]*                    # Nab whitespace.
1223(?:
1224\(                              #  (
1225[^\\\x80-\xff\n\015()] *                             #     normal*
1226(?:                                 #       (
1227(?:  \\ [^\x80-\xff]  |
1228\(                            #  (
1229[^\\\x80-\xff\n\015()] *                            #     normal*
1230(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1231\)                           #                       )
1232)    #         special
1233[^\\\x80-\xff\n\015()] *                         #         normal*
1234)*                                  #            )*
1235\)                             #                )
1236[\040\t]* )*    # If comment found, allow more spaces.
1237(?:
1238[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1239(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1240|
1241\[                            # [
1242(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1243\]                           #           ]
1244)
1245[\040\t]*                    # Nab whitespace.
1246(?:
1247\(                              #  (
1248[^\\\x80-\xff\n\015()] *                             #     normal*
1249(?:                                 #       (
1250(?:  \\ [^\x80-\xff]  |
1251\(                            #  (
1252[^\\\x80-\xff\n\015()] *                            #     normal*
1253(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1254\)                           #                       )
1255)    #         special
1256[^\\\x80-\xff\n\015()] *                         #         normal*
1257)*                                  #            )*
1258\)                             #                )
1259[\040\t]* )*    # If comment found, allow more spaces.
1260# optional trailing comments
1261(?:
1262\.
1263[\040\t]*                    # Nab whitespace.
1264(?:
1265\(                              #  (
1266[^\\\x80-\xff\n\015()] *                             #     normal*
1267(?:                                 #       (
1268(?:  \\ [^\x80-\xff]  |
1269\(                            #  (
1270[^\\\x80-\xff\n\015()] *                            #     normal*
1271(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1272\)                           #                       )
1273)    #         special
1274[^\\\x80-\xff\n\015()] *                         #         normal*
1275)*                                  #            )*
1276\)                             #                )
1277[\040\t]* )*    # If comment found, allow more spaces.
1278(?:
1279[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1280(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1281|
1282\[                            # [
1283(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1284\]                           #           ]
1285)
1286[\040\t]*                    # Nab whitespace.
1287(?:
1288\(                              #  (
1289[^\\\x80-\xff\n\015()] *                             #     normal*
1290(?:                                 #       (
1291(?:  \\ [^\x80-\xff]  |
1292\(                            #  (
1293[^\\\x80-\xff\n\015()] *                            #     normal*
1294(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1295\)                           #                       )
1296)    #         special
1297[^\\\x80-\xff\n\015()] *                         #         normal*
1298)*                                  #            )*
1299\)                             #                )
1300[\040\t]* )*    # If comment found, allow more spaces.
1301# optional trailing comments
1302)*
1303# address
1304|                             #  or
1305(?:
1306[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1307(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1308# Atom
1309|                       #  or
1310"                                     # "
1311[^\\\x80-\xff\n\015"] *                            #   normal
1312(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
1313"                                     #        "
1314# Quoted string
1315)
1316# leading word
1317[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *               # "normal" atoms and or spaces
1318(?:
1319(?:
1320\(                              #  (
1321[^\\\x80-\xff\n\015()] *                             #     normal*
1322(?:                                 #       (
1323(?:  \\ [^\x80-\xff]  |
1324\(                            #  (
1325[^\\\x80-\xff\n\015()] *                            #     normal*
1326(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1327\)                           #                       )
1328)    #         special
1329[^\\\x80-\xff\n\015()] *                         #         normal*
1330)*                                  #            )*
1331\)                             #                )
1332|
1333"                                     # "
1334[^\\\x80-\xff\n\015"] *                            #   normal
1335(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
1336"                                     #        "
1337) # "special" comment or quoted string
1338[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *            #  more "normal"
1339)*
1340<
1341[\040\t]*                    # Nab whitespace.
1342(?:
1343\(                              #  (
1344[^\\\x80-\xff\n\015()] *                             #     normal*
1345(?:                                 #       (
1346(?:  \\ [^\x80-\xff]  |
1347\(                            #  (
1348[^\\\x80-\xff\n\015()] *                            #     normal*
1349(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1350\)                           #                       )
1351)    #         special
1352[^\\\x80-\xff\n\015()] *                         #         normal*
1353)*                                  #            )*
1354\)                             #                )
1355[\040\t]* )*    # If comment found, allow more spaces.
1356# <
1357(?:
1358@
1359[\040\t]*                    # Nab whitespace.
1360(?:
1361\(                              #  (
1362[^\\\x80-\xff\n\015()] *                             #     normal*
1363(?:                                 #       (
1364(?:  \\ [^\x80-\xff]  |
1365\(                            #  (
1366[^\\\x80-\xff\n\015()] *                            #     normal*
1367(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1368\)                           #                       )
1369)    #         special
1370[^\\\x80-\xff\n\015()] *                         #         normal*
1371)*                                  #            )*
1372\)                             #                )
1373[\040\t]* )*    # If comment found, allow more spaces.
1374(?:
1375[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1376(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1377|
1378\[                            # [
1379(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1380\]                           #           ]
1381)
1382[\040\t]*                    # Nab whitespace.
1383(?:
1384\(                              #  (
1385[^\\\x80-\xff\n\015()] *                             #     normal*
1386(?:                                 #       (
1387(?:  \\ [^\x80-\xff]  |
1388\(                            #  (
1389[^\\\x80-\xff\n\015()] *                            #     normal*
1390(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1391\)                           #                       )
1392)    #         special
1393[^\\\x80-\xff\n\015()] *                         #         normal*
1394)*                                  #            )*
1395\)                             #                )
1396[\040\t]* )*    # If comment found, allow more spaces.
1397# optional trailing comments
1398(?:
1399\.
1400[\040\t]*                    # Nab whitespace.
1401(?:
1402\(                              #  (
1403[^\\\x80-\xff\n\015()] *                             #     normal*
1404(?:                                 #       (
1405(?:  \\ [^\x80-\xff]  |
1406\(                            #  (
1407[^\\\x80-\xff\n\015()] *                            #     normal*
1408(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1409\)                           #                       )
1410)    #         special
1411[^\\\x80-\xff\n\015()] *                         #         normal*
1412)*                                  #            )*
1413\)                             #                )
1414[\040\t]* )*    # If comment found, allow more spaces.
1415(?:
1416[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1417(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1418|
1419\[                            # [
1420(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1421\]                           #           ]
1422)
1423[\040\t]*                    # Nab whitespace.
1424(?:
1425\(                              #  (
1426[^\\\x80-\xff\n\015()] *                             #     normal*
1427(?:                                 #       (
1428(?:  \\ [^\x80-\xff]  |
1429\(                            #  (
1430[^\\\x80-\xff\n\015()] *                            #     normal*
1431(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1432\)                           #                       )
1433)    #         special
1434[^\\\x80-\xff\n\015()] *                         #         normal*
1435)*                                  #            )*
1436\)                             #                )
1437[\040\t]* )*    # If comment found, allow more spaces.
1438# optional trailing comments
1439)*
1440(?: ,
1441[\040\t]*                    # Nab whitespace.
1442(?:
1443\(                              #  (
1444[^\\\x80-\xff\n\015()] *                             #     normal*
1445(?:                                 #       (
1446(?:  \\ [^\x80-\xff]  |
1447\(                            #  (
1448[^\\\x80-\xff\n\015()] *                            #     normal*
1449(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1450\)                           #                       )
1451)    #         special
1452[^\\\x80-\xff\n\015()] *                         #         normal*
1453)*                                  #            )*
1454\)                             #                )
1455[\040\t]* )*    # If comment found, allow more spaces.
1456@
1457[\040\t]*                    # Nab whitespace.
1458(?:
1459\(                              #  (
1460[^\\\x80-\xff\n\015()] *                             #     normal*
1461(?:                                 #       (
1462(?:  \\ [^\x80-\xff]  |
1463\(                            #  (
1464[^\\\x80-\xff\n\015()] *                            #     normal*
1465(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1466\)                           #                       )
1467)    #         special
1468[^\\\x80-\xff\n\015()] *                         #         normal*
1469)*                                  #            )*
1470\)                             #                )
1471[\040\t]* )*    # If comment found, allow more spaces.
1472(?:
1473[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1474(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1475|
1476\[                            # [
1477(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1478\]                           #           ]
1479)
1480[\040\t]*                    # Nab whitespace.
1481(?:
1482\(                              #  (
1483[^\\\x80-\xff\n\015()] *                             #     normal*
1484(?:                                 #       (
1485(?:  \\ [^\x80-\xff]  |
1486\(                            #  (
1487[^\\\x80-\xff\n\015()] *                            #     normal*
1488(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1489\)                           #                       )
1490)    #         special
1491[^\\\x80-\xff\n\015()] *                         #         normal*
1492)*                                  #            )*
1493\)                             #                )
1494[\040\t]* )*    # If comment found, allow more spaces.
1495# optional trailing comments
1496(?:
1497\.
1498[\040\t]*                    # Nab whitespace.
1499(?:
1500\(                              #  (
1501[^\\\x80-\xff\n\015()] *                             #     normal*
1502(?:                                 #       (
1503(?:  \\ [^\x80-\xff]  |
1504\(                            #  (
1505[^\\\x80-\xff\n\015()] *                            #     normal*
1506(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1507\)                           #                       )
1508)    #         special
1509[^\\\x80-\xff\n\015()] *                         #         normal*
1510)*                                  #            )*
1511\)                             #                )
1512[\040\t]* )*    # If comment found, allow more spaces.
1513(?:
1514[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1515(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1516|
1517\[                            # [
1518(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1519\]                           #           ]
1520)
1521[\040\t]*                    # Nab whitespace.
1522(?:
1523\(                              #  (
1524[^\\\x80-\xff\n\015()] *                             #     normal*
1525(?:                                 #       (
1526(?:  \\ [^\x80-\xff]  |
1527\(                            #  (
1528[^\\\x80-\xff\n\015()] *                            #     normal*
1529(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1530\)                           #                       )
1531)    #         special
1532[^\\\x80-\xff\n\015()] *                         #         normal*
1533)*                                  #            )*
1534\)                             #                )
1535[\040\t]* )*    # If comment found, allow more spaces.
1536# optional trailing comments
1537)*
1538)*  # additional domains
1539:
1540[\040\t]*                    # Nab whitespace.
1541(?:
1542\(                              #  (
1543[^\\\x80-\xff\n\015()] *                             #     normal*
1544(?:                                 #       (
1545(?:  \\ [^\x80-\xff]  |
1546\(                            #  (
1547[^\\\x80-\xff\n\015()] *                            #     normal*
1548(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1549\)                           #                       )
1550)    #         special
1551[^\\\x80-\xff\n\015()] *                         #         normal*
1552)*                                  #            )*
1553\)                             #                )
1554[\040\t]* )*    # If comment found, allow more spaces.
1555# optional trailing comments
1556)?     #       optional route
1557(?:
1558[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1559(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1560# Atom
1561|                       #  or
1562"                                     # "
1563[^\\\x80-\xff\n\015"] *                            #   normal
1564(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
1565"                                     #        "
1566# Quoted string
1567)
1568[\040\t]*                    # Nab whitespace.
1569(?:
1570\(                              #  (
1571[^\\\x80-\xff\n\015()] *                             #     normal*
1572(?:                                 #       (
1573(?:  \\ [^\x80-\xff]  |
1574\(                            #  (
1575[^\\\x80-\xff\n\015()] *                            #     normal*
1576(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1577\)                           #                       )
1578)    #         special
1579[^\\\x80-\xff\n\015()] *                         #         normal*
1580)*                                  #            )*
1581\)                             #                )
1582[\040\t]* )*    # If comment found, allow more spaces.
1583(?:
1584\.
1585[\040\t]*                    # Nab whitespace.
1586(?:
1587\(                              #  (
1588[^\\\x80-\xff\n\015()] *                             #     normal*
1589(?:                                 #       (
1590(?:  \\ [^\x80-\xff]  |
1591\(                            #  (
1592[^\\\x80-\xff\n\015()] *                            #     normal*
1593(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1594\)                           #                       )
1595)    #         special
1596[^\\\x80-\xff\n\015()] *                         #         normal*
1597)*                                  #            )*
1598\)                             #                )
1599[\040\t]* )*    # If comment found, allow more spaces.
1600(?:
1601[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1602(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1603# Atom
1604|                       #  or
1605"                                     # "
1606[^\\\x80-\xff\n\015"] *                            #   normal
1607(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
1608"                                     #        "
1609# Quoted string
1610)
1611[\040\t]*                    # Nab whitespace.
1612(?:
1613\(                              #  (
1614[^\\\x80-\xff\n\015()] *                             #     normal*
1615(?:                                 #       (
1616(?:  \\ [^\x80-\xff]  |
1617\(                            #  (
1618[^\\\x80-\xff\n\015()] *                            #     normal*
1619(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1620\)                           #                       )
1621)    #         special
1622[^\\\x80-\xff\n\015()] *                         #         normal*
1623)*                                  #            )*
1624\)                             #                )
1625[\040\t]* )*    # If comment found, allow more spaces.
1626# additional words
1627)*
1628@
1629[\040\t]*                    # Nab whitespace.
1630(?:
1631\(                              #  (
1632[^\\\x80-\xff\n\015()] *                             #     normal*
1633(?:                                 #       (
1634(?:  \\ [^\x80-\xff]  |
1635\(                            #  (
1636[^\\\x80-\xff\n\015()] *                            #     normal*
1637(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1638\)                           #                       )
1639)    #         special
1640[^\\\x80-\xff\n\015()] *                         #         normal*
1641)*                                  #            )*
1642\)                             #                )
1643[\040\t]* )*    # If comment found, allow more spaces.
1644(?:
1645[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1646(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1647|
1648\[                            # [
1649(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1650\]                           #           ]
1651)
1652[\040\t]*                    # Nab whitespace.
1653(?:
1654\(                              #  (
1655[^\\\x80-\xff\n\015()] *                             #     normal*
1656(?:                                 #       (
1657(?:  \\ [^\x80-\xff]  |
1658\(                            #  (
1659[^\\\x80-\xff\n\015()] *                            #     normal*
1660(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1661\)                           #                       )
1662)    #         special
1663[^\\\x80-\xff\n\015()] *                         #         normal*
1664)*                                  #            )*
1665\)                             #                )
1666[\040\t]* )*    # If comment found, allow more spaces.
1667# optional trailing comments
1668(?:
1669\.
1670[\040\t]*                    # Nab whitespace.
1671(?:
1672\(                              #  (
1673[^\\\x80-\xff\n\015()] *                             #     normal*
1674(?:                                 #       (
1675(?:  \\ [^\x80-\xff]  |
1676\(                            #  (
1677[^\\\x80-\xff\n\015()] *                            #     normal*
1678(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1679\)                           #                       )
1680)    #         special
1681[^\\\x80-\xff\n\015()] *                         #         normal*
1682)*                                  #            )*
1683\)                             #                )
1684[\040\t]* )*    # If comment found, allow more spaces.
1685(?:
1686[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
1687(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1688|
1689\[                            # [
1690(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
1691\]                           #           ]
1692)
1693[\040\t]*                    # Nab whitespace.
1694(?:
1695\(                              #  (
1696[^\\\x80-\xff\n\015()] *                             #     normal*
1697(?:                                 #       (
1698(?:  \\ [^\x80-\xff]  |
1699\(                            #  (
1700[^\\\x80-\xff\n\015()] *                            #     normal*
1701(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
1702\)                           #                       )
1703)    #         special
1704[^\\\x80-\xff\n\015()] *                         #         normal*
1705)*                                  #            )*
1706\)                             #                )
1707[\040\t]* )*    # If comment found, allow more spaces.
1708# optional trailing comments
1709)*
1710#       address spec
1711>                    #                 >
1712# name and address
1713)
1714/x
1715    Alan Other <user\@dom.ain>
1716 0: Alan Other <user@dom.ain>
1717    <user\@dom.ain>
1718 0: user@dom.ain
1719    user\@dom.ain
1720 0: user@dom.ain
1721    \"A. Other\" <user.1234\@dom.ain> (a comment)
1722 0: "A. Other" <user.1234@dom.ain>
1723    A. Other <user.1234\@dom.ain> (a comment)
1724 0:  Other <user.1234@dom.ain>
1725    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
1726 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
1727    A missing angle <user\@some.where
1728 0: user@some.where
1729\= Expect no match
1730    The quick brown fox
1731No match
1732
1733/abc\0def\00pqr\000xyz\0000AB/
1734    abc\0def\00pqr\000xyz\0000AB
1735 0: abc\x00def\x00pqr\x00xyz\x000AB
1736    abc456 abc\0def\00pqr\000xyz\0000ABCDE
1737 0: abc\x00def\x00pqr\x00xyz\x000AB
1738
1739/abc\x0def\x00pqr\x000xyz\x0000AB/
1740    abc\x0def\x00pqr\x000xyz\x0000AB
1741 0: abc\x0def\x00pqr\x000xyz\x0000AB
1742    abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
1743 0: abc\x0def\x00pqr\x000xyz\x0000AB
1744
1745/^[\000-\037]/
1746    \0A
1747 0: \x00
1748    \01B
1749 0: \x01
1750    \037C
1751 0: \x1f
1752
1753#.NET doesn't do octal with 1 number
1754
1755/^(cow|)\1(bell)/
1756    cowcowbell
1757 0: cowcowbell
1758 1: cow
1759 2: bell
1760    bell
1761 0: bell
1762 1:
1763 2: bell
1764\= Expect no match
1765    cowbell
1766No match
1767
1768/^\s/
1769    \040abc
1770 0:
1771    \x0cabc
1772 0: \x0c
1773    \nabc
1774 0: \x0a
1775    \rabc
1776 0: \x0d
1777    \tabc
1778 0: \x09
1779\= Expect no match
1780    abc
1781No match
1782
1783/^a	b
1784      c/x
1785    abc
1786 0: abc
1787
1788/^(a|)\1*b/
1789    ab
1790 0: ab
1791 1: a
1792    aaaab
1793 0: aaaab
1794 1: a
1795    b
1796 0: b
1797 1:
1798\= Expect no match
1799    acb
1800No match
1801
1802/^(a|)\1+b/
1803    aab
1804 0: aab
1805 1: a
1806    aaaab
1807 0: aaaab
1808 1: a
1809    b
1810 0: b
1811 1:
1812\= Expect no match
1813    ab
1814No match
1815
1816/^(a|)\1?b/
1817    ab
1818 0: ab
1819 1: a
1820    aab
1821 0: aab
1822 1: a
1823    b
1824 0: b
1825 1:
1826\= Expect no match
1827    acb
1828No match
1829
1830/^(a|)\1{2}b/
1831    aaab
1832 0: aaab
1833 1: a
1834    b
1835 0: b
1836 1:
1837\= Expect no match
1838    ab
1839No match
1840    aab
1841No match
1842    aaaab
1843No match
1844
1845/^(a|)\1{2,3}b/
1846    aaab
1847 0: aaab
1848 1: a
1849    aaaab
1850 0: aaaab
1851 1: a
1852    b
1853 0: b
1854 1:
1855\= Expect no match
1856    ab
1857No match
1858    aab
1859No match
1860    aaaaab
1861No match
1862
1863/ab{1,3}bc/
1864    abbbbc
1865 0: abbbbc
1866    abbbc
1867 0: abbbc
1868    abbc
1869 0: abbc
1870\= Expect no match
1871    abc
1872No match
1873    abbbbbc
1874No match
1875
1876/([^.]*)\.([^:]*):[T ]+(.*)/
1877    track1.title:TBlah blah blah
1878 0: track1.title:TBlah blah blah
1879 1: track1
1880 2: title
1881 3: Blah blah blah
1882
1883/([^.]*)\.([^:]*):[T ]+(.*)/i
1884    track1.title:TBlah blah blah
1885 0: track1.title:TBlah blah blah
1886 1: track1
1887 2: title
1888 3: Blah blah blah
1889
1890/([^.]*)\.([^:]*):[t ]+(.*)/i
1891    track1.title:TBlah blah blah
1892 0: track1.title:TBlah blah blah
1893 1: track1
1894 2: title
1895 3: Blah blah blah
1896
1897/^[W-c]+$/
1898    WXY_^abc
1899 0: WXY_^abc
1900\= Expect no match
1901    wxy
1902No match
1903
1904/^[W-c]+$/i
1905    WXY_^abc
1906 0: WXY_^abc
1907    wxy_^ABC
1908 0: wxy_^ABC
1909
1910/^[\x3f-\x5F]+$/i
1911    WXY_^abc
1912 0: WXY_^abc
1913    wxy_^ABC
1914 0: wxy_^ABC
1915
1916/^abc$/m
1917    abc
1918 0: abc
1919    qqq\nabc
1920 0: abc
1921    abc\nzzz
1922 0: abc
1923    qqq\nabc\nzzz
1924 0: abc
1925
1926/^abc$/
1927    abc
1928 0: abc
1929\= Expect no match
1930    qqq\nabc
1931No match
1932    abc\nzzz
1933No match
1934    qqq\nabc\nzzz
1935No match
1936
1937/\Aabc\Z/m
1938    abc
1939 0: abc
1940    abc\n
1941 0: abc
1942\= Expect no match
1943    qqq\nabc
1944No match
1945    abc\nzzz
1946No match
1947    qqq\nabc\nzzz
1948No match
1949
1950/\A(.)*\Z/s
1951    abc\ndef
1952 0: abc\x0adef
1953 1: f
1954
1955/\A(.)*\Z/m
1956\= Expect no match
1957    abc\ndef
1958No match
1959
1960/(?:b)|(?::+)/
1961    b::c
1962 0: b
1963    c::b
1964 0: ::
1965
1966/[-az]+/
1967    az-
1968 0: az-
1969\= Expect no match
1970    b
1971No match
1972
1973/[az-]+/
1974    za-
1975 0: za-
1976\= Expect no match
1977    b
1978No match
1979
1980/[a\-z]+/
1981    a-z
1982 0: a-z
1983\= Expect no match
1984    b
1985No match
1986
1987/[a-z]+/
1988    abcdxyz
1989 0: abcdxyz
1990
1991/[\d-]+/
1992    12-34
1993 0: 12-34
1994\= Expect no match
1995    aaa
1996No match
1997
1998/[\d-z]+/
1999    12-34z
2000 0: 12-34z
2001\= Expect no match
2002    aaa
2003No match
2004
2005/\x5c/
2006    \\
2007 0: \
2008
2009/\x20Z/
2010    the Zoo
2011 0:  Z
2012\= Expect no match
2013    Zulu
2014No match
2015
2016/(abc)\1/i
2017    abcabc
2018 0: abcabc
2019 1: abc
2020    ABCabc
2021 0: ABCabc
2022 1: ABC
2023    abcABC
2024 0: abcABC
2025 1: abc
2026
2027/abc$/
2028    abc
2029 0: abc
2030    abc\n
2031 0: abc
2032\= Expect no match
2033    abc\ndef
2034No match
2035
2036/(abc)\123/
2037    abc\x53
2038 0: abcS
2039 1: abc
2040
2041/(abc)\100/
2042    abc\x40
2043 0: abc@
2044 1: abc
2045    abc\100
2046 0: abc@
2047 1: abc
2048
2049/(abc)\1000/
2050    abc\x400
2051 0: abc@0
2052 1: abc
2053    abc\x40\x30
2054 0: abc@0
2055 1: abc
2056    abc\1000
2057 0: abc@0
2058 1: abc
2059    abc\100\x30
2060 0: abc@0
2061 1: abc
2062    abc\100\060
2063 0: abc@0
2064 1: abc
2065    abc\100\60
2066 0: abc@0
2067 1: abc
2068
2069/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/
2070    ABCDEFGHIHI
2071 0: ABCDEFGHIHI
2072 1: A
2073 2: B
2074 3: C
2075 4: D
2076 5: E
2077 6: F
2078 7: G
2079 8: H
2080 9: I
2081
2082/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
2083    abcdefghijkllS
2084 0: abcdefghijkllS
2085 1: a
2086 2: b
2087 3: c
2088 4: d
2089 5: e
2090 6: f
2091 7: g
2092 8: h
2093 9: i
209410: j
209511: k
209612: l
2097
2098/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
2099    abcdefghijk\12S
2100 0: abcdefghijk\x0aS
2101 1: a
2102 2: b
2103 3: c
2104 4: d
2105 5: e
2106 6: f
2107 7: g
2108 8: h
2109 9: i
211010: j
211111: k
2112
2113/a{0}bc/
2114    bc
2115 0: bc
2116
2117/(a|(bc)){0,0}?xyz/
2118    xyz
2119 0: xyz
2120
2121/abc[\10]de/
2122    abc\010de
2123 0: abc\x08de
2124
2125/abc[\1]de/
2126    abc\1de
2127 0: abc\x01de
2128
2129/(abc)[\1]de/
2130    abc\1de
2131 0: abc\x01de
2132 1: abc
2133
2134/(?s)a.b/
2135    a\nb
2136 0: a\x0ab
2137
2138/^([^a])([^\b])([^c]*)([^d]{3,4})/
2139    baNOTccccd
2140 0: baNOTcccc
2141 1: b
2142 2: a
2143 3: NOT
2144 4: cccc
2145    baNOTcccd
2146 0: baNOTccc
2147 1: b
2148 2: a
2149 3: NOT
2150 4: ccc
2151    baNOTccd
2152 0: baNOTcc
2153 1: b
2154 2: a
2155 3: NO
2156 4: Tcc
2157    bacccd
2158 0: baccc
2159 1: b
2160 2: a
2161 3:
2162 4: ccc
2163\= Expect no match
2164    anything
2165No match
2166    b\bc
2167No match
2168    baccd
2169No match
2170
2171/[^a]/
2172    Abc
2173 0: A
2174
2175/[^a]/i
2176    Abc
2177 0: b
2178
2179/[^a]+/
2180    AAAaAbc
2181 0: AAA
2182
2183/[^a]+/i
2184    AAAaAbc
2185 0: bc
2186
2187/[^a]+/
2188    bbb\nccc
2189 0: bbb\x0accc
2190
2191/[^k]$/
2192    abc
2193 0: c
2194\= Expect no match
2195    abk
2196No match
2197
2198/[^k]{2,3}$/
2199    abc
2200 0: abc
2201    kbc
2202 0: bc
2203    kabc
2204 0: abc
2205\= Expect no match
2206    abk
2207No match
2208    akb
2209No match
2210    akk
2211No match
2212
2213/^\d{8,}\@.+[^k]$/
2214    12345678\@a.b.c.d
2215 0: 12345678@a.b.c.d
2216    123456789\@x.y.z
2217 0: 123456789@x.y.z
2218\= Expect no match
2219    12345678\@x.y.uk
2220No match
2221    1234567\@a.b.c.d
2222No match
2223
2224/(a)\1{8,}/
2225    aaaaaaaaa
2226 0: aaaaaaaaa
2227 1: a
2228    aaaaaaaaaa
2229 0: aaaaaaaaaa
2230 1: a
2231\= Expect no match
2232    aaaaaaa
2233No match
2234
2235/[^a]/
2236    aaaabcd
2237 0: b
2238    aaAabcd
2239 0: A
2240
2241/[^a]/i
2242    aaaabcd
2243 0: b
2244    aaAabcd
2245 0: b
2246
2247/[^az]/
2248    aaaabcd
2249 0: b
2250    aaAabcd
2251 0: A
2252
2253/[^az]/i
2254    aaaabcd
2255 0: b
2256    aaAabcd
2257 0: b
2258
2259# trimmed upper ascii since Go is UTF-8
2260/\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/
2261    \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
2262 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f
2263
2264/P[^*]TAIRE[^*]{1,6}?LL/
2265    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
2266 0: PSTAIREISLL
2267
2268/P[^*]TAIRE[^*]{1,}?LL/
2269    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
2270 0: PSTAIREISLL
2271
2272/(\.\d\d[1-9]?)\d+/
2273    1.230003938
2274 0: .230003938
2275 1: .23
2276    1.875000282
2277 0: .875000282
2278 1: .875
2279    1.235
2280 0: .235
2281 1: .23
2282
2283/(\.\d\d((?=0)|\d(?=\d)))/
2284    1.230003938
2285 0: .23
2286 1: .23
2287 2:
2288    1.875000282
2289 0: .875
2290 1: .875
2291 2: 5
2292\= Expect no match
2293    1.235
2294No match
2295
2296/\b(foo)\s+(\w+)/i
2297    Food is on the foo table
2298 0: foo table
2299 1: foo
2300 2: table
2301
2302/foo(.*)bar/
2303    The food is under the bar in the barn.
2304 0: food is under the bar in the bar
2305 1: d is under the bar in the
2306
2307/foo(.*?)bar/
2308    The food is under the bar in the barn.
2309 0: food is under the bar
2310 1: d is under the
2311
2312/(.*)(\d*)/
2313    I have 2 numbers: 53147
2314 0: I have 2 numbers: 53147
2315 1: I have 2 numbers: 53147
2316 2:
2317
2318/(.*)(\d+)/
2319    I have 2 numbers: 53147
2320 0: I have 2 numbers: 53147
2321 1: I have 2 numbers: 5314
2322 2: 7
2323
2324/(.*?)(\d*)/
2325    I have 2 numbers: 53147
2326 0:
2327 1:
2328 2:
2329
2330/(.*?)(\d+)/
2331    I have 2 numbers: 53147
2332 0: I have 2
2333 1: I have
2334 2: 2
2335
2336/(.*)(\d+)$/
2337    I have 2 numbers: 53147
2338 0: I have 2 numbers: 53147
2339 1: I have 2 numbers: 5314
2340 2: 7
2341
2342/(.*?)(\d+)$/
2343    I have 2 numbers: 53147
2344 0: I have 2 numbers: 53147
2345 1: I have 2 numbers:
2346 2: 53147
2347
2348/(.*)\b(\d+)$/
2349    I have 2 numbers: 53147
2350 0: I have 2 numbers: 53147
2351 1: I have 2 numbers:
2352 2: 53147
2353
2354/(.*\D)(\d+)$/
2355    I have 2 numbers: 53147
2356 0: I have 2 numbers: 53147
2357 1: I have 2 numbers:
2358 2: 53147
2359
2360/^\D*(?!123)/
2361    ABC123
2362 0: AB
2363
2364/^(\D*)(?=\d)(?!123)/
2365    ABC445
2366 0: ABC
2367 1: ABC
2368\= Expect no match
2369    ABC123
2370No match
2371
2372/^[W-]46]/
2373    W46]789
2374 0: W46]
2375    -46]789
2376 0: -46]
2377\= Expect no match
2378    Wall
2379No match
2380    Zebra
2381No match
2382    42
2383No match
2384    [abcd]
2385No match
2386    ]abcd[
2387No match
2388
2389/^[W-\]46]/
2390    W46]789
2391 0: W
2392    Wall
2393 0: W
2394    Zebra
2395 0: Z
2396    Xylophone
2397 0: X
2398    42
2399 0: 4
2400    [abcd]
2401 0: [
2402    ]abcd[
2403 0: ]
2404    \\backslash
2405 0: \
2406\= Expect no match
2407    -46]789
2408No match
2409    well
2410No match
2411
2412/\d\d\/\d\d\/\d\d\d\d/
2413    01/01/2000
2414 0: 01/01/2000
2415
2416/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
2417    word cat dog elephant mussel cow horse canary baboon snake shark otherword
2418 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
2419\= Expect no match
2420    word cat dog elephant mussel cow horse canary baboon snake shark
2421No match
2422
2423/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
2424\= Expect no match
2425    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
2426No match
2427
2428/^(a){0,0}/
2429    bcd
2430 0:
2431    abc
2432 0:
2433    aab
2434 0:
2435
2436/^(a){0,1}/
2437    bcd
2438 0:
2439    abc
2440 0: a
2441 1: a
2442    aab
2443 0: a
2444 1: a
2445
2446/^(a){0,2}/
2447    bcd
2448 0:
2449    abc
2450 0: a
2451 1: a
2452    aab
2453 0: aa
2454 1: a
2455
2456/^(a){0,3}/
2457    bcd
2458 0:
2459    abc
2460 0: a
2461 1: a
2462    aab
2463 0: aa
2464 1: a
2465    aaa
2466 0: aaa
2467 1: a
2468
2469/^(a){0,}/
2470    bcd
2471 0:
2472    abc
2473 0: a
2474 1: a
2475    aab
2476 0: aa
2477 1: a
2478    aaa
2479 0: aaa
2480 1: a
2481    aaaaaaaa
2482 0: aaaaaaaa
2483 1: a
2484
2485/^(a){1,1}/
2486    abc
2487 0: a
2488 1: a
2489    aab
2490 0: a
2491 1: a
2492\= Expect no match
2493    bcd
2494No match
2495
2496/^(a){1,2}/
2497    abc
2498 0: a
2499 1: a
2500    aab
2501 0: aa
2502 1: a
2503\= Expect no match
2504    bcd
2505No match
2506
2507/^(a){1,3}/
2508    abc
2509 0: a
2510 1: a
2511    aab
2512 0: aa
2513 1: a
2514    aaa
2515 0: aaa
2516 1: a
2517\= Expect no match
2518    bcd
2519No match
2520
2521/^(a){1,}/
2522    abc
2523 0: a
2524 1: a
2525    aab
2526 0: aa
2527 1: a
2528    aaa
2529 0: aaa
2530 1: a
2531    aaaaaaaa
2532 0: aaaaaaaa
2533 1: a
2534\= Expect no match
2535    bcd
2536No match
2537
2538/.*\.gif/
2539    borfle\nbib.gif\nno
2540 0: bib.gif
2541
2542/.{0,}\.gif/
2543    borfle\nbib.gif\nno
2544 0: bib.gif
2545
2546/.*\.gif/m
2547    borfle\nbib.gif\nno
2548 0: bib.gif
2549
2550/.*\.gif/s
2551    borfle\nbib.gif\nno
2552 0: borfle\x0abib.gif
2553
2554/.*\.gif/ms
2555    borfle\nbib.gif\nno
2556 0: borfle\x0abib.gif
2557
2558/.*$/
2559    borfle\nbib.gif\nno
2560 0: no
2561
2562/.*$/m
2563    borfle\nbib.gif\nno
2564 0: borfle
2565
2566/.*$/s
2567    borfle\nbib.gif\nno
2568 0: borfle\x0abib.gif\x0ano
2569
2570/.*$/ms
2571    borfle\nbib.gif\nno
2572 0: borfle\x0abib.gif\x0ano
2573
2574/.*$/
2575    borfle\nbib.gif\nno\n
2576 0: no
2577
2578/.*$/m
2579    borfle\nbib.gif\nno\n
2580 0: borfle
2581
2582/.*$/s
2583    borfle\nbib.gif\nno\n
2584 0: borfle\x0abib.gif\x0ano\x0a
2585
2586/.*$/ms
2587    borfle\nbib.gif\nno\n
2588 0: borfle\x0abib.gif\x0ano\x0a
2589
2590/(.*X|^B)/
2591    abcde\n1234Xyz
2592 0: 1234X
2593 1: 1234X
2594    BarFoo
2595 0: B
2596 1: B
2597\= Expect no match
2598    abcde\nBar
2599No match
2600
2601/(.*X|^B)/m
2602    abcde\n1234Xyz
2603 0: 1234X
2604 1: 1234X
2605    BarFoo
2606 0: B
2607 1: B
2608    abcde\nBar
2609 0: B
2610 1: B
2611
2612/(.*X|^B)/s
2613    abcde\n1234Xyz
2614 0: abcde\x0a1234X
2615 1: abcde\x0a1234X
2616    BarFoo
2617 0: B
2618 1: B
2619\= Expect no match
2620    abcde\nBar
2621No match
2622
2623/(.*X|^B)/ms
2624    abcde\n1234Xyz
2625 0: abcde\x0a1234X
2626 1: abcde\x0a1234X
2627    BarFoo
2628 0: B
2629 1: B
2630    abcde\nBar
2631 0: B
2632 1: B
2633
2634/(?s)(.*X|^B)/
2635    abcde\n1234Xyz
2636 0: abcde\x0a1234X
2637 1: abcde\x0a1234X
2638    BarFoo
2639 0: B
2640 1: B
2641\= Expect no match
2642    abcde\nBar
2643No match
2644
2645/(?s:.*X|^B)/
2646    abcde\n1234Xyz
2647 0: abcde\x0a1234X
2648    BarFoo
2649 0: B
2650\= Expect no match
2651    abcde\nBar
2652No match
2653
2654/^.*B/
2655\= Expect no match
2656    abc\nB
2657No match
2658
2659/(?s)^.*B/
2660    abc\nB
2661 0: abc\x0aB
2662
2663/(?m)^.*B/
2664    abc\nB
2665 0: B
2666
2667/(?ms)^.*B/
2668    abc\nB
2669 0: abc\x0aB
2670
2671/(?ms)^B/
2672    abc\nB
2673 0: B
2674
2675/(?s)B$/
2676    B\n
2677 0: B
2678
2679/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
2680    123456654321
2681 0: 123456654321
2682
2683/^\d\d\d\d\d\d\d\d\d\d\d\d/
2684    123456654321
2685 0: 123456654321
2686
2687/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
2688    123456654321
2689 0: 123456654321
2690
2691/^[abc]{12}/
2692    abcabcabcabc
2693 0: abcabcabcabc
2694
2695/^[a-c]{12}/
2696    abcabcabcabc
2697 0: abcabcabcabc
2698
2699/^(a|b|c){12}/
2700    abcabcabcabc
2701 0: abcabcabcabc
2702 1: c
2703
2704/^[abcdefghijklmnopqrstuvwxy0123456789]/
2705    n
2706 0: n
2707\= Expect no match
2708    z
2709No match
2710
2711/abcde{0,0}/
2712    abcd
2713 0: abcd
2714\= Expect no match
2715    abce
2716No match
2717
2718/ab[cd]{0,0}e/
2719    abe
2720 0: abe
2721\= Expect no match
2722    abcde
2723No match
2724
2725/ab(c){0,0}d/
2726    abd
2727 0: abd
2728\= Expect no match
2729    abcd
2730No match
2731
2732/a(b*)/
2733    a
2734 0: a
2735 1:
2736    ab
2737 0: ab
2738 1: b
2739    abbbb
2740 0: abbbb
2741 1: bbbb
2742\= Expect no match
2743    bbbbb
2744No match
2745
2746/ab\d{0}e/
2747    abe
2748 0: abe
2749\= Expect no match
2750    ab1e
2751No match
2752
2753/"([^\\"]+|\\.)*"/
2754    the \"quick\" brown fox
2755 0: "quick"
2756 1: quick
2757    \"the \\\"quick\\\" brown fox\"
2758 0: "the \"quick\" brown fox"
2759 1:  brown fox
2760
2761/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
2762    <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
2763 0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
2764 1:  BGCOLOR='#DBE9E9'
2765 2:  align=left valign=top
2766 3: 43.
2767 4: <a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)
2768 5:
2769 6:
2770 7: <unset>
2771 8:  align=left valign=top
2772 9: Lega lstaff.com
277310:  align=left valign=top
277411: CA - Statewide
2775
2776/a[^a]b/
2777    acb
2778 0: acb
2779    a\nb
2780 0: a\x0ab
2781
2782/a.b/
2783    acb
2784 0: acb
2785\= Expect no match
2786    a\nb
2787No match
2788
2789/a[^a]b/s
2790    acb
2791 0: acb
2792    a\nb
2793 0: a\x0ab
2794
2795/a.b/s
2796    acb
2797 0: acb
2798    a\nb
2799 0: a\x0ab
2800
2801/^(b+?|a){1,2}?c/
2802    bac
2803 0: bac
2804 1: a
2805    bbac
2806 0: bbac
2807 1: a
2808    bbbac
2809 0: bbbac
2810 1: a
2811    bbbbac
2812 0: bbbbac
2813 1: a
2814    bbbbbac
2815 0: bbbbbac
2816 1: a
2817
2818/^(b+|a){1,2}?c/
2819    bac
2820 0: bac
2821 1: a
2822    bbac
2823 0: bbac
2824 1: a
2825    bbbac
2826 0: bbbac
2827 1: a
2828    bbbbac
2829 0: bbbbac
2830 1: a
2831    bbbbbac
2832 0: bbbbbac
2833 1: a
2834
2835/(?!\A)x/m
2836    a\bx\n
2837 0: x
2838    a\nx\n
2839 0: x
2840\= Expect no match
2841    x\nb\n
2842No match
2843
2844/(A|B)*?CD/
2845    CD
2846 0: CD
2847
2848/(A|B)*CD/
2849    CD
2850 0: CD
2851
2852/(AB)*?\1/
2853    ABABAB
2854 0: ABAB
2855 1: AB
2856
2857/(AB)*\1/
2858    ABABAB
2859 0: ABABAB
2860 1: AB
2861
2862/(?<!bar)foo/
2863    foo
2864 0: foo
2865    catfood
2866 0: foo
2867    arfootle
2868 0: foo
2869    rfoosh
2870 0: foo
2871\= Expect no match
2872    barfoo
2873No match
2874    towbarfoo
2875No match
2876
2877/\w{3}(?<!bar)foo/
2878    catfood
2879 0: catfoo
2880\= Expect no match
2881    foo
2882No match
2883    barfoo
2884No match
2885    towbarfoo
2886No match
2887
2888/(?<=(foo)a)bar/
2889    fooabar
2890 0: bar
2891 1: foo
2892\= Expect no match
2893    bar
2894No match
2895    foobbar
2896No match
2897
2898/\Aabc\z/m
2899    abc
2900 0: abc
2901\= Expect no match
2902    abc\n
2903No match
2904    qqq\nabc
2905No match
2906    abc\nzzz
2907No match
2908    qqq\nabc\nzzz
2909No match
2910
2911"(?>.*/)foo"
2912    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
2913 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
2914\= Expect no match
2915    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
2916No match
2917
2918/(?>(\.\d\d[1-9]?))\d+/
2919    1.230003938
2920 0: .230003938
2921 1: .23
2922    1.875000282
2923 0: .875000282
2924 1: .875
2925\= Expect no match
2926    1.235
2927No match
2928
2929/^((?>\w+)|(?>\s+))*$/
2930    now is the time for all good men to come to the aid of the party
2931 0: now is the time for all good men to come to the aid of the party
2932 1: party
2933\= Expect no match
2934    this is not a line with only words and spaces!
2935No match
2936
2937/(\d+)(\w)/
2938    12345a
2939 0: 12345a
2940 1: 12345
2941 2: a
2942    12345+
2943 0: 12345
2944 1: 1234
2945 2: 5
2946
2947/((?>\d+))(\w)/
2948    12345a
2949 0: 12345a
2950 1: 12345
2951 2: a
2952\= Expect no match
2953    12345+
2954No match
2955
2956/(?>a+)b/
2957    aaab
2958 0: aaab
2959
2960/((?>a+)b)/
2961    aaab
2962 0: aaab
2963 1: aaab
2964
2965/(?>(a+))b/
2966    aaab
2967 0: aaab
2968 1: aaa
2969
2970/(?>b)+/
2971    aaabbbccc
2972 0: bbb
2973
2974/(?>a+|b+|c+)*c/
2975    aaabbbbccccd
2976 0: aaabbbbc
2977
2978/((?>[^()]+)|\([^()]*\))+/
2979    ((abc(ade)ufh()()x
2980 0: abc(ade)ufh()()x
2981 1: x
2982
2983/\(((?>[^()]+)|\([^()]+\))+\)/
2984    (abc)
2985 0: (abc)
2986 1: abc
2987    (abc(def)xyz)
2988 0: (abc(def)xyz)
2989 1: xyz
2990\= Expect no match
2991    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2992No match
2993
2994/a(?-i)b/i
2995    ab
2996 0: ab
2997    Ab
2998 0: Ab
2999\= Expect no match
3000    aB
3001No match
3002    AB
3003No match
3004
3005/(a (?x)b c)d e/
3006    a bcd e
3007 0: a bcd e
3008 1: a bc
3009\= Expect no match
3010    a b cd e
3011No match
3012    abcd e
3013No match
3014    a bcde
3015No match
3016
3017/(a b(?x)c d (?-x)e f)/
3018    a bcde f
3019 0: a bcde f
3020 1: a bcde f
3021\= Expect no match
3022    abcdef
3023No match
3024
3025/(a(?i)b)c/
3026    abc
3027 0: abc
3028 1: ab
3029    aBc
3030 0: aBc
3031 1: aB
3032\= Expect no match
3033    abC
3034No match
3035    aBC
3036No match
3037    Abc
3038No match
3039    ABc
3040No match
3041    ABC
3042No match
3043    AbC
3044No match
3045
3046/a(?i:b)c/
3047    abc
3048 0: abc
3049    aBc
3050 0: aBc
3051\= Expect no match
3052    ABC
3053No match
3054    abC
3055No match
3056    aBC
3057No match
3058
3059/a(?i:b)*c/
3060    aBc
3061 0: aBc
3062    aBBc
3063 0: aBBc
3064\= Expect no match
3065    aBC
3066No match
3067    aBBC
3068No match
3069
3070/a(?=b(?i)c)\w\wd/
3071    abcd
3072 0: abcd
3073    abCd
3074 0: abCd
3075\= Expect no match
3076    aBCd
3077No match
3078    abcD
3079No match
3080
3081/(?s-i:more.*than).*million/i
3082    more than million
3083 0: more than million
3084    more than MILLION
3085 0: more than MILLION
3086    more \n than Million
3087 0: more \x0a than Million
3088\= Expect no match
3089    MORE THAN MILLION
3090No match
3091    more \n than \n million
3092No match
3093
3094/(?:(?s-i)more.*than).*million/i
3095    more than million
3096 0: more than million
3097    more than MILLION
3098 0: more than MILLION
3099    more \n than Million
3100 0: more \x0a than Million
3101\= Expect no match
3102    MORE THAN MILLION
3103No match
3104    more \n than \n million
3105No match
3106
3107/(?>a(?i)b+)+c/
3108    abc
3109 0: abc
3110    aBbc
3111 0: aBbc
3112    aBBc
3113 0: aBBc
3114\= Expect no match
3115    Abc
3116No match
3117    abAb
3118No match
3119    abbC
3120No match
3121
3122/(?=a(?i)b)\w\wc/
3123    abc
3124 0: abc
3125    aBc
3126 0: aBc
3127\= Expect no match
3128    Ab
3129No match
3130    abC
3131No match
3132    aBC
3133No match
3134
3135/(?<=a(?i)b)(\w\w)c/
3136    abxxc
3137 0: xxc
3138 1: xx
3139    aBxxc
3140 0: xxc
3141 1: xx
3142\= Expect no match
3143    Abxxc
3144No match
3145    ABxxc
3146No match
3147    abxxC
3148No match
3149
3150/(?:(a)|b)(?(1)A|B)/
3151    aA
3152 0: aA
3153 1: a
3154    bB
3155 0: bB
3156\= Expect no match
3157    aB
3158No match
3159    bA
3160No match
3161
3162/^(a)?(?(1)a|b)+$/
3163    aa
3164 0: aa
3165 1: a
3166    b
3167 0: b
3168    bb
3169 0: bb
3170\= Expect no match
3171    ab
3172No match
3173
3174# Perl gets this next one wrong if the pattern ends with $; in that case it
3175# fails to match "12".
3176
3177/^(?(?=abc)\w{3}:|\d\d)/
3178    abc:
3179 0: abc:
3180    12
3181 0: 12
3182    123
3183 0: 12
3184\= Expect no match
3185    xyz
3186No match
3187
3188/^(?(?!abc)\d\d|\w{3}:)$/
3189    abc:
3190 0: abc:
3191    12
3192 0: 12
3193\= Expect no match
3194    123
3195No match
3196    xyz
3197No match
3198
3199/(?(?<=foo)bar|cat)/
3200    foobar
3201 0: bar
3202    cat
3203 0: cat
3204    fcat
3205 0: cat
3206    focat
3207 0: cat
3208\= Expect no match
3209    foocat
3210No match
3211
3212/(?(?<!foo)cat|bar)/
3213    foobar
3214 0: bar
3215    cat
3216 0: cat
3217    fcat
3218 0: cat
3219    focat
3220 0: cat
3221\= Expect no match
3222    foocat
3223No match
3224
3225/( \( )? [^()]+ (?(1) \) |) /x
3226    abcd
3227 0: abcd
3228    (abcd)
3229 0: (abcd)
3230 1: (
3231    the quick (abcd) fox
3232 0: the quick
3233    (abcd
3234 0: abcd
3235
3236/( \( )? [^()]+ (?(1) \) ) /x
3237    abcd
3238 0: abcd
3239    (abcd)
3240 0: (abcd)
3241 1: (
3242    the quick (abcd) fox
3243 0: the quick
3244    (abcd
3245 0: abcd
3246
3247/^(?(2)a|(1)(2))+$/
3248    12
3249 0: 12
3250 1: 1
3251 2: 2
3252    12a
3253 0: 12a
3254 1: 1
3255 2: 2
3256    12aa
3257 0: 12aa
3258 1: 1
3259 2: 2
3260\= Expect no match
3261    1234
3262No match
3263
3264/((?i)blah)\s+\1/
3265    blah blah
3266 0: blah blah
3267 1: blah
3268    BLAH BLAH
3269 0: BLAH BLAH
3270 1: BLAH
3271    Blah Blah
3272 0: Blah Blah
3273 1: Blah
3274    blaH blaH
3275 0: blaH blaH
3276 1: blaH
3277\= Expect no match
3278    blah BLAH
3279No match
3280    Blah blah
3281No match
3282    blaH blah
3283No match
3284
3285/((?i)blah)\s+(?i:\1)/
3286    blah blah
3287 0: blah blah
3288 1: blah
3289    BLAH BLAH
3290 0: BLAH BLAH
3291 1: BLAH
3292    Blah Blah
3293 0: Blah Blah
3294 1: Blah
3295    blaH blaH
3296 0: blaH blaH
3297 1: blaH
3298    blah BLAH
3299 0: blah BLAH
3300 1: blah
3301    Blah blah
3302 0: Blah blah
3303 1: Blah
3304    blaH blah
3305 0: blaH blah
3306 1: blaH
3307
3308/(?>a*)*/
3309    a
3310 0: a
3311    aa
3312 0: aa
3313    aaaa
3314 0: aaaa
3315
3316/(abc|)+/
3317    abc
3318 0: abc
3319 1:
3320    abcabc
3321 0: abcabc
3322 1:
3323    abcabcabc
3324 0: abcabcabc
3325 1:
3326    xyz
3327 0:
3328 1:
3329
3330/([a]*)*/
3331    a
3332 0: a
3333 1:
3334    aaaaa
3335 0: aaaaa
3336 1:
3337
3338/([ab]*)*/
3339    a
3340 0: a
3341 1:
3342    b
3343 0: b
3344 1:
3345    ababab
3346 0: ababab
3347 1:
3348    aaaabcde
3349 0: aaaab
3350 1:
3351    bbbb
3352 0: bbbb
3353 1:
3354
3355/([^a]*)*/
3356    b
3357 0: b
3358 1:
3359    bbbb
3360 0: bbbb
3361 1:
3362    aaa
3363 0:
3364 1:
3365
3366/([^ab]*)*/
3367    cccc
3368 0: cccc
3369 1:
3370    abab
3371 0:
3372 1:
3373
3374/([a]*?)*/
3375    a
3376 0:
3377 1:
3378    aaaa
3379 0:
3380 1:
3381
3382/([ab]*?)*/
3383    a
3384 0:
3385 1:
3386    b
3387 0:
3388 1:
3389    abab
3390 0:
3391 1:
3392    baba
3393 0:
3394 1:
3395
3396/([^a]*?)*/
3397    b
3398 0:
3399 1:
3400    bbbb
3401 0:
3402 1:
3403    aaa
3404 0:
3405 1:
3406
3407/([^ab]*?)*/
3408    c
3409 0:
3410 1:
3411    cccc
3412 0:
3413 1:
3414    baba
3415 0:
3416 1:
3417
3418/(?>a*)*/
3419    a
3420 0: a
3421    aaabcde
3422 0: aaa
3423
3424/((?>a*))*/
3425    aaaaa
3426 0: aaaaa
3427 1:
3428    aabbaa
3429 0: aa
3430 1:
3431
3432/((?>a*?))*/
3433    aaaaa
3434 0:
3435 1:
3436    aabbaa
3437 0:
3438 1:
3439
3440/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /x
3441    12-sep-98
3442 0: 12-sep-98
3443    12-09-98
3444 0: 12-09-98
3445\= Expect no match
3446    sep-12-98
3447No match
3448
3449/(?<=(foo))bar\1/
3450    foobarfoo
3451 0: barfoo
3452 1: foo
3453    foobarfootling
3454 0: barfoo
3455 1: foo
3456\= Expect no match
3457    foobar
3458No match
3459    barfoo
3460No match
3461
3462/(?i:saturday|sunday)/
3463    saturday
3464 0: saturday
3465    sunday
3466 0: sunday
3467    Saturday
3468 0: Saturday
3469    Sunday
3470 0: Sunday
3471    SATURDAY
3472 0: SATURDAY
3473    SUNDAY
3474 0: SUNDAY
3475    SunDay
3476 0: SunDay
3477
3478/(a(?i)bc|BB)x/
3479    abcx
3480 0: abcx
3481 1: abc
3482    aBCx
3483 0: aBCx
3484 1: aBC
3485    bbx
3486 0: bbx
3487 1: bb
3488    BBx
3489 0: BBx
3490 1: BB
3491\= Expect no match
3492    abcX
3493No match
3494    aBCX
3495No match
3496    bbX
3497No match
3498    BBX
3499No match
3500
3501/^([ab](?i)[cd]|[ef])/
3502    ac
3503 0: ac
3504 1: ac
3505    aC
3506 0: aC
3507 1: aC
3508    bD
3509 0: bD
3510 1: bD
3511    elephant
3512 0: e
3513 1: e
3514    Europe
3515 0: E
3516 1: E
3517    frog
3518 0: f
3519 1: f
3520    France
3521 0: F
3522 1: F
3523\= Expect no match
3524    Africa
3525No match
3526
3527/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
3528    ab
3529 0: ab
3530 1: ab
3531    aBd
3532 0: aBd
3533 1: aBd
3534    xy
3535 0: xy
3536 1: xy
3537    xY
3538 0: xY
3539 1: xY
3540    zebra
3541 0: z
3542 1: z
3543    Zambesi
3544 0: Z
3545 1: Z
3546\= Expect no match
3547    aCD
3548No match
3549    XY
3550No match
3551
3552/(?<=foo\n)^bar/m
3553    foo\nbar
3554 0: bar
3555\= Expect no match
3556    bar
3557No match
3558    baz\nbar
3559No match
3560
3561/(?<=(?<!foo)bar)baz/
3562    barbaz
3563 0: baz
3564    barbarbaz
3565 0: baz
3566    koobarbaz
3567 0: baz
3568\= Expect no match
3569    baz
3570No match
3571    foobarbaz
3572No match
3573
3574# The cases of aaaa and aaaaaa are missed out below because Perl does things
3575# differently. We know that odd, and maybe incorrect, things happen with
3576# recursive references in Perl, as far as 5.11.3 - see some stuff in test #2.
3577
3578/^(a\1?){4}$/
3579    aaaaa
3580 0: aaaaa
3581 1: a
3582    aaaaaaa
3583 0: aaaaaaa
3584 1: a
3585    aaaaaaaaaa
3586 0: aaaaaaaaaa
3587 1: aaaa
3588\= Expect no match
3589    a
3590No match
3591    aa
3592No match
3593    aaa
3594No match
3595    aaaaaaaa
3596No match
3597    aaaaaaaaa
3598No match
3599    aaaaaaaaaaa
3600No match
3601    aaaaaaaaaaaa
3602No match
3603    aaaaaaaaaaaaa
3604No match
3605    aaaaaaaaaaaaaa
3606No match
3607    aaaaaaaaaaaaaaa
3608No match
3609    aaaaaaaaaaaaaaaa
3610No match
3611
3612/^(a\1?)(a\1?)(a\2?)(a\3?)$/
3613    aaaa
3614 0: aaaa
3615 1: a
3616 2: a
3617 3: a
3618 4: a
3619    aaaaa
3620 0: aaaaa
3621 1: a
3622 2: aa
3623 3: a
3624 4: a
3625    aaaaaa
3626 0: aaaaaa
3627 1: a
3628 2: aa
3629 3: a
3630 4: aa
3631    aaaaaaa
3632 0: aaaaaaa
3633 1: a
3634 2: aa
3635 3: aaa
3636 4: a
3637    aaaaaaaaaa
3638 0: aaaaaaaaaa
3639 1: a
3640 2: aa
3641 3: aaa
3642 4: aaaa
3643\= Expect no match
3644    a
3645No match
3646    aa
3647No match
3648    aaa
3649No match
3650    aaaaaaaa
3651No match
3652    aaaaaaaaa
3653No match
3654    aaaaaaaaaaa
3655No match
3656    aaaaaaaaaaaa
3657No match
3658    aaaaaaaaaaaaa
3659No match
3660    aaaaaaaaaaaaaa
3661No match
3662    aaaaaaaaaaaaaaa
3663No match
3664    aaaaaaaaaaaaaaaa
3665No match
3666
3667# The following tests are taken from the Perl 5.005 test suite; some of them
3668# are compatible with 5.004, but I'd rather not have to sort them out.
3669
3670/abc/
3671    abc
3672 0: abc
3673    xabcy
3674 0: abc
3675    ababc
3676 0: abc
3677\= Expect no match
3678    xbc
3679No match
3680    axc
3681No match
3682    abx
3683No match
3684
3685/ab*c/
3686    abc
3687 0: abc
3688
3689/ab*bc/
3690    abc
3691 0: abc
3692    abbc
3693 0: abbc
3694    abbbbc
3695 0: abbbbc
3696
3697/.{1}/
3698    abbbbc
3699 0: a
3700
3701/.{3,4}/
3702    abbbbc
3703 0: abbb
3704
3705/ab{0,}bc/
3706    abbbbc
3707 0: abbbbc
3708
3709/ab+bc/
3710    abbc
3711 0: abbc
3712\= Expect no match
3713    abc
3714No match
3715    abq
3716No match
3717
3718/ab{1,}bc/
3719
3720/ab+bc/
3721    abbbbc
3722 0: abbbbc
3723
3724/ab{1,}bc/
3725    abbbbc
3726 0: abbbbc
3727
3728/ab{1,3}bc/
3729    abbbbc
3730 0: abbbbc
3731
3732/ab{3,4}bc/
3733    abbbbc
3734 0: abbbbc
3735
3736/ab{4,5}bc/
3737\= Expect no match
3738    abq
3739No match
3740    abbbbc
3741No match
3742
3743/ab?bc/
3744    abbc
3745 0: abbc
3746    abc
3747 0: abc
3748
3749/ab{0,1}bc/
3750    abc
3751 0: abc
3752
3753/ab?bc/
3754
3755/ab?c/
3756    abc
3757 0: abc
3758
3759/ab{0,1}c/
3760    abc
3761 0: abc
3762
3763/^abc$/
3764    abc
3765 0: abc
3766\= Expect no match
3767    abbbbc
3768No match
3769    abcc
3770No match
3771
3772/^abc/
3773    abcc
3774 0: abc
3775
3776/^abc$/
3777
3778/abc$/
3779    aabc
3780 0: abc
3781\= Expect no match
3782    aabcd
3783No match
3784
3785/^/
3786    abc
3787 0:
3788
3789/$/
3790    abc
3791 0:
3792
3793/a.c/
3794    abc
3795 0: abc
3796    axc
3797 0: axc
3798
3799/a.*c/
3800    axyzc
3801 0: axyzc
3802
3803/a[bc]d/
3804    abd
3805 0: abd
3806\= Expect no match
3807    axyzd
3808No match
3809    abc
3810No match
3811
3812/a[b-d]e/
3813    ace
3814 0: ace
3815
3816/a[b-d]/
3817    aac
3818 0: ac
3819
3820/a[-b]/
3821    a-
3822 0: a-
3823
3824/a[b-]/
3825    a-
3826 0: a-
3827
3828/a]/
3829    a]
3830 0: a]
3831
3832/a[]]b/
3833    a]b
3834 0: a]b
3835
3836/a[^bc]d/
3837    aed
3838 0: aed
3839\= Expect no match
3840    abd
3841No match
3842    abd
3843No match
3844
3845/a[^-b]c/
3846    adc
3847 0: adc
3848
3849/a[^]b]c/
3850    adc
3851 0: adc
3852    a-c
3853 0: a-c
3854\= Expect no match
3855    a]c
3856No match
3857
3858/\ba\b/
3859    a-
3860 0: a
3861    -a
3862 0: a
3863    -a-
3864 0: a
3865
3866/\by\b/
3867\= Expect no match
3868    xy
3869No match
3870    yz
3871No match
3872    xyz
3873No match
3874
3875/\Ba\B/
3876\= Expect no match
3877    a-
3878No match
3879    -a
3880No match
3881    -a-
3882No match
3883
3884/\By\b/
3885    xy
3886 0: y
3887
3888/\by\B/
3889    yz
3890 0: y
3891
3892/\By\B/
3893    xyz
3894 0: y
3895
3896/\w/
3897    a
3898 0: a
3899
3900/\W/
3901    -
3902 0: -
3903\= Expect no match
3904    a
3905No match
3906
3907/a\sb/
3908    a b
3909 0: a b
3910
3911/a\Sb/
3912    a-b
3913 0: a-b
3914\= Expect no match
3915    a b
3916No match
3917
3918/\d/
3919    1
3920 0: 1
3921
3922/\D/
3923    -
3924 0: -
3925\= Expect no match
3926    1
3927No match
3928
3929/[\w]/
3930    a
3931 0: a
3932
3933/[\W]/
3934    -
3935 0: -
3936\= Expect no match
3937    a
3938No match
3939
3940/a[\s]b/
3941    a b
3942 0: a b
3943
3944/a[\S]b/
3945    a-b
3946 0: a-b
3947\= Expect no match
3948    a b
3949No match
3950
3951/[\d]/
3952    1
3953 0: 1
3954
3955/[\D]/
3956    -
3957 0: -
3958\= Expect no match
3959    1
3960No match
3961
3962/ab|cd/
3963    abc
3964 0: ab
3965    abcd
3966 0: ab
3967
3968/()ef/
3969    def
3970 0: ef
3971 1:
3972
3973/$b/
3974
3975/a\(b/
3976    a(b
3977 0: a(b
3978
3979/a\(*b/
3980    ab
3981 0: ab
3982    a((b
3983 0: a((b
3984
3985/a\\b/
3986    a\\b
3987 0: a\b
3988
3989/((a))/
3990    abc
3991 0: a
3992 1: a
3993 2: a
3994
3995/(a)b(c)/
3996    abc
3997 0: abc
3998 1: a
3999 2: c
4000
4001/a+b+c/
4002    aabbabc
4003 0: abc
4004
4005/a{1,}b{1,}c/
4006    aabbabc
4007 0: abc
4008
4009/a.+?c/
4010    abcabc
4011 0: abc
4012
4013/(a+|b)*/
4014    ab
4015 0: ab
4016 1: b
4017
4018/(a+|b){0,}/
4019    ab
4020 0: ab
4021 1: b
4022
4023/(a+|b)+/
4024    ab
4025 0: ab
4026 1: b
4027
4028/(a+|b){1,}/
4029    ab
4030 0: ab
4031 1: b
4032
4033/(a+|b)?/
4034    ab
4035 0: a
4036 1: a
4037
4038/(a+|b){0,1}/
4039    ab
4040 0: a
4041 1: a
4042
4043/[^ab]*/
4044    cde
4045 0: cde
4046
4047/abc/
4048\= Expect no match
4049    b
4050No match
4051
4052/a*/
4053    \
4054 0:
4055
4056/([abc])*d/
4057    abbbcd
4058 0: abbbcd
4059 1: c
4060
4061/([abc])*bcd/
4062    abcd
4063 0: abcd
4064 1: a
4065
4066/a|b|c|d|e/
4067    e
4068 0: e
4069
4070/(a|b|c|d|e)f/
4071    ef
4072 0: ef
4073 1: e
4074
4075/abcd*efg/
4076    abcdefg
4077 0: abcdefg
4078
4079/ab*/
4080    xabyabbbz
4081 0: ab
4082    xayabbbz
4083 0: a
4084
4085/(ab|cd)e/
4086    abcde
4087 0: cde
4088 1: cd
4089
4090/[abhgefdc]ij/
4091    hij
4092 0: hij
4093
4094/^(ab|cd)e/
4095
4096/(abc|)ef/
4097    abcdef
4098 0: ef
4099 1:
4100
4101/(a|b)c*d/
4102    abcd
4103 0: bcd
4104 1: b
4105
4106/(ab|ab*)bc/
4107    abc
4108 0: abc
4109 1: a
4110
4111/a([bc]*)c*/
4112    abc
4113 0: abc
4114 1: bc
4115
4116/a([bc]*)(c*d)/
4117    abcd
4118 0: abcd
4119 1: bc
4120 2: d
4121
4122/a([bc]+)(c*d)/
4123    abcd
4124 0: abcd
4125 1: bc
4126 2: d
4127
4128/a([bc]*)(c+d)/
4129    abcd
4130 0: abcd
4131 1: b
4132 2: cd
4133
4134/a[bcd]*dcdcde/
4135    adcdcde
4136 0: adcdcde
4137
4138/a[bcd]+dcdcde/
4139\= Expect no match
4140    abcde
4141No match
4142    adcdcde
4143No match
4144
4145/(ab|a)b*c/
4146    abc
4147 0: abc
4148 1: ab
4149
4150/((a)(b)c)(d)/
4151    abcd
4152 0: abcd
4153 1: abc
4154 2: a
4155 3: b
4156 4: d
4157
4158/[a-zA-Z_][a-zA-Z0-9_]*/
4159    alpha
4160 0: alpha
4161
4162/^a(bc+|b[eh])g|.h$/
4163    abh
4164 0: bh
4165
4166/(bc+d$|ef*g.|h?i(j|k))/
4167    effgz
4168 0: effgz
4169 1: effgz
4170    ij
4171 0: ij
4172 1: ij
4173 2: j
4174    reffgz
4175 0: effgz
4176 1: effgz
4177\= Expect no match
4178    effg
4179No match
4180    bcdd
4181No match
4182
4183/((((((((((a))))))))))/
4184    a
4185 0: a
4186 1: a
4187 2: a
4188 3: a
4189 4: a
4190 5: a
4191 6: a
4192 7: a
4193 8: a
4194 9: a
419510: a
4196
4197/((((((((((a))))))))))\10/
4198    aa
4199 0: aa
4200 1: a
4201 2: a
4202 3: a
4203 4: a
4204 5: a
4205 6: a
4206 7: a
4207 8: a
4208 9: a
420910: a
4210
4211/(((((((((a)))))))))/
4212    a
4213 0: a
4214 1: a
4215 2: a
4216 3: a
4217 4: a
4218 5: a
4219 6: a
4220 7: a
4221 8: a
4222 9: a
4223
4224/multiple words of text/
4225\= Expect no match
4226    aa
4227No match
4228    uh-uh
4229No match
4230
4231/multiple words/
4232    multiple words, yeah
4233 0: multiple words
4234
4235/(.*)c(.*)/
4236    abcde
4237 0: abcde
4238 1: ab
4239 2: de
4240
4241/\((.*), (.*)\)/
4242    (a, b)
4243 0: (a, b)
4244 1: a
4245 2: b
4246
4247/[k]/
4248
4249/abcd/
4250    abcd
4251 0: abcd
4252
4253/a(bc)d/
4254    abcd
4255 0: abcd
4256 1: bc
4257
4258/a[-]?c/
4259    ac
4260 0: ac
4261
4262/(abc)\1/
4263    abcabc
4264 0: abcabc
4265 1: abc
4266
4267/([a-c]*)\1/
4268    abcabc
4269 0: abcabc
4270 1: abc
4271
4272/(a)|\1/
4273    a
4274 0: a
4275 1: a
4276    ab
4277 0: a
4278 1: a
4279\= Expect no match
4280    x
4281No match
4282
4283/(([a-c])b*?\2)*/
4284    ababbbcbc
4285 0: ababb
4286 1: bb
4287 2: b
4288
4289/(([a-c])b*?\2){3}/
4290    ababbbcbc
4291 0: ababbbcbc
4292 1: cbc
4293 2: c
4294
4295/((\3|b)\2(a)x)+/
4296    aaaxabaxbaaxbbax
4297 0: bbax
4298 1: bbax
4299 2: b
4300 3: a
4301
4302/((\3|b)\2(a)){2,}/
4303    bbaababbabaaaaabbaaaabba
4304 0: bbaaaabba
4305 1: bba
4306 2: b
4307 3: a
4308
4309/abc/i
4310    ABC
4311 0: ABC
4312    XABCY
4313 0: ABC
4314    ABABC
4315 0: ABC
4316\= Expect no match
4317    aaxabxbaxbbx
4318No match
4319    XBC
4320No match
4321    AXC
4322No match
4323    ABX
4324No match
4325
4326/ab*c/i
4327    ABC
4328 0: ABC
4329
4330/ab*bc/i
4331    ABC
4332 0: ABC
4333    ABBC
4334 0: ABBC
4335
4336/ab*?bc/i
4337    ABBBBC
4338 0: ABBBBC
4339
4340/ab{0,}?bc/i
4341    ABBBBC
4342 0: ABBBBC
4343
4344/ab+?bc/i
4345    ABBC
4346 0: ABBC
4347
4348/ab+bc/i
4349\= Expect no match
4350    ABC
4351No match
4352    ABQ
4353No match
4354
4355/ab{1,}bc/i
4356
4357/ab+bc/i
4358    ABBBBC
4359 0: ABBBBC
4360
4361/ab{1,}?bc/i
4362    ABBBBC
4363 0: ABBBBC
4364
4365/ab{1,3}?bc/i
4366    ABBBBC
4367 0: ABBBBC
4368
4369/ab{3,4}?bc/i
4370    ABBBBC
4371 0: ABBBBC
4372
4373/ab{4,5}?bc/i
4374\= Expect no match
4375    ABQ
4376No match
4377    ABBBBC
4378No match
4379
4380/ab??bc/i
4381    ABBC
4382 0: ABBC
4383    ABC
4384 0: ABC
4385
4386/ab{0,1}?bc/i
4387    ABC
4388 0: ABC
4389
4390/ab??bc/i
4391
4392/ab??c/i
4393    ABC
4394 0: ABC
4395
4396/ab{0,1}?c/i
4397    ABC
4398 0: ABC
4399
4400/^abc$/i
4401    ABC
4402 0: ABC
4403\= Expect no match
4404    ABBBBC
4405No match
4406    ABCC
4407No match
4408
4409/^abc/i
4410    ABCC
4411 0: ABC
4412
4413/^abc$/i
4414
4415/abc$/i
4416    AABC
4417 0: ABC
4418
4419/^/i
4420    ABC
4421 0:
4422
4423/$/i
4424    ABC
4425 0:
4426
4427/a.c/i
4428    ABC
4429 0: ABC
4430    AXC
4431 0: AXC
4432
4433/a.*?c/i
4434    AXYZC
4435 0: AXYZC
4436
4437/a.*c/i
4438    AABC
4439 0: AABC
4440\= Expect no match
4441    AXYZD
4442No match
4443
4444/a[bc]d/i
4445    ABD
4446 0: ABD
4447
4448/a[b-d]e/i
4449    ACE
4450 0: ACE
4451\= Expect no match
4452    ABC
4453No match
4454    ABD
4455No match
4456
4457/a[b-d]/i
4458    AAC
4459 0: AC
4460
4461/a[-b]/i
4462    A-
4463 0: A-
4464
4465/a[b-]/i
4466    A-
4467 0: A-
4468
4469/a]/i
4470    A]
4471 0: A]
4472
4473/a[]]b/i
4474    A]B
4475 0: A]B
4476
4477/a[^bc]d/i
4478    AED
4479 0: AED
4480
4481/a[^-b]c/i
4482    ADC
4483 0: ADC
4484\= Expect no match
4485    ABD
4486No match
4487    A-C
4488No match
4489
4490/a[^]b]c/i
4491    ADC
4492 0: ADC
4493
4494/ab|cd/i
4495    ABC
4496 0: AB
4497    ABCD
4498 0: AB
4499
4500/()ef/i
4501    DEF
4502 0: EF
4503 1:
4504
4505/$b/i
4506\= Expect no match
4507    A]C
4508No match
4509    B
4510No match
4511
4512/a\(b/i
4513    A(B
4514 0: A(B
4515
4516/a\(*b/i
4517    AB
4518 0: AB
4519    A((B
4520 0: A((B
4521
4522/a\\b/i
4523    A\\b
4524 0: A\b
4525    a\\B
4526 0: a\B
4527
4528/((a))/i
4529    ABC
4530 0: A
4531 1: A
4532 2: A
4533
4534/(a)b(c)/i
4535    ABC
4536 0: ABC
4537 1: A
4538 2: C
4539
4540/a+b+c/i
4541    AABBABC
4542 0: ABC
4543
4544/a{1,}b{1,}c/i
4545    AABBABC
4546 0: ABC
4547
4548/a.+?c/i
4549    ABCABC
4550 0: ABC
4551
4552/a.*?c/i
4553    ABCABC
4554 0: ABC
4555
4556/a.{0,5}?c/i
4557    ABCABC
4558 0: ABC
4559
4560/(a+|b)*/i
4561    AB
4562 0: AB
4563 1: B
4564
4565/(a+|b){0,}/i
4566    AB
4567 0: AB
4568 1: B
4569
4570/(a+|b)+/i
4571    AB
4572 0: AB
4573 1: B
4574
4575/(a+|b){1,}/i
4576    AB
4577 0: AB
4578 1: B
4579
4580/(a+|b)?/i
4581    AB
4582 0: A
4583 1: A
4584
4585/(a+|b){0,1}/i
4586    AB
4587 0: A
4588 1: A
4589
4590/(a+|b){0,1}?/i
4591    AB
4592 0:
4593
4594/[^ab]*/i
4595    CDE
4596 0: CDE
4597
4598/([abc])*d/i
4599    ABBBCD
4600 0: ABBBCD
4601 1: C
4602
4603/([abc])*bcd/i
4604    ABCD
4605 0: ABCD
4606 1: A
4607
4608/a|b|c|d|e/i
4609    E
4610 0: E
4611
4612/(a|b|c|d|e)f/i
4613    EF
4614 0: EF
4615 1: E
4616
4617/abcd*efg/i
4618    ABCDEFG
4619 0: ABCDEFG
4620
4621/ab*/i
4622    XABYABBBZ
4623 0: AB
4624    XAYABBBZ
4625 0: A
4626
4627/(ab|cd)e/i
4628    ABCDE
4629 0: CDE
4630 1: CD
4631
4632/[abhgefdc]ij/i
4633    HIJ
4634 0: HIJ
4635
4636/^(ab|cd)e/i
4637\= Expect no match
4638    ABCDE
4639No match
4640
4641/(abc|)ef/i
4642    ABCDEF
4643 0: EF
4644 1:
4645
4646/(a|b)c*d/i
4647    ABCD
4648 0: BCD
4649 1: B
4650
4651/(ab|ab*)bc/i
4652    ABC
4653 0: ABC
4654 1: A
4655
4656/a([bc]*)c*/i
4657    ABC
4658 0: ABC
4659 1: BC
4660
4661/a([bc]*)(c*d)/i
4662    ABCD
4663 0: ABCD
4664 1: BC
4665 2: D
4666
4667/a([bc]+)(c*d)/i
4668    ABCD
4669 0: ABCD
4670 1: BC
4671 2: D
4672
4673/a([bc]*)(c+d)/i
4674    ABCD
4675 0: ABCD
4676 1: B
4677 2: CD
4678
4679/a[bcd]*dcdcde/i
4680    ADCDCDE
4681 0: ADCDCDE
4682
4683/a[bcd]+dcdcde/i
4684
4685/(ab|a)b*c/i
4686    ABC
4687 0: ABC
4688 1: AB
4689
4690/((a)(b)c)(d)/i
4691    ABCD
4692 0: ABCD
4693 1: ABC
4694 2: A
4695 3: B
4696 4: D
4697
4698/[a-zA-Z_][a-zA-Z0-9_]*/i
4699    ALPHA
4700 0: ALPHA
4701
4702/^a(bc+|b[eh])g|.h$/i
4703    ABH
4704 0: BH
4705
4706/(bc+d$|ef*g.|h?i(j|k))/i
4707    EFFGZ
4708 0: EFFGZ
4709 1: EFFGZ
4710    IJ
4711 0: IJ
4712 1: IJ
4713 2: J
4714    REFFGZ
4715 0: EFFGZ
4716 1: EFFGZ
4717\= Expect no match
4718    ADCDCDE
4719No match
4720    EFFG
4721No match
4722    BCDD
4723No match
4724
4725/((((((((((a))))))))))/i
4726    A
4727 0: A
4728 1: A
4729 2: A
4730 3: A
4731 4: A
4732 5: A
4733 6: A
4734 7: A
4735 8: A
4736 9: A
473710: A
4738
4739/((((((((((a))))))))))\10/i
4740    AA
4741 0: AA
4742 1: A
4743 2: A
4744 3: A
4745 4: A
4746 5: A
4747 6: A
4748 7: A
4749 8: A
4750 9: A
475110: A
4752
4753/(((((((((a)))))))))/i
4754    A
4755 0: A
4756 1: A
4757 2: A
4758 3: A
4759 4: A
4760 5: A
4761 6: A
4762 7: A
4763 8: A
4764 9: A
4765
4766/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
4767    A
4768 0: A
4769 1: A
4770
4771/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
4772    C
4773 0: C
4774 1: C
4775
4776/multiple words of text/i
4777\= Expect no match
4778    AA
4779No match
4780    UH-UH
4781No match
4782
4783/multiple words/i
4784    MULTIPLE WORDS, YEAH
4785 0: MULTIPLE WORDS
4786
4787/(.*)c(.*)/i
4788    ABCDE
4789 0: ABCDE
4790 1: AB
4791 2: DE
4792
4793/\((.*), (.*)\)/i
4794    (A, B)
4795 0: (A, B)
4796 1: A
4797 2: B
4798
4799/[k]/i
4800
4801/abcd/i
4802    ABCD
4803 0: ABCD
4804
4805/a(bc)d/i
4806    ABCD
4807 0: ABCD
4808 1: BC
4809
4810/a[-]?c/i
4811    AC
4812 0: AC
4813
4814/(abc)\1/i
4815    ABCABC
4816 0: ABCABC
4817 1: ABC
4818
4819/([a-c]*)\1/i
4820    ABCABC
4821 0: ABCABC
4822 1: ABC
4823
4824/a(?!b)./
4825    abad
4826 0: ad
4827
4828/a(?=d)./
4829    abad
4830 0: ad
4831
4832/a(?=c|d)./
4833    abad
4834 0: ad
4835
4836/a(?:b|c|d)(.)/
4837    ace
4838 0: ace
4839 1: e
4840
4841/a(?:b|c|d)*(.)/
4842    ace
4843 0: ace
4844 1: e
4845
4846/a(?:b|c|d)+?(.)/
4847    ace
4848 0: ace
4849 1: e
4850    acdbcdbe
4851 0: acd
4852 1: d
4853
4854/a(?:b|c|d)+(.)/
4855    acdbcdbe
4856 0: acdbcdbe
4857 1: e
4858
4859/a(?:b|c|d){2}(.)/
4860    acdbcdbe
4861 0: acdb
4862 1: b
4863
4864/a(?:b|c|d){4,5}(.)/
4865    acdbcdbe
4866 0: acdbcdb
4867 1: b
4868
4869/a(?:b|c|d){4,5}?(.)/
4870    acdbcdbe
4871 0: acdbcd
4872 1: d
4873
4874/((foo)|(bar))*/
4875    foobar
4876 0: foobar
4877 1: bar
4878 2: foo
4879 3: bar
4880
4881/a(?:b|c|d){6,7}(.)/
4882    acdbcdbe
4883 0: acdbcdbe
4884 1: e
4885
4886/a(?:b|c|d){6,7}?(.)/
4887    acdbcdbe
4888 0: acdbcdbe
4889 1: e
4890
4891/a(?:b|c|d){5,6}(.)/
4892    acdbcdbe
4893 0: acdbcdbe
4894 1: e
4895
4896/a(?:b|c|d){5,6}?(.)/
4897    acdbcdbe
4898 0: acdbcdb
4899 1: b
4900
4901/a(?:b|c|d){5,7}(.)/
4902    acdbcdbe
4903 0: acdbcdbe
4904 1: e
4905
4906/a(?:b|c|d){5,7}?(.)/
4907    acdbcdbe
4908 0: acdbcdb
4909 1: b
4910
4911/a(?:b|(c|e){1,2}?|d)+?(.)/
4912    ace
4913 0: ace
4914 1: c
4915 2: e
4916
4917/^(.+)?B/
4918    AB
4919 0: AB
4920 1: A
4921
4922/^([^a-z])|(\^)$/
4923    .
4924 0: .
4925 1: .
4926
4927/^[<>]&/
4928    <&OUT
4929 0: <&
4930
4931/^(a\1?){4}$/
4932    aaaaaaaaaa
4933 0: aaaaaaaaaa
4934 1: aaaa
4935\= Expect no match
4936    AB
4937No match
4938    aaaaaaaaa
4939No match
4940    aaaaaaaaaaa
4941No match
4942
4943/^(a(?(1)\1)){4}$/
4944    aaaaaaaaaa
4945 0: aaaaaaaaaa
4946 1: aaaa
4947\= Expect no match
4948    aaaaaaaaa
4949No match
4950    aaaaaaaaaaa
4951No match
4952
4953/(?:(f)(o)(o)|(b)(a)(r))*/
4954    foobar
4955 0: foobar
4956 1: f
4957 2: o
4958 3: o
4959 4: b
4960 5: a
4961 6: r
4962
4963/(?<=a)b/
4964    ab
4965 0: b
4966\= Expect no match
4967    cb
4968No match
4969    b
4970No match
4971
4972/(?<!c)b/
4973    ab
4974 0: b
4975    b
4976 0: b
4977    b
4978 0: b
4979
4980/(?:..)*a/
4981    aba
4982 0: aba
4983
4984/(?:..)*?a/
4985    aba
4986 0: a
4987
4988/^(?:b|a(?=(.)))*\1/
4989    abc
4990 0: ab
4991 1: b
4992
4993/^(){3,5}/
4994    abc
4995 0:
4996 1:
4997
4998/^(a+)*ax/
4999    aax
5000 0: aax
5001 1: a
5002
5003/^((a|b)+)*ax/
5004    aax
5005 0: aax
5006 1: a
5007 2: a
5008
5009/^((a|bc)+)*ax/
5010    aax
5011 0: aax
5012 1: a
5013 2: a
5014
5015/(a|x)*ab/
5016    cab
5017 0: ab
5018
5019/(a)*ab/
5020    cab
5021 0: ab
5022
5023/(?:(?i)a)b/
5024    ab
5025 0: ab
5026
5027/((?i)a)b/
5028    ab
5029 0: ab
5030 1: a
5031
5032/(?:(?i)a)b/
5033    Ab
5034 0: Ab
5035
5036/((?i)a)b/
5037    Ab
5038 0: Ab
5039 1: A
5040
5041/(?:(?i)a)b/
5042\= Expect no match
5043    cb
5044No match
5045    aB
5046No match
5047
5048/((?i)a)b/
5049
5050/(?i:a)b/
5051    ab
5052 0: ab
5053
5054/((?i:a))b/
5055    ab
5056 0: ab
5057 1: a
5058
5059/(?i:a)b/
5060    Ab
5061 0: Ab
5062
5063/((?i:a))b/
5064    Ab
5065 0: Ab
5066 1: A
5067
5068/(?i:a)b/
5069\= Expect no match
5070    aB
5071No match
5072    aB
5073No match
5074
5075/((?i:a))b/
5076
5077/(?:(?-i)a)b/i
5078    ab
5079 0: ab
5080
5081/((?-i)a)b/i
5082    ab
5083 0: ab
5084 1: a
5085
5086/(?:(?-i)a)b/i
5087    aB
5088 0: aB
5089
5090/((?-i)a)b/i
5091    aB
5092 0: aB
5093 1: a
5094
5095/(?:(?-i)a)b/i
5096    aB
5097 0: aB
5098\= Expect no match
5099    Ab
5100No match
5101    AB
5102No match
5103
5104/(?-i:a)b/i
5105    ab
5106 0: ab
5107
5108/((?-i:a))b/i
5109    ab
5110 0: ab
5111 1: a
5112
5113/(?-i:a)b/i
5114    aB
5115 0: aB
5116
5117/((?-i:a))b/i
5118    aB
5119 0: aB
5120 1: a
5121
5122/(?-i:a)b/i
5123\= Expect no match
5124    AB
5125No match
5126    Ab
5127No match
5128
5129/((?-i:a))b/i
5130
5131/(?-i:a)b/i
5132    aB
5133 0: aB
5134
5135/((?-i:a))b/i
5136    aB
5137 0: aB
5138 1: a
5139
5140/(?-i:a)b/i
5141\= Expect no match
5142    Ab
5143No match
5144    AB
5145No match
5146
5147/((?-i:a))b/i
5148
5149/((?-i:a.))b/i
5150\= Expect no match
5151    AB
5152No match
5153    a\nB
5154No match
5155
5156/((?s-i:a.))b/i
5157    a\nB
5158 0: a\x0aB
5159 1: a\x0a
5160
5161/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
5162    cabbbb
5163 0: cabbbb
5164
5165/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
5166    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
5167 0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
5168
5169/(ab)\d\1/i
5170    Ab4ab
5171 0: Ab4ab
5172 1: Ab
5173    ab4Ab
5174 0: ab4Ab
5175 1: ab
5176
5177/foo\w*\d{4}baz/
5178    foobar1234baz
5179 0: foobar1234baz
5180
5181/x(~~)*(?:(?:F)?)?/
5182    x~~
5183 0: x~~
5184 1: ~~
5185
5186/^a(?#xxx){3}c/
5187    aaac
5188 0: aaac
5189
5190/^a (?#xxx) (?#yyy) {3}c/x
5191    aaac
5192 0: aaac
5193
5194/(?<![cd])b/
5195\= Expect no match
5196    B\nB
5197No match
5198    dbcb
5199No match
5200
5201/(?<![cd])[ab]/
5202    dbaacb
5203 0: a
5204
5205/(?<!(c|d))b/
5206
5207/(?<!(c|d))[ab]/
5208    dbaacb
5209 0: a
5210
5211/(?<!cd)[ab]/
5212    cdaccb
5213 0: b
5214
5215/^(?:a?b?)*$/
5216    \
5217 0:
5218    a
5219 0: a
5220    ab
5221 0: ab
5222    aaa
5223 0: aaa
5224\= Expect no match
5225    dbcb
5226No match
5227    a--
5228No match
5229    aa--
5230No match
5231
5232/((?s)^a(.))((?m)^b$)/
5233    a\nb\nc\n
5234 0: a\x0ab
5235 1: a\x0a
5236 2: \x0a
5237 3: b
5238
5239/((?m)^b$)/
5240    a\nb\nc\n
5241 0: b
5242 1: b
5243
5244/(?m)^b/
5245    a\nb\n
5246 0: b
5247
5248/(?m)^(b)/
5249    a\nb\n
5250 0: b
5251 1: b
5252
5253/((?m)^b)/
5254    a\nb\n
5255 0: b
5256 1: b
5257
5258/\n((?m)^b)/
5259    a\nb\n
5260 0: \x0ab
5261 1: b
5262
5263/((?s).)c(?!.)/
5264    a\nb\nc\n
5265 0: \x0ac
5266 1: \x0a
5267    a\nb\nc\n
5268 0: \x0ac
5269 1: \x0a
5270
5271/((?s)b.)c(?!.)/
5272    a\nb\nc\n
5273 0: b\x0ac
5274 1: b\x0a
5275    a\nb\nc\n
5276 0: b\x0ac
5277 1: b\x0a
5278
5279/^b/
5280
5281/()^b/
5282\= Expect no match
5283    a\nb\nc\n
5284No match
5285    a\nb\nc\n
5286No match
5287
5288/((?m)^b)/
5289    a\nb\nc\n
5290 0: b
5291 1: b
5292
5293/(x)?(?(1)a|b)/
5294\= Expect no match
5295    a
5296No match
5297    a
5298No match
5299
5300/(x)?(?(1)b|a)/
5301    a
5302 0: a
5303
5304/()?(?(1)b|a)/
5305    a
5306 0: a
5307
5308/()(?(1)b|a)/
5309
5310/()?(?(1)a|b)/
5311    a
5312 0: a
5313 1:
5314
5315/^(\()?blah(?(1)(\)))$/
5316    (blah)
5317 0: (blah)
5318 1: (
5319 2: )
5320    blah
5321 0: blah
5322\= Expect no match
5323    a
5324No match
5325    blah)
5326No match
5327    (blah
5328No match
5329
5330/^(\(+)?blah(?(1)(\)))$/
5331    (blah)
5332 0: (blah)
5333 1: (
5334 2: )
5335    blah
5336 0: blah
5337\= Expect no match
5338    blah)
5339No match
5340    (blah
5341No match
5342
5343/(?(?!a)a|b)/
5344
5345/(?(?!a)b|a)/
5346    a
5347 0: a
5348
5349/(?(?=a)b|a)/
5350\= Expect no match
5351    a
5352No match
5353    a
5354No match
5355
5356/(?(?=a)a|b)/
5357    a
5358 0: a
5359
5360/(?=(a+?))(\1ab)/
5361    aaab
5362 0: aab
5363 1: a
5364 2: aab
5365
5366/^(?=(a+?))\1ab/
5367
5368/(\w+:)+/
5369    one:
5370 0: one:
5371 1: one:
5372
5373/$(?<=^(a))/
5374    a
5375 0:
5376 1: a
5377
5378/(?=(a+?))(\1ab)/
5379    aaab
5380 0: aab
5381 1: a
5382 2: aab
5383
5384/^(?=(a+?))\1ab/
5385\= Expect no match
5386    aaab
5387No match
5388    aaab
5389No match
5390
5391/([\w:]+::)?(\w+)$/
5392    abcd
5393 0: abcd
5394 1: <unset>
5395 2: abcd
5396    xy:z:::abcd
5397 0: xy:z:::abcd
5398 1: xy:z:::
5399 2: abcd
5400
5401/^[^bcd]*(c+)/
5402    aexycd
5403 0: aexyc
5404 1: c
5405
5406/(a*)b+/
5407    caab
5408 0: aab
5409 1: aa
5410
5411/([\w:]+::)?(\w+)$/
5412    abcd
5413 0: abcd
5414 1: <unset>
5415 2: abcd
5416    xy:z:::abcd
5417 0: xy:z:::abcd
5418 1: xy:z:::
5419 2: abcd
5420\= Expect no match
5421    abcd:
5422No match
5423    abcd:
5424No match
5425
5426/^[^bcd]*(c+)/
5427    aexycd
5428 0: aexyc
5429 1: c
5430
5431/(>a+)ab/
5432
5433/(?>a+)b/
5434    aaab
5435 0: aaab
5436
5437/([[:]+)/
5438    a:[b]:
5439 0: :[
5440 1: :[
5441
5442/([[=]+)/
5443    a=[b]=
5444 0: =[
5445 1: =[
5446
5447/([[.]+)/
5448    a.[b].
5449 0: .[
5450 1: .[
5451
5452/((?>a+)b)/
5453    aaab
5454 0: aaab
5455 1: aaab
5456
5457/(?>(a+))b/
5458    aaab
5459 0: aaab
5460 1: aaa
5461
5462/((?>[^()]+)|\([^()]*\))+/
5463    ((abc(ade)ufh()()x
5464 0: abc(ade)ufh()()x
5465 1: x
5466
5467/a\Z/
5468\= Expect no match
5469    aaab
5470No match
5471    a\nb\n
5472No match
5473
5474/b\Z/
5475    a\nb\n
5476 0: b
5477
5478/b\z/
5479
5480/b\Z/
5481    a\nb
5482 0: b
5483
5484/b\z/
5485    a\nb
5486 0: b
5487
5488/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
5489    a
5490 0: a
5491 1:
5492    abc
5493 0: abc
5494 1:
5495    a-b
5496 0: a-b
5497 1:
5498    0-9
5499 0: 0-9
5500 1:
5501    a.b
5502 0: a.b
5503 1:
5504    5.6.7
5505 0: 5.6.7
5506 1:
5507    the.quick.brown.fox
5508 0: the.quick.brown.fox
5509 1:
5510    a100.b200.300c
5511 0: a100.b200.300c
5512 1:
5513    12-ab.1245
5514 0: 12-ab.1245
5515 1:
5516\= Expect no match
5517    \
5518No match
5519    .a
5520No match
5521    -a
5522No match
5523    a-
5524No match
5525    a.
5526No match
5527    a_b
5528No match
5529    a.-
5530No match
5531    a..
5532No match
5533    ab..bc
5534No match
5535    the.quick.brown.fox-
5536No match
5537    the.quick.brown.fox.
5538No match
5539    the.quick.brown.fox_
5540No match
5541    the.quick.brown.fox+
5542No match
5543
5544/(?>.*)(?<=(abcd|wxyz))/
5545    alphabetabcd
5546 0: alphabetabcd
5547 1: abcd
5548    endingwxyz
5549 0: endingwxyz
5550 1: wxyz
5551\= Expect no match
5552    a rather long string that doesn't end with one of them
5553No match
5554
5555/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
5556    word cat dog elephant mussel cow horse canary baboon snake shark otherword
5557 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
5558\= Expect no match
5559    word cat dog elephant mussel cow horse canary baboon snake shark
5560No match
5561
5562/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
5563\= Expect no match
5564    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
5565No match
5566
5567/(?<=\d{3}(?!999))foo/
5568    999foo
5569 0: foo
5570    123999foo
5571 0: foo
5572\= Expect no match
5573    123abcfoo
5574No match
5575
5576/(?<=(?!...999)\d{3})foo/
5577    999foo
5578 0: foo
5579    123999foo
5580 0: foo
5581\= Expect no match
5582    123abcfoo
5583No match
5584
5585/(?<=\d{3}(?!999)...)foo/
5586    123abcfoo
5587 0: foo
5588    123456foo
5589 0: foo
5590\= Expect no match
5591    123999foo
5592No match
5593
5594/(?<=\d{3}...)(?<!999)foo/
5595    123abcfoo
5596 0: foo
5597    123456foo
5598 0: foo
5599\= Expect no match
5600    123999foo
5601No match
5602
5603/<a[\s]+href[\s]*=[\s]*          # find <a href=
5604 ([\"\'])?                       # find single or double quote
5605 (?(1) (.*?)\1 | ([^\s]+))       # if quote found, match up to next matching
5606                                 # quote, otherwise match up to next space
5607/isx
5608    <a href=abcd xyz
5609 0: <a href=abcd
5610 1: <unset>
5611 2: <unset>
5612 3: abcd
5613    <a href=\"abcd xyz pqr\" cats
5614 0: <a href="abcd xyz pqr"
5615 1: "
5616 2: abcd xyz pqr
5617    <a href=\'abcd xyz pqr\' cats
5618 0: <a href='abcd xyz pqr'
5619 1: '
5620 2: abcd xyz pqr
5621
5622/<a\s+href\s*=\s*                # find <a href=
5623 (["'])?                         # find single or double quote
5624 (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
5625                                 # quote, otherwise match up to next space
5626/isx
5627    <a href=abcd xyz
5628 0: <a href=abcd
5629 1: <unset>
5630 2: <unset>
5631 3: abcd
5632    <a href=\"abcd xyz pqr\" cats
5633 0: <a href="abcd xyz pqr"
5634 1: "
5635 2: abcd xyz pqr
5636    <a href       =       \'abcd xyz pqr\' cats
5637 0: <a href       =       'abcd xyz pqr'
5638 1: '
5639 2: abcd xyz pqr
5640
5641/<a\s+href(?>\s*)=(?>\s*)        # find <a href=
5642 (["'])?                         # find single or double quote
5643 (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
5644                                 # quote, otherwise match up to next space
5645/isx
5646    <a href=abcd xyz
5647 0: <a href=abcd
5648 1: <unset>
5649 2: <unset>
5650 3: abcd
5651    <a href=\"abcd xyz pqr\" cats
5652 0: <a href="abcd xyz pqr"
5653 1: "
5654 2: abcd xyz pqr
5655    <a href       =       \'abcd xyz pqr\' cats
5656 0: <a href       =       'abcd xyz pqr'
5657 1: '
5658 2: abcd xyz pqr
5659
5660/((Z)+|A)*/
5661    ZABCDEFG
5662 0: ZA
5663 1: A
5664 2: Z
5665
5666/(Z()|A)*/
5667    ZABCDEFG
5668 0: ZA
5669 1: A
5670 2:
5671
5672/(Z(())|A)*/
5673    ZABCDEFG
5674 0: ZA
5675 1: A
5676 2:
5677 3:
5678
5679/((?>Z)+|A)*/
5680    ZABCDEFG
5681 0: ZA
5682 1: A
5683
5684/((?>)+|A)*/
5685    ZABCDEFG
5686 0:
5687 1:
5688
5689/^[\d-a]/
5690    abcde
5691 0: a
5692    -things
5693 0: -
5694    0digit
5695 0: 0
5696\= Expect no match
5697    bcdef
5698No match
5699
5700/[\s]+/
5701    > \x09\x0a\x0c\x0d\x0b<
5702 0:  \x09\x0a\x0c\x0d\x0b
5703
5704/\s+/
5705    > \x09\x0a\x0c\x0d\x0b<
5706 0:  \x09\x0a\x0c\x0d\x0b
5707
5708/ab/x
5709    ab
5710 0: ab
5711
5712/(?!\A)x/m
5713    a\nxb\n
5714 0: x
5715
5716/(?!^)x/m
5717\= Expect no match
5718    a\nxb\n
5719No match
5720
5721#/abc\Qabc\Eabc/
5722#    abcabcabc
5723# 0: abcabcabc
5724
5725#/abc\Q(*+|\Eabc/
5726#    abc(*+|abc
5727# 0: abc(*+|abc
5728
5729#/   abc\Q abc\Eabc/x
5730#    abc abcabc
5731# 0: abc abcabc
5732#\= Expect no match
5733#    abcabcabc
5734#No match
5735
5736#/abc#comment
5737#    \Q#not comment
5738#    literal\E/x
5739#    abc#not comment\n    literal
5740# 0: abc#not comment\x0a    literal
5741
5742#/abc#comment
5743#    \Q#not comment
5744#    literal/x
5745#    abc#not comment\n    literal
5746# 0: abc#not comment\x0a    literal
5747
5748#/abc#comment
5749#    \Q#not comment
5750#    literal\E #more comment
5751#    /x
5752#    abc#not comment\n    literal
5753# 0: abc#not comment\x0a    literal
5754
5755#/abc#comment
5756#    \Q#not comment
5757#    literal\E #more comment/x
5758#    abc#not comment\n    literal
5759# 0: abc#not comment\x0a    literal
5760
5761#/\Qabc\$xyz\E/
5762#    abc\\\$xyz
5763# 0: abc\$xyz
5764
5765#/\Qabc\E\$\Qxyz\E/
5766#    abc\$xyz
5767# 0: abc$xyz
5768
5769/\Gabc/
5770    abc
5771 0: abc
5772\= Expect no match
5773    xyzabc
5774No match
5775
5776/a(?x: b c )d/
5777    XabcdY
5778 0: abcd
5779\= Expect no match
5780    Xa b c d Y
5781No match
5782
5783/((?x)x y z | a b c)/
5784    XabcY
5785 0: abc
5786 1: abc
5787    AxyzB
5788 0: xyz
5789 1: xyz
5790
5791/(?i)AB(?-i)C/
5792    XabCY
5793 0: abC
5794\= Expect no match
5795    XabcY
5796No match
5797
5798/((?i)AB(?-i)C|D)E/
5799    abCE
5800 0: abCE
5801 1: abC
5802    DE
5803 0: DE
5804 1: D
5805\= Expect no match
5806    abcE
5807No match
5808    abCe
5809No match
5810    dE
5811No match
5812    De
5813No match
5814
5815/(.*)\d+\1/
5816    abc123abc
5817 0: abc123abc
5818 1: abc
5819    abc123bc
5820 0: bc123bc
5821 1: bc
5822
5823/(.*)\d+\1/s
5824    abc123abc
5825 0: abc123abc
5826 1: abc
5827    abc123bc
5828 0: bc123bc
5829 1: bc
5830
5831/((.*))\d+\1/
5832    abc123abc
5833 0: abc123abc
5834 1: abc
5835 2: abc
5836    abc123bc
5837 0: bc123bc
5838 1: bc
5839 2: bc
5840
5841# This tests for an IPv6 address in the form where it can have up to
5842# eight components, one and only one of which is empty. This must be
5843# an internal component.
5844
5845/^(?!:)                       # colon disallowed at start
5846  (?:                         # start of item
5847    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or
5848    (?(1)0 | () ) )           # if null previously matched, fail; else null
5849    :                         # followed by colon
5850  ){1,7}                      # end item; 1-7 of them required
5851  [0-9a-f]{1,4} $             # final hex number at end of string
5852  (?(1)|.)                    # check that there was an empty component
5853  /ix
5854    a123::a123
5855 0: a123::a123
5856 1:
5857    a123:b342::abcd
5858 0: a123:b342::abcd
5859 1:
5860    a123:b342::324e:abcd
5861 0: a123:b342::324e:abcd
5862 1:
5863    a123:ddde:b342::324e:abcd
5864 0: a123:ddde:b342::324e:abcd
5865 1:
5866    a123:ddde:b342::324e:dcba:abcd
5867 0: a123:ddde:b342::324e:dcba:abcd
5868 1:
5869    a123:ddde:9999:b342::324e:dcba:abcd
5870 0: a123:ddde:9999:b342::324e:dcba:abcd
5871 1:
5872\= Expect no match
5873    1:2:3:4:5:6:7:8
5874No match
5875    a123:bce:ddde:9999:b342::324e:dcba:abcd
5876No match
5877    a123::9999:b342::324e:dcba:abcd
5878No match
5879    abcde:2:3:4:5:6:7:8
5880No match
5881    ::1
5882No match
5883    abcd:fee0:123::
5884No match
5885    :1
5886No match
5887    1:
5888No match
5889
5890#/[z\Qa-d]\E]/
5891#    z
5892# 0: z
5893#    a
5894# 0: a
5895#    -
5896# 0: -
5897#    d
5898# 0: d
5899#    ]
5900# 0: ]
5901#\= Expect no match
5902#    b
5903#No match
5904
5905#TODO: PCRE has an optimization to make this workable, .NET does not
5906#/(a+)*b/
5907#\= Expect no match
5908#    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
5909#No match
5910
5911# All these had to be updated because we understand unicode
5912# and this looks like it's expecting single byte matches
5913
5914# .NET generates \xe4...not sure what's up, might just be different code pages
5915/(?i)reg(?:ul(?:[aä]|ae)r|ex)/
5916    REGular
5917 0: REGular
5918    regulaer
5919 0: regulaer
5920    Regex
5921 0: Regex
5922    regulär
5923 0: regul\xc3\xa4r
5924
5925#/Åæåä[à-ÿÀ-ß]+/
5926#    Åæåäà
5927# 0: \xc5\xe6\xe5\xe4\xe0
5928#    Åæåäÿ
5929# 0: \xc5\xe6\xe5\xe4\xff
5930#    ÅæåäÀ
5931# 0: \xc5\xe6\xe5\xe4\xc0
5932#    Åæåäß
5933# 0: \xc5\xe6\xe5\xe4\xdf
5934
5935/(?<=Z)X./
5936    \x84XAZXB
5937 0: XB
5938
5939/ab cd (?x) de fg/
5940    ab cd defg
5941 0: ab cd defg
5942
5943/ab cd(?x) de fg/
5944    ab cddefg
5945 0: ab cddefg
5946\= Expect no match
5947    abcddefg
5948No match
5949
5950/(?<![^f]oo)(bar)/
5951    foobarX
5952 0: bar
5953 1: bar
5954\= Expect no match
5955    boobarX
5956No match
5957
5958/(?<![^f])X/
5959    offX
5960 0: X
5961\= Expect no match
5962    onyX
5963No match
5964
5965/(?<=[^f])X/
5966    onyX
5967 0: X
5968\= Expect no match
5969    offX
5970No match
5971
5972/(?:(?(1)a|b)(X))+/
5973    bXaX
5974 0: bXaX
5975 1: X
5976
5977/(?:(?(1)\1a|b)(X|Y))+/
5978    bXXaYYaY
5979 0: bXXaYYaY
5980 1: Y
5981    bXYaXXaX
5982 0: bX
5983 1: X
5984
5985# TODO: I think this is a difference caused by the
5986# collision of group numbers, but not sure
5987#/()()()()()()()()()(?:(?(10)\10a|b)(X|Y))+/
5988#    bXXaYYaY
5989# 0: bX
5990# 1:
5991# 2:
5992# 3:
5993# 4:
5994# 5:
5995# 6:
5996# 7:
5997# 8:
5998# 9:
5999#10: X
6000
6001/[[,abc,]+]/
6002    abc]
6003 0: abc]
6004    a,b]
6005 0: a,b]
6006    [a,b,c]
6007 0: [a,b,c]
6008
6009/(?-x: )/x
6010    A\x20B
6011 0:
6012
6013"(?x)(?-x: \s*#\s*)"
6014    A # B
6015 0:  #
6016\= Expect no match
6017    #
6018No match
6019
6020"(?x-is)(?:(?-ixs) \s*#\s*) include"
6021    A #include
6022 0:  #include
6023\= Expect no match
6024    A#include
6025No match
6026    A #Include
6027No match
6028
6029/a*b*\w/
6030    aaabbbb
6031 0: aaabbbb
6032    aaaa
6033 0: aaaa
6034    a
6035 0: a
6036
6037/a*b?\w/
6038    aaabbbb
6039 0: aaabb
6040    aaaa
6041 0: aaaa
6042    a
6043 0: a
6044
6045/a*b{0,4}\w/
6046    aaabbbb
6047 0: aaabbbb
6048    aaaa
6049 0: aaaa
6050    a
6051 0: a
6052
6053/a*b{0,}\w/
6054    aaabbbb
6055 0: aaabbbb
6056    aaaa
6057 0: aaaa
6058    a
6059 0: a
6060
6061/a*\d*\w/
6062    0a
6063 0: 0a
6064    a
6065 0: a
6066
6067/a*b *\w/x
6068    a
6069 0: a
6070
6071/a*b#comment
6072  *\w/x
6073    a
6074 0: a
6075
6076/a* b *\w/x
6077    a
6078 0: a
6079
6080/^\w+=.*(\\\n.*)*/
6081    abc=xyz\\\npqr
6082 0: abc=xyz\
6083
6084/(?=(\w+))\1:/
6085    abcd:
6086 0: abcd:
6087 1: abcd
6088
6089/^(?=(\w+))\1:/
6090    abcd:
6091 0: abcd:
6092 1: abcd
6093
6094#/^\Eabc/
6095#    abc
6096# 0: abc
6097
6098#/^[\Eabc]/
6099#    a
6100# 0: a
6101#\= Expect no match
6102#    E
6103#No match
6104
6105#/^[a-\Ec]/
6106#    b
6107# 0: b
6108#\= Expect no match
6109#    -
6110#No match
6111#    E
6112#No match
6113
6114#/^[a\E\E-\Ec]/
6115#    b
6116# 0: b
6117#\= Expect no match
6118#    -
6119#No match
6120#    E
6121#No match
6122
6123#/^[\E\Qa\E-\Qz\E]+/
6124#    b
6125# 0: b
6126#\= Expect no match
6127#    -
6128#No match
6129
6130#/^[a\Q]bc\E]/
6131#    a
6132# 0: a
6133#    ]
6134# 0: ]
6135#    c
6136# 0: c
6137
6138#/^[a-\Q\E]/
6139#    a
6140# 0: a
6141#    -
6142# 0: -
6143
6144/^(a()*)*/
6145    aaaa
6146 0: aaaa
6147 1: a
6148 2:
6149
6150/^(?:a(?:(?:))*)*/
6151    aaaa
6152 0: aaaa
6153
6154/^(a()+)+/
6155    aaaa
6156 0: aaaa
6157 1: a
6158 2:
6159
6160/^(?:a(?:(?:))+)+/
6161    aaaa
6162 0: aaaa
6163
6164/(a){0,3}(?(1)b|(c|))*D/
6165    abbD
6166 0: abbD
6167 1: a
6168    ccccD
6169 0: ccccD
6170 1: <unset>
6171 2:
6172    D
6173 0: D
6174 1: <unset>
6175 2:
6176
6177# this is really long with debug -- removing for now
6178#/(a|)*\d/
6179#    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
6180# 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
6181# 1:
6182#\= Expect no match
6183#    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
6184#No match
6185
6186/(?>a|)*\d/
6187    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
6188 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
6189\= Expect no match
6190    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
6191No match
6192
6193/(?:a|)*\d/
6194    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
6195 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
6196\= Expect no match
6197    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
6198No match
6199
6200/^(?s)(?>.*)(?<!\n)/
6201    abc
6202 0: abc
6203\= Expect no match
6204    abc\n
6205No match
6206
6207/^(?![^\n]*\n\z)/
6208    abc
6209 0:
6210\= Expect no match
6211    abc\n
6212No match
6213
6214/\z(?<!\n)/
6215    abc
6216 0:
6217\= Expect no match
6218    abc\n
6219No match
6220
6221/(.*(.)?)*/
6222    abcd
6223 0: abcd
6224 1:
6225
6226/( (A | (?(1)0|) )*   )/x
6227    abcd
6228 0:
6229 1:
6230 2:
6231
6232/( ( (?(1)0|) )*   )/x
6233    abcd
6234 0:
6235 1:
6236 2:
6237
6238/(  (?(1)0|)*   )/x
6239    abcd
6240 0:
6241 1:
6242
6243/[[:abcd:xyz]]/
6244    a]
6245 0: a]
6246    :]
6247 0: :]
6248
6249/[abc[:x\]pqr]/
6250    a
6251 0: a
6252    [
6253 0: [
6254    :
6255 0: :
6256    ]
6257 0: ]
6258    p
6259 0: p
6260
6261/.*[op][xyz]/
6262\= Expect no match
6263    fooabcfoo
6264No match
6265
6266/(?(?=.*b)b|^)/
6267    adc
6268 0:
6269    abc
6270 0: b
6271
6272/(?(?=^.*b)b|^)/
6273    adc
6274 0:
6275\= Expect no match
6276    abc
6277No match
6278
6279/(?(?=.*b)b|^)*/
6280    adc
6281 0:
6282    abc
6283 0:
6284
6285/(?(?=.*b)b|^)+/
6286    adc
6287 0:
6288    abc
6289 0: b
6290
6291/(?(?=b).*b|^d)/
6292    abc
6293 0: b
6294
6295/(?(?=.*b).*b|^d)/
6296    abc
6297 0: ab
6298
6299/^%((?(?=[a])[^%])|b)*%$/
6300    %ab%
6301 0: %ab%
6302 1:
6303
6304/(?i)a(?-i)b|c/
6305    XabX
6306 0: ab
6307    XAbX
6308 0: Ab
6309    CcC
6310 0: c
6311\= Expect no match
6312    XABX
6313No match
6314
6315/[\x00-\xff\s]+/
6316    \x0a\x0b\x0c\x0d
6317 0: \x0a\x0b\x0c\x0d
6318
6319/(abc)\1/i
6320\= Expect no match
6321    abc
6322No match
6323
6324/(abc)\1/
6325\= Expect no match
6326    abc
6327No match
6328
6329/[^a]*/i
6330    12abc
6331 0: 12
6332    12ABC
6333 0: 12
6334
6335#Posses
6336/[^a]*/i
6337    12abc
6338 0: 12
6339    12ABC
6340 0: 12
6341
6342/[^a]*?X/i
6343\= Expect no match
6344    12abc
6345No match
6346    12ABC
6347No match
6348
6349/[^a]+?X/i
6350\= Expect no match
6351    12abc
6352No match
6353    12ABC
6354No match
6355
6356/[^a]?X/i
6357    12aXbcX
6358 0: X
6359    12AXBCX
6360 0: X
6361    BCX
6362 0: CX
6363
6364/[^a]??X/i
6365    12aXbcX
6366 0: X
6367    12AXBCX
6368 0: X
6369    BCX
6370 0: CX
6371
6372/[^a]{2,3}/i
6373    abcdef
6374 0: bcd
6375    ABCDEF
6376 0: BCD
6377
6378/[^a]{2,3}?/i
6379    abcdef
6380 0: bc
6381    ABCDEF
6382 0: BC
6383
6384/((a|)+)+Z/
6385    Z
6386 0: Z
6387 1:
6388 2:
6389
6390/(a)b|(a)c/
6391    ac
6392 0: ac
6393 1: <unset>
6394 2: a
6395
6396/(?>(a))b|(a)c/
6397    ac
6398 0: ac
6399 1: <unset>
6400 2: a
6401
6402/(?=(a))ab|(a)c/
6403    ac
6404 0: ac
6405 1: <unset>
6406 2: a
6407
6408/((?>(a))b|(a)c)/
6409    ac
6410 0: ac
6411 1: ac
6412 2: <unset>
6413 3: a
6414
6415/(?=(?>(a))b|(a)c)(..)/
6416    ac
6417 0: ac
6418 1: <unset>
6419 2: a
6420 3: ac
6421
6422/(?>(?>(a))b|(a)c)/
6423    ac
6424 0: ac
6425 1: <unset>
6426 2: a
6427
6428/((?>(a+)b)+(aabab))/
6429    aaaabaaabaabab
6430 0: aaaabaaabaabab
6431 1: aaaabaaabaabab
6432 2: aaa
6433 3: aabab
6434
6435/(?>a+|ab)+?c/
6436\= Expect no match
6437    aabc
6438No match
6439
6440/(?>a+|ab)+c/
6441\= Expect no match
6442    aabc
6443No match
6444
6445/(?:a+|ab)+c/
6446    aabc
6447 0: aabc
6448
6449/^(?:a|ab)+c/
6450    aaaabc
6451 0: aaaabc
6452
6453/(?=abc){0}xyz/
6454    xyz
6455 0: xyz
6456
6457/(?=abc){1}xyz/
6458\= Expect no match
6459    xyz
6460No match
6461
6462/(?=(a))?./
6463    ab
6464 0: a
6465 1: a
6466    bc
6467 0: b
6468
6469/(?=(a))??./
6470    ab
6471 0: a
6472    bc
6473 0: b
6474
6475/^(?!a){0}\w+/
6476    aaaaa
6477 0: aaaaa
6478
6479/(?<=(abc))?xyz/
6480    abcxyz
6481 0: xyz
6482 1: abc
6483    pqrxyz
6484 0: xyz
6485
6486/^[g<a>]+/
6487    ggg<<<aaa>>>
6488 0: ggg<<<aaa>>>
6489\= Expect no match
6490    \\ga
6491No match
6492
6493/^[ga]+/
6494    gggagagaxyz
6495 0: gggagaga
6496
6497/[:a]xxx[b:]/
6498     :xxx:
6499 0: :xxx:
6500
6501/(?<=a{2})b/i
6502    xaabc
6503 0: b
6504\= Expect no match
6505    xabc
6506No match
6507
6508/(?<!a{2})b/i
6509    xabc
6510 0: b
6511\= Expect no match
6512    xaabc
6513No match
6514
6515/(?<=[^a]{2})b/
6516    axxbc
6517 0: b
6518    aAAbc
6519 0: b
6520\= Expect no match
6521    xaabc
6522No match
6523
6524/(?<=[^a]{2})b/i
6525    axxbc
6526 0: b
6527\= Expect no match
6528    aAAbc
6529No match
6530    xaabc
6531No match
6532
6533#/(?|(abc)|(xyz))\1/
6534#    abcabc
6535# 0: abcabc
6536# 1: abc
6537#    xyzxyz
6538# 0: xyzxyz
6539# 1: xyz
6540#\= Expect no match
6541#    abcxyz
6542#No match
6543#    xyzabc
6544#No match
6545
6546#/(?|(abc)|(xyz))(?1)/
6547#    abcabc
6548# 0: abcabc
6549# 1: abc
6550#    xyzabc
6551# 0: xyzabc
6552# 1: xyz
6553#\= Expect no match
6554#    xyzxyz
6555#No match
6556
6557#/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/
6558#    XYabcdY
6559# 0: XYabcdY
6560# 1: a
6561# 2: b
6562# 3: c
6563# 4: d
6564# 5: Y
6565
6566#/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/
6567#    XYabcdY
6568# 0: XYabcdY
6569# 1: a
6570# 2: b
6571# 3: <unset>
6572# 4: <unset>
6573# 5: c
6574# 6: d
6575# 7: Y
6576
6577#/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/
6578#    XYabcdY
6579# 0: XYabcdY
6580# 1: a
6581# 2: b
6582# 3: <unset>
6583# 4: <unset>
6584# 5: c
6585# 6: d
6586# 7: Y
6587
6588/(?'abc'\w+):\k<abc>{2}/
6589    a:aaxyz
6590 0: a:aa
6591 1: a
6592    ab:ababxyz
6593 0: ab:abab
6594 1: ab
6595\= Expect no match
6596    a:axyz
6597No match
6598    ab:abxyz
6599No match
6600
6601/^(?<ab>a)? (?(ab)b|c) (?(ab)d|e)/x
6602    abd
6603 0: abd
6604 1: a
6605    ce
6606 0: ce
6607
6608# .NET has more consistent grouping numbers with these dupe groups for the two options
6609/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?(quote)[a-z]+|[0-9]+)/x,dupnames
6610    a\"aaaaa
6611 0: a"aaaaa
6612 1: "
6613 2: <unset>
6614 3: "
6615    b\"aaaaa
6616 0: b"aaaaa
6617 1: "
6618 2: <unset>
6619 3: "
6620\= Expect no match
6621    b\"11111
6622No match
6623
6624#/(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/
6625#    0
6626# 0: 0
6627# 1: 0
6628#    00
6629# 0: 00
6630# 1: 00
6631# 2: 0
6632#    0000
6633# 0: 0000
6634# 1: 0000
6635# 2: 0
6636
6637#/(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/
6638#    0
6639# 0: 0
6640# 1: 0
6641# 2: 0
6642#    00
6643# 0: 0
6644# 1: 0
6645# 2: 0
6646#    0000
6647# 0: 0
6648# 1: 0
6649# 2: 0
6650
6651# Check the use of names for failure
6652
6653# Check opening parens in comment when seeking forward reference.
6654
6655#/(?P<abn>(?P=abn)xxx|)+/
6656#    xxx
6657# 0:
6658# 1:
6659
6660#Posses
6661/^(a)?(\w)/
6662    aaaaX
6663 0: aa
6664 1: a
6665 2: a
6666    YZ
6667 0: Y
6668 1: <unset>
6669 2: Y
6670
6671#Posses
6672/^(?:a)?(\w)/
6673    aaaaX
6674 0: aa
6675 1: a
6676    YZ
6677 0: Y
6678 1: Y
6679
6680/\A.*?(a|bc)/
6681    ba
6682 0: ba
6683 1: a
6684
6685/\A.*?(?:a|bc|d)/
6686    ba
6687 0: ba
6688
6689# --------------------------
6690
6691/(another)?(\1?)test/
6692    hello world test
6693 0: test
6694 1: <unset>
6695 2:
6696
6697/(another)?(\1+)test/
6698\= Expect no match
6699    hello world test
6700No match
6701
6702/((?:a?)*)*c/
6703    aac
6704 0: aac
6705 1:
6706
6707/((?>a?)*)*c/
6708    aac
6709 0: aac
6710 1:
6711
6712/(?>.*?a)(?<=ba)/
6713    aba
6714 0: ba
6715
6716/(?:.*?a)(?<=ba)/
6717    aba
6718 0: aba
6719
6720/(?>.*?a)b/s
6721    aab
6722 0: ab
6723
6724/(?>.*?a)b/
6725    aab
6726 0: ab
6727
6728/(?>^a)b/s
6729\= Expect no match
6730    aab
6731No match
6732
6733/(?>.*?)(?<=(abcd)|(wxyz))/
6734    alphabetabcd
6735 0:
6736 1: abcd
6737    endingwxyz
6738 0:
6739 1: <unset>
6740 2: wxyz
6741
6742/(?>.*)(?<=(abcd)|(wxyz))/
6743    alphabetabcd
6744 0: alphabetabcd
6745 1: abcd
6746    endingwxyz
6747 0: endingwxyz
6748 1: <unset>
6749 2: wxyz
6750
6751"(?>.*)foo"
6752\= Expect no match
6753    abcdfooxyz
6754No match
6755
6756"(?>.*?)foo"
6757    abcdfooxyz
6758 0: foo
6759
6760# Tests that try to figure out how Perl works. My hypothesis is that the first
6761# verb that is backtracked onto is the one that acts. This seems to be the case
6762# almost all the time, but there is one exception that is perhaps a bug.
6763
6764/a(?=bc).|abd/
6765    abd
6766 0: abd
6767    abc
6768 0: ab
6769
6770/a(?>bc)d|abd/
6771    abceabd
6772 0: abd
6773
6774# These tests were formerly in test 2, but changes in PCRE and Perl have
6775# made them compatible.
6776
6777/^(a)?(?(1)a|b)+$/
6778\= Expect no match
6779    a
6780No match
6781
6782# ----
6783
6784/^\d*\w{4}/
6785    1234
6786 0: 1234
6787\= Expect no match
6788    123
6789No match
6790
6791/^[^b]*\w{4}/
6792    aaaa
6793 0: aaaa
6794\= Expect no match
6795    aaa
6796No match
6797
6798/^[^b]*\w{4}/i
6799    aaaa
6800 0: aaaa
6801\= Expect no match
6802    aaa
6803No match
6804
6805/^a*\w{4}/
6806    aaaa
6807 0: aaaa
6808\= Expect no match
6809    aaa
6810No match
6811
6812/^a*\w{4}/i
6813    aaaa
6814 0: aaaa
6815\= Expect no match
6816    aaa
6817No match
6818
6819/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
6820    foofoo
6821 0: foofoo
6822 1: foo
6823    barbar
6824 0: barbar
6825 1: bar
6826
6827# A notable difference between PCRE and .NET.  According to
6828# the PCRE docs:
6829# If you make a subroutine call to a non-unique named
6830# subpattern, the one that corresponds  to  the first
6831# occurrence of the name is used. In the absence of
6832# duplicate numbers (see the previous section) this is
6833# the one with the lowest number.
6834# .NET takes the most recently captured number according to MSDN:
6835# A backreference refers to the most recent definition of
6836# a group (the definition most immediately to the left,
6837# when matching left to right). When a group makes multiple
6838# captures, a backreference refers to the most recent capture.
6839
6840#/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
6841#    AfooA
6842# 0: AfooA
6843# 1: A
6844# 2: foo
6845#    AbarA
6846# 0: AbarA
6847# 1: A
6848# 2: <unset>
6849# 3: bar
6850#\= Expect no match
6851#    Afoofoo
6852#No match
6853#    Abarbar
6854#No match
6855
6856/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
6857    1 IN SOA non-sp1 non-sp2(
6858 0: 1 IN SOA non-sp1 non-sp2(
6859 1: 1
6860 2: non-sp1
6861 3: non-sp2
6862
6863# TODO: .NET's group number ordering here in the second example is a bit odd
6864/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?(A)x) (?(B)y)$/x,dupnames
6865    Ax
6866 0: Ax
6867 1: A
6868    BAxy
6869 0: BAxy
6870 1: A
6871 2: B
6872
6873/ ^ a + b $ /x
6874    aaaab
6875 0: aaaab
6876
6877/ ^ a + #comment
6878   b $ /x
6879    aaaab
6880 0: aaaab
6881
6882/ ^ a + #comment
6883  #comment
6884   b $ /x
6885    aaaab
6886 0: aaaab
6887
6888/ ^ (?> a + ) b $ /x
6889    aaaab
6890 0: aaaab
6891
6892/ ^ ( a + ) + \w $ /x
6893    aaaab
6894 0: aaaab
6895 1: aaaa
6896
6897/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/
6898\= Expect no match
6899    acb
6900No match
6901
6902#Posses
6903#/\A(?:[^\"]+|\"(?:[^\"]*|\"\")*\")+/
6904#    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
6905# 0: NON QUOTED "QUOT""ED" AFTER
6906
6907#Posses
6908#/\A(?:[^\"]+|\"(?:[^\"]+|\"\")*\")+/
6909#    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
6910# 0: NON QUOTED "QUOT""ED" AFTER
6911
6912#Posses
6913#/\A(?:[^\"]+|\"(?:[^\"]+|\"\")+\")+/
6914#    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
6915# 0: NON QUOTED "QUOT""ED" AFTER
6916
6917#Posses
6918#/\A([^\"1]+|[\"2]([^\"3]*|[\"4][\"5])*[\"6])+/
6919#    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
6920# 0: NON QUOTED "QUOT""ED" AFTER
6921# 1:  AFTER
6922# 2:
6923
6924/^\w+(?>\s*)(?<=\w)/
6925    test test
6926 0: tes
6927
6928#/(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/
6929#    acl
6930# 0: acl
6931# 1: a
6932#    bdl
6933# 0: bdl
6934# 1: <unset>
6935# 2: b
6936#    adl
6937# 0: dl
6938#    bcl
6939# 0: l
6940
6941/\sabc/
6942    \x0babc
6943 0: \x0babc
6944
6945#/[\Qa]\E]+/
6946#    aa]]
6947# 0: aa]]
6948
6949#/[\Q]a\E]+/
6950#    aa]]
6951# 0: aa]]
6952
6953/A((((((((a))))))))\8B/
6954    AaaB
6955 0: AaaB
6956 1: a
6957 2: a
6958 3: a
6959 4: a
6960 5: a
6961 6: a
6962 7: a
6963 8: a
6964
6965/A(((((((((a)))))))))\9B/
6966    AaaB
6967 0: AaaB
6968 1: a
6969 2: a
6970 3: a
6971 4: a
6972 5: a
6973 6: a
6974 7: a
6975 8: a
6976 9: a
6977
6978/(|ab)*?d/
6979    abd
6980 0: abd
6981 1: ab
6982    xyd
6983 0: d
6984
6985/(\2|a)(\1)/
6986    aaa
6987 0: aa
6988 1: a
6989 2: a
6990
6991/(\2)(\1)/
6992
6993"Z*(|d*){216}"
6994
6995/((((((((((((x))))))))))))\12/
6996    xx
6997 0: xx
6998 1: x
6999 2: x
7000 3: x
7001 4: x
7002 5: x
7003 6: x
7004 7: x
7005 8: x
7006 9: x
700710: x
700811: x
700912: x
7010
7011#"(?|(\k'Pm')|(?'Pm'))"
7012#    abcd
7013# 0:
7014# 1:
7015
7016#/(?|(aaa)|(b))\g{1}/
7017#    aaaaaa
7018# 0: aaaaaa
7019# 1: aaa
7020#    bb
7021# 0: bb
7022# 1: b
7023
7024#/(?|(aaa)|(b))(?1)/
7025#    aaaaaa
7026# 0: aaaaaa
7027# 1: aaa
7028#    baaa
7029# 0: baaa
7030# 1: b
7031#\= Expect no match
7032#    bb
7033#No match
7034
7035#/(?|(aaa)|(b))/
7036#    xaaa
7037# 0: aaa
7038# 1: aaa
7039#    xbc
7040# 0: b
7041# 1: b
7042
7043#/(?|(?'a'aaa)|(?'a'b))\k'a'/
7044#    aaaaaa
7045# 0: aaaaaa
7046# 1: aaa
7047#    bb
7048# 0: bb
7049# 1: b
7050
7051#/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames
7052#    aaaccccaaa
7053# 0: aaaccccaaa
7054# 1: aaa
7055# 2: cccc
7056#    bccccb
7057# 0: bccccb
7058# 1: b
7059# 2: cccc
7060
7061# End of testinput1
7062