# This set of tests check the DFA matching functionality of pcre2_dfa_match(),
# excluding UTF and Unicode property support. All matches are done using DFA,
# forced by setting a default subject modifier at the start.
    
#forbid_utf
#subject dfa
#newline_default lf anycrlf any
     
/abc/
    abc
 0: abc
    
/ab*c/
    abc
 0: abc
    abbbbc
 0: abbbbc
    ac
 0: ac
    
/ab+c/
    abc
 0: abc
    abbbbbbc
 0: abbbbbbc
\= Expect no match 
    ac
No match
    ab
No match
    
/a*/no_auto_possess
    a
 0: a
 1: 
    aaaaaaaaaaaaaaaaa
Matched, but offsets vector is too small to show all matches
 0: aaaaaaaaaaaaaaaaa
 1: aaaaaaaaaaaaaaaa
 2: aaaaaaaaaaaaaaa
 3: aaaaaaaaaaaaaa
 4: aaaaaaaaaaaaa
 5: aaaaaaaaaaaa
 6: aaaaaaaaaaa
 7: aaaaaaaaaa
 8: aaaaaaaaa
 9: aaaaaaaa
10: aaaaaaa
11: aaaaaa
12: aaaaa
13: aaaa
14: aaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=ovector=10 
Matched, but offsets vector is too small to show all matches
 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaa
 3: aaaaaaaaaaaaaaaaaaaaaaaaaaa
 4: aaaaaaaaaaaaaaaaaaaaaaaaaa
 5: aaaaaaaaaaaaaaaaaaaaaaaaa
 6: aaaaaaaaaaaaaaaaaaaaaaaa
 7: aaaaaaaaaaaaaaaaaaaaaaa
 8: aaaaaaaaaaaaaaaaaaaaaa
 9: aaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=dfa_shortest
 0: 
    
/(a|abcd|african)/
    a
 0: a
    abcd
 0: abcd
 1: a
    african
 0: african
 1: a
    
/^abc/
    abcdef
 0: abc
\= Expect no match
    xyzabc
No match
    xyz\nabc    
No match
    
/^abc/m
    abcdef
 0: abc
    xyz\nabc    
 0: abc
\= Expect no match
    xyzabc
No match
    
/\Aabc/
    abcdef
 0: abc
\= Expect no match
    xyzabc
No match
    xyz\nabc    
No match
    
/\Aabc/m
    abcdef
 0: abc
\= Expect no match
    xyzabc
No match
    xyz\nabc    
No match
    
/\Gabc/
    abcdef
 0: abc
    xyzabc\=offset=3
 0: abc
\= Expect no match
    xyzabc    
No match
    xyzabc\=offset=2
No match
    
/x\dy\Dz/
    x9yzz
 0: x9yzz
    x0y+z
 0: x0y+z
\= Expect no match
    xyz
No match
    xxy0z     
No match
    
/x\sy\Sz/
    x yzz
 0: x yzz
    x y+z
 0: x y+z
\= Expect no match
    xyz
No match
    xxyyz
No match
    
/x\wy\Wz/
    xxy+z
 0: xxy+z
\= Expect no match
    xxy0z
No match
    x+y+z         
No match
    
/x.y/
    x+y
 0: x+y
    x-y
 0: x-y
\= Expect no match
    x\ny
No match
    
/x.y/s
    x+y
 0: x+y
    x-y
 0: x-y
    x\ny
 0: x\x0ay

/(a.b(?s)c.d|x.y)p.q/
    a+bc+dp+q
 0: a+bc+dp+q
    a+bc\ndp+q
 0: a+bc\x0adp+q
    x\nyp+q 
 0: x\x0ayp+q
\= Expect no match 
    a\nbc\ndp+q
No match
    a+bc\ndp\nq
No match
    x\nyp\nq 
No match

/a\d\z/
    ba0
 0: a0
\= Expect no match
    ba0\n
No match
    ba0\ncd   
No match

/a\d\z/m
    ba0
 0: a0
\= Expect no match
    ba0\n
No match
    ba0\ncd   
No match

/a\d\Z/
    ba0
 0: a0
    ba0\n
 0: a0
\= Expect no match
    ba0\ncd   
No match

/a\d\Z/m
    ba0
 0: a0
    ba0\n
 0: a0
\= Expect no match
    ba0\ncd   
No match

/a\d$/
    ba0
 0: a0
    ba0\n
 0: a0
\= Expect no match
    ba0\ncd   
No match

/a\d$/m
    ba0
 0: a0
    ba0\n
 0: a0
    ba0\ncd   
 0: a0

/abc/i
    abc
 0: abc
    aBc
 0: aBc
    ABC
 0: ABC
    
/[^a]/
    abcd
 0: b
    
/ab?\w/
    abz
 0: abz
 1: ab
    abbz
 0: abb
 1: ab
    azz  
 0: az

/x{0,3}yz/
    ayzq
 0: yz
    axyzq
 0: xyz
    axxyz
 0: xxyz
    axxxyzq
 0: xxxyz
    axxxxyzq
 0: xxxyz
\= Expect no match
    ax
No match
    axx     
No match
      
/x{3}yz/
    axxxyzq
 0: xxxyz
    axxxxyzq
 0: xxxyz
\= Expect no match
    ax
No match
    axx     
No match
    ayzq
No match
    axyzq
No match
    axxyz
No match
      
/x{2,3}yz/
    axxyz
 0: xxyz
    axxxyzq
 0: xxxyz
    axxxxyzq
 0: xxxyz
\= Expect no match
    ax
No match
    axx     
No match
    ayzq
No match
    axyzq
No match
      
/[^a]+/no_auto_possess
    bac
 0: b
    bcdefax
 0: bcdef
 1: bcde
 2: bcd
 3: bc
 4: b
\= Expect no match
    aaaaa   
No match

/[^a]*/no_auto_possess
    bac
 0: b
 1: 
    bcdefax
 0: bcdef
 1: bcde
 2: bcd
 3: bc
 4: b
 5: 
    aaaaa   
 0: 
    
/[^a]{3,5}/no_auto_possess
    xyz
 0: xyz
    awxyza
 0: wxyz
 1: wxy
    abcdefa
 0: bcdef
 1: bcde
 2: bcd
    abcdefghijk
 0: bcdef
 1: bcde
 2: bcd
\= Expect no match
    axya
No match
    axa
No match
    aaaaa         
No match

/\d*/
    1234b567
 0: 1234
    xyz
 0: 
    
/\D*/
    a1234b567
 0: a
    xyz
 0: xyz
     
/\d+/
    ab1234c56
 0: 1234
\= Expect no match
    xyz
No match
    
/\D+/
    ab123c56
 0: ab
\= Expect no match
    789
No match
    
/\d?A/
    045ABC
 0: 5A
    ABC
 0: A
\= Expect no match
    XYZ
No match
    
/\D?A/
    ABC
 0: A
    BAC
 0: BA
    9ABC             
 0: A

/a+/
    aaaa
 0: aaaa

/^.*xyz/
    xyz
 0: xyz
    ggggggggxyz
 0: ggggggggxyz
    
/^.+xyz/
    abcdxyz
 0: abcdxyz
    axyz
 0: axyz
\= Expect no match
    xyz
No match
    
/^.?xyz/
    xyz
 0: xyz
    cxyz       
 0: cxyz

/^\d{2,3}X/
    12X
 0: 12X
    123X
 0: 123X
\= Expect no match
    X
No match
    1X
No match
    1234X     
No match

/^[abcd]\d/
    a45
 0: a4
    b93
 0: b9
    c99z
 0: c9
    d04
 0: d0
\= Expect no match
    e45
No match
    abcd      
No match
    abcd1234
No match
    1234  
No match

/^[abcd]*\d/
    a45
 0: a4
    b93
 0: b9
    c99z
 0: c9
    d04
 0: d0
    abcd1234
 0: abcd1
    1234  
 0: 1
\= Expect no match
    e45
No match
    abcd      
No match

/^[abcd]+\d/
    a45
 0: a4
    b93
 0: b9
    c99z
 0: c9
    d04
 0: d0
    abcd1234
 0: abcd1
\= Expect no match
    1234  
No match
    e45
No match
    abcd      
No match

/^a+X/
    aX
 0: aX
    aaX 
 0: aaX

/^[abcd]?\d/
    a45
 0: a4
    b93
 0: b9
    c99z
 0: c9
    d04
 0: d0
    1234  
 0: 1
\= Expect no match
    abcd1234
No match
    e45
No match

/^[abcd]{2,3}\d/
    ab45
 0: ab4
    bcd93
 0: bcd9
\= Expect no match
    1234 
No match
    a36 
No match
    abcd1234
No match
    ee45
No match

/^(abc)*\d/
    abc45
 0: abc4
    abcabcabc45
 0: abcabcabc4
    42xyz 
 0: 4

/^(abc)+\d/
    abc45
 0: abc4
    abcabcabc45
 0: abcabcabc4
\= Expect no match
    42xyz 
No match

/^(abc)?\d/
    abc45
 0: abc4
    42xyz 
 0: 4
\= Expect no match
    abcabcabc45
No match

/^(abc){2,3}\d/
    abcabc45
 0: abcabc4
    abcabcabc45
 0: abcabcabc4
\= Expect no match
    abcabcabcabc45
No match
    abc45
No match
    42xyz 
No match

/1(abc|xyz)2(?1)3/
    1abc2abc3456
 0: 1abc2abc3
    1abc2xyz3456 
 0: 1abc2xyz3

/^(a*\w|ab)=(a*\w|ab)/
    ab=ab
 0: ab=ab
 1: ab=a

/^(a*\w|ab)=(?1)/
    ab=ab
 0: ab=ab
 1: ab=a

/^([^()]|\((?1)*\))*$/
    abc
 0: abc
    a(b)c
 0: a(b)c
    a(b(c))d  
 0: a(b(c))d
\= Expect no match)
    a(b(c)d  
No match

/^>abc>([^()]|\((?1)*\))*<xyz<$/
    >abc>123<xyz<
 0: >abc>123<xyz<
    >abc>1(2)3<xyz<
 0: >abc>1(2)3<xyz<
    >abc>(1(2)3)<xyz<
 0: >abc>(1(2)3)<xyz<

/^(?>a*)\d/
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876
 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9
\= Expect no match 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match

/< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/x
    <>
 0: <>
    <abcd>
 0: <abcd>
    <abc <123> hij>
 0: <abc <123> hij>
    <abc <def> hij>
 0: <def>
    <abc<>def> 
 0: <abc<>def>
    <abc<>      
 0: <>
\= Expect no match
    <abc
No match

/^(?(?=abc)\w{3}:|\d\d)$/
    abc:                          
 0: abc:
    12                             
 0: 12
\= Expect no match                     
    123                       
No match
    xyz                        
No match
                                
/^(?(?!abc)\d\d|\w{3}:)$/
    abc:                        
 0: abc:
    12         
 0: 12
\= Expect no match
    123
No match
    xyz    
No match

/^(?=abc)\w{5}:$/
    abcde:                          
 0: abcde:
\= Expect no match                     
    abc.. 
No match
    123                       
No match
    vwxyz                        
No match
                                
/^(?!abc)\d\d$/
    12         
 0: 12
\= Expect no match
    abcde:
No match
    abc..  
No match
    123
No match
    vwxyz    
No match

/(?<=abc|xy)123/
    abc12345
 0: 123
    wxy123z
 0: 123
\= Expect no match
    123abc
No match

/(?<!abc|xy)123/
    123abc
 0: 123
    mno123456 
 0: 123
\= Expect no match
    abc12345
No match
    wxy123z
No match

/abc(?C1)xyz/
    abcxyz
--->abcxyz
  1 ^  ^       x
 0: abcxyz
    123abcxyz999 
--->123abcxyz999
  1    ^  ^          x
 0: abcxyz

/(ab|cd){3,4}/auto_callout
  ababab
--->ababab
 +0 ^          (
 +1 ^          a
 +4 ^          c
 +2 ^^         b
 +3 ^ ^        |
 +1 ^ ^        a
 +4 ^ ^        c
 +2 ^  ^       b
 +3 ^   ^      |
 +1 ^   ^      a
 +4 ^   ^      c
 +2 ^    ^     b
 +3 ^     ^    |
+12 ^     ^    End of pattern
 +1 ^     ^    a
 +4 ^     ^    c
 0: ababab
  abcdabcd
--->abcdabcd
 +0 ^            (
 +1 ^            a
 +4 ^            c
 +2 ^^           b
 +3 ^ ^          |
 +1 ^ ^          a
 +4 ^ ^          c
 +5 ^  ^         d
 +6 ^   ^        ){3,4}
 +1 ^   ^        a
 +4 ^   ^        c
 +2 ^    ^       b
 +3 ^     ^      |
+12 ^     ^      End of pattern
 +1 ^     ^      a
 +4 ^     ^      c
 +5 ^      ^     d
 +6 ^       ^    ){3,4}
+12 ^       ^    End of pattern
 0: abcdabcd
 1: abcdab
  abcdcdcdcdcd  
--->abcdcdcdcdcd
 +0 ^                (
 +1 ^                a
 +4 ^                c
 +2 ^^               b
 +3 ^ ^              |
 +1 ^ ^              a
 +4 ^ ^              c
 +5 ^  ^             d
 +6 ^   ^            ){3,4}
 +1 ^   ^            a
 +4 ^   ^            c
 +5 ^    ^           d
 +6 ^     ^          ){3,4}
+12 ^     ^          End of pattern
 +1 ^     ^          a
 +4 ^     ^          c
 +5 ^      ^         d
 +6 ^       ^        ){3,4}
+12 ^       ^        End of pattern
 0: abcdcdcd
 1: abcdcd

/^abc/
    abcdef
 0: abc
\= Expect no match
    abcdef\=notbol
No match

/^(a*|xyz)/
    bcd
 0: 
    aaabcd
 0: aaa
    xyz
 0: xyz
 1: 
    xyz\=notempty
 0: xyz
\= Expect no match
    bcd\=notempty
No match
    
/xyz$/
    xyz
 0: xyz
    xyz\n
 0: xyz
\= Expect no match
    xyz\=noteol
No match
    xyz\n\=noteol
No match
    
/xyz$/m
    xyz
 0: xyz
    xyz\n 
 0: xyz
    abcxyz\npqr 
 0: xyz
    abcxyz\npqr\=noteol
 0: xyz
    xyz\n\=noteol
 0: xyz
\= Expect no match
    xyz\=noteol
No match

/\Gabc/
    abcdef
 0: abc
    defabcxyz\=offset=3
 0: abc
\= Expect no match 
    defabcxyz
No match

/^abcdef/
    ab\=ps
Partial match: ab
    abcde\=ps
Partial match: abcde
    abcdef\=ps
 0: abcdef
\= Expect no match
    abx\=ps
No match

/^a{2,4}\d+z/
    a\=ps
Partial match: a
    aa\=ps
Partial match: aa
    aa2\=ps
Partial match: aa2
    aaa\=ps
Partial match: aaa
    aaa23\=ps
Partial match: aaa23
    aaaa12345\=ps
Partial match: aaaa12345
    aa0z\=ps
 0: aa0z
    aaaa4444444444444z\=ps
 0: aaaa4444444444444z
\= Expect no match
    az\=ps
No match
    aaaaa\=ps
No match
    a56\=ps
No match

/^abcdef/
   abc\=ps
Partial match: abc
   def\=dfa_restart
 0: def
   
/(?<=foo)bar/
   foob\=ps,offset=2,allusedtext
Partial match: foob
               <<<
   foobar...\=ps,dfa_restart,offset=4
 0: ar
   foobar\=offset=2
 0: bar
\= Expect no match
   xyzfo\=ps
No match
   obar\=dfa_restart
No match

/(ab*(cd|ef))+X/
    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\=ps,notbol,noteol
Partial match: abbbbbbcdaefabbbbbbbefa
    cdabbbbbbbb\=ps,notbol,dfa_restart,noteol
Partial match: cdabbbbbbbb
    efabbbbbbbbbbbbbbbb\=ps,notbol,dfa_restart,noteol
Partial match: efabbbbbbbbbbbbbbbb
    bbbbbbbbbbbbcdXyasdfadf\=ps,notbol,dfa_restart,noteol
 0: bbbbbbbbbbbbcdX
\= Expect no match
    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\=ps,noteol
No match

/the quick brown fox/
    the quick brown fox
 0: the quick brown fox
    What do you know about the quick brown fox?
 0: the quick brown fox
\= Expect no match
    The quick brown FOX
No match
    What do you know about THE QUICK BROWN FOX?
No match

/The quick brown fox/i
    the quick brown fox
 0: the quick brown fox
    The quick brown FOX
 0: The quick brown FOX
    What do you know about the quick brown fox?
 0: the quick brown fox
    What do you know about THE QUICK BROWN FOX?
 0: THE QUICK BROWN FOX

/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
    abcd\t\n\r\f\a\e9;\$\\?caxyz
 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz

/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
    abxyzpqrrrabbxyyyypqAzz
 0: abxyzpqrrrabbxyyyypqAzz
    abxyzpqrrrabbxyyyypqAzz
 0: abxyzpqrrrabbxyyyypqAzz
    aabxyzpqrrrabbxyyyypqAzz
 0: aabxyzpqrrrabbxyyyypqAzz
    aaabxyzpqrrrabbxyyyypqAzz
 0: aaabxyzpqrrrabbxyyyypqAzz
    aaaabxyzpqrrrabbxyyyypqAzz
 0: aaaabxyzpqrrrabbxyyyypqAzz
    abcxyzpqrrrabbxyyyypqAzz
 0: abcxyzpqrrrabbxyyyypqAzz
    aabcxyzpqrrrabbxyyyypqAzz
 0: aabcxyzpqrrrabbxyyyypqAzz
    aaabcxyzpqrrrabbxyyyypAzz
 0: aaabcxyzpqrrrabbxyyyypAzz
    aaabcxyzpqrrrabbxyyyypqAzz
 0: aaabcxyzpqrrrabbxyyyypqAzz
    aaabcxyzpqrrrabbxyyyypqqAzz
 0: aaabcxyzpqrrrabbxyyyypqqAzz
    aaabcxyzpqrrrabbxyyyypqqqAzz
 0: aaabcxyzpqrrrabbxyyyypqqqAzz
    aaabcxyzpqrrrabbxyyyypqqqqAzz
 0: aaabcxyzpqrrrabbxyyyypqqqqAzz
    aaabcxyzpqrrrabbxyyyypqqqqqAzz
 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz
    aaabcxyzpqrrrabbxyyyypqqqqqqAzz
 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz
    aaaabcxyzpqrrrabbxyyyypqAzz
 0: aaaabcxyzpqrrrabbxyyyypqAzz
    abxyzzpqrrrabbxyyyypqAzz
 0: abxyzzpqrrrabbxyyyypqAzz
    aabxyzzzpqrrrabbxyyyypqAzz
 0: aabxyzzzpqrrrabbxyyyypqAzz
    aaabxyzzzzpqrrrabbxyyyypqAzz
 0: aaabxyzzzzpqrrrabbxyyyypqAzz
    aaaabxyzzzzpqrrrabbxyyyypqAzz
 0: aaaabxyzzzzpqrrrabbxyyyypqAzz
    abcxyzzpqrrrabbxyyyypqAzz
 0: abcxyzzpqrrrabbxyyyypqAzz
    aabcxyzzzpqrrrabbxyyyypqAzz
 0: aabcxyzzzpqrrrabbxyyyypqAzz
    aaabcxyzzzzpqrrrabbxyyyypqAzz
 0: aaabcxyzzzzpqrrrabbxyyyypqAzz
    aaaabcxyzzzzpqrrrabbxyyyypqAzz
 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz
    aaaabcxyzzzzpqrrrabbbxyyyypqAzz
 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz
    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
    aaabcxyzpqrrrabbxyyyypABzz
 0: aaabcxyzpqrrrabbxyyyypABzz
    aaabcxyzpqrrrabbxyyyypABBzz
 0: aaabcxyzpqrrrabbxyyyypABBzz
    >>>aaabxyzpqrrrabbxyyyypqAzz
 0: aaabxyzpqrrrabbxyyyypqAzz
    >aaaabxyzpqrrrabbxyyyypqAzz
 0: aaaabxyzpqrrrabbxyyyypqAzz
    >>>>abcxyzpqrrrabbxyyyypqAzz
 0: abcxyzpqrrrabbxyyyypqAzz
\= Expect no match
    abxyzpqrrabbxyyyypqAzz
No match
    abxyzpqrrrrabbxyyyypqAzz
No match
    abxyzpqrrrabxyyyypqAzz
No match
    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
No match
    aaaabcxyzzzzpqrrrabbbxyyypqAzz
No match
    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
No match

/^(abc){1,2}zz/
    abczz
 0: abczz
    abcabczz
 0: abcabczz
\= Expect no match
    zz
No match
    abcabcabczz
No match
    >>abczz
No match

/^(b+?|a){1,2}?c/
    bc
 0: bc
    bbc
 0: bbc
    bbbc
 0: bbbc
    bac
 0: bac
    bbac
 0: bbac
    aac
 0: aac
    abbbbbbbbbbbc
 0: abbbbbbbbbbbc
    bbbbbbbbbbbac
 0: bbbbbbbbbbbac
\= Expect no match
    aaac
No match
    abbbbbbbbbbbac
No match

/^(b+|a){1,2}c/
    bc
 0: bc
    bbc
 0: bbc
    bbbc
 0: bbbc
    bac
 0: bac
    bbac
 0: bbac
    aac
 0: aac
    abbbbbbbbbbbc
 0: abbbbbbbbbbbc
    bbbbbbbbbbbac
 0: bbbbbbbbbbbac
\= Expect no match
    aaac
No match
    abbbbbbbbbbbac
No match

/^(b+|a){1,2}?bc/
    bbc
 0: bbc

/^(b*|ba){1,2}?bc/
    babc
 0: babc
    bbabc
 0: bbabc
    bababc
 0: bababc
\= Expect no match
    bababbc
No match
    babababc
No match

/^(ba|b*){1,2}?bc/
    babc
 0: babc
    bbabc
 0: bbabc
    bababc
 0: bababc
\= Expect no match
    bababbc
No match
    babababc
No match

/^\ca\cA\c[\c{\c:/
    \x01\x01\e;z
 0: \x01\x01\x1b;z

/^[ab\]cde]/
    athing
 0: a
    bthing
 0: b
    ]thing
 0: ]
    cthing
 0: c
    dthing
 0: d
    ething
 0: e
\= Expect no match
    fthing
No match
    [thing
No match
    \\thing
No match

/^[]cde]/
    ]thing
 0: ]
    cthing
 0: c
    dthing
 0: d
    ething
 0: e
\= Expect no match
    athing
No match
    fthing
No match

/^[^ab\]cde]/
    fthing
 0: f
    [thing
 0: [
    \\thing
 0: \
\= Expect no match
    athing
No match
    bthing
No match
    ]thing
No match
    cthing
No match
    dthing
No match
    ething
No match

/^[^]cde]/
    athing
 0: a
    fthing
 0: f
\= Expect no match
    ]thing
No match
    cthing
No match
    dthing
No match
    ething
No match

/^\�/
    �
 0: \x81

/^�/
    �
 0: \xff

/^[0-9]+$/
    0
 0: 0
    1
 0: 1
    2
 0: 2
    3
 0: 3
    4
 0: 4
    5
 0: 5
    6
 0: 6
    7
 0: 7
    8
 0: 8
    9
 0: 9
    10
 0: 10
    100
 0: 100
\= Expect no match
    abc
No match

/^.*nter/
    enter
 0: enter
    inter
 0: inter
    uponter
 0: uponter

/^xxx[0-9]+$/
    xxx0
 0: xxx0
    xxx1234
 0: xxx1234
\= Expect no match
    xxx
No match

/^.+[0-9][0-9][0-9]$/
    x123
 0: x123
    xx123
 0: xx123
    123456
 0: 123456
    x1234
 0: x1234
\= Expect no match
    123
No match

/^.+?[0-9][0-9][0-9]$/
    x123
 0: x123
    xx123
 0: xx123
    123456
 0: 123456
    x1234
 0: x1234
\= Expect no match
    123
No match

/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
    abc!pqr=apquxz.ixr.zzz.ac.uk
 0: abc!pqr=apquxz.ixr.zzz.ac.uk
\= Expect no match
    !pqr=apquxz.ixr.zzz.ac.uk
No match
    abc!=apquxz.ixr.zzz.ac.uk
No match
    abc!pqr=apquxz:ixr.zzz.ac.uk
No match
    abc!pqr=apquxz.ixr.zzz.ac.ukk
No match

/:/
    Well, we need a colon: somewhere
 0: :
\= Expect no match
    No match without a colon
No match

/([\da-f:]+)$/i
    0abc
 0: 0abc
    abc
 0: abc
    fed
 0: fed
    E
 0: E
    ::
 0: ::
    5f03:12C0::932e
 0: 5f03:12C0::932e
    fed def
 0: def
    Any old stuff
 0: ff
\= Expect no match
    0zzz
No match
    gzzz
No match
    fed\x20
No match
    Any old rubbish
No match

/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
    .1.2.3
 0: .1.2.3
    A.12.123.0
 0: A.12.123.0
\= Expect no match
    .1.2.3333
No match
    1.2.3
No match
    1234.2.3
No match

/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
    1 IN SOA non-sp1 non-sp2(
 0: 1 IN SOA non-sp1 non-sp2(
    1    IN    SOA    non-sp1    non-sp2   (
 0: 1    IN    SOA    non-sp1    non-sp2   (
\= Expect no match
    1IN SOA non-sp1 non-sp2(
No match

/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
    a.
 0: a.
    Z.
 0: Z.
    2.
 0: 2.
    ab-c.pq-r.
 0: ab-c.pq-r.
    sxk.zzz.ac.uk.
 0: sxk.zzz.ac.uk.
    x-.y-.
 0: x-.y-.
\= Expect no match
    -abc.peq.
No match

/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
    *.a
 0: *.a
    *.b0-a
 0: *.b0-a
    *.c3-b.c
 0: *.c3-b.c
    *.c-a.b-c
 0: *.c-a.b-c
\= Expect no match
    *.0
No match
    *.a-
No match
    *.a-b.c-
No match
    *.c-a.0-c
No match

/^(?=ab(de))(abd)(e)/
    abde
 0: abde

/^(?!(ab)de|x)(abd)(f)/
    abdf
 0: abdf

/^(?=(ab(cd)))(ab)/
    abcd
 0: ab

/^[\da-f](\.[\da-f])*$/i
    a.b.c.d
 0: a.b.c.d
    A.B.C.D
 0: A.B.C.D
    a.b.c.1.2.3.C
 0: a.b.c.1.2.3.C

/^\".*\"\s*(;.*)?$/
    \"1234\"
 0: "1234"
    \"abcd\" ;
 0: "abcd" ;
    \"\" ; rhubarb
 0: "" ; rhubarb
\= Expect no match
    \"1234\" : things
No match

/^$/
    \
 0: 

/   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/x
    ab c
 0: ab c
\= Expect no match
    abc
No match
    ab cde
No match

/(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
    ab c
 0: ab c
\= Expect no match
    abc
No match
    ab cde
No match

/^   a\ b[c ]d       $/x
    a bcd
 0: a bcd
    a b d
 0: a b d
\= Expect no match
    abcd
No match
    ab d
No match

/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
    abcdefhijklm
 0: abcdefhijklm

/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
    abcdefhijklm
 0: abcdefhijklm

/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
    a+ Z0+\x08\n\x1d\x12
 0: a+ Z0+\x08\x0a\x1d\x12

/^[.^$|()*+?{,}]+/
    .^\$(*+)|{?,?}
 0: .^$(*+)|{?,?}

/^a*\w/
    z
 0: z
    az
 0: az
 1: a
    aaaz
 0: aaaz
 1: aaa
 2: aa
 3: a
    a
 0: a
    aa
 0: aa
 1: a
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a
    a+
 0: a
    aa+
 0: aa
 1: a

/^a*?\w/
    z
 0: z
    az
 0: az
 1: a
    aaaz
 0: aaaz
 1: aaa
 2: aa
 3: a
    a
 0: a
    aa
 0: aa
 1: a
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a
    a+
 0: a
    aa+
 0: aa
 1: a

/^a+\w/
    az
 0: az
    aaaz
 0: aaaz
 1: aaa
 2: aa
    aa
 0: aa
    aaaa
 0: aaaa
 1: aaa
 2: aa
    aa+
 0: aa

/^a+?\w/
    az
 0: az
    aaaz
 0: aaaz
 1: aaa
 2: aa
    aa
 0: aa
    aaaa
 0: aaaa
 1: aaa
 2: aa
    aa+
 0: aa

/^\d{8}\w{2,}/
    1234567890
 0: 1234567890
    12345678ab
 0: 12345678ab
    12345678__
 0: 12345678__
\= Expect no match
    1234567
No match

/^[aeiou\d]{4,5}$/
    uoie
 0: uoie
    1234
 0: 1234
    12345
 0: 12345
    aaaaa
 0: aaaaa
\= Expect no match
    123456
No match

/^[aeiou\d]{4,5}?/
    uoie
 0: uoie
    1234
 0: 1234
    12345
 0: 12345
 1: 1234
    aaaaa
 0: aaaaa
 1: aaaa
    123456
 0: 12345
 1: 1234

/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
    From abcd  Mon Sep 01 12:33:02 1997
 0: From abcd  Mon Sep 01 12:33

/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
    From abcd  Mon Sep 01 12:33:02 1997
 0: From abcd  Mon Sep 01 12:33
    From abcd  Mon Sep  1 12:33:02 1997
 0: From abcd  Mon Sep  1 12:33
\= Expect no match
    From abcd  Sep 01 12:33:02 1997
No match

/^12.34/s
    12\n34
 0: 12\x0a34
    12\r34
 0: 12\x0d34

/\w+(?=\t)/
    the quick brown\t fox
 0: brown

/foo(?!bar)(.*)/
    foobar is foolish see?
 0: foolish see?

/(?:(?!foo)...|^.{0,2})bar(.*)/
    foobar crowbar etc
 0: rowbar etc
    barrel
 0: barrel
    2barrel
 0: 2barrel
    A barrel
 0: A barrel

/^(\D*)(?=\d)(?!123)/
    abc456
 0: abc
\= Expect no match
    abc123
No match

/^1234(?# test newlines
  inside)/
    1234
 0: 1234

/^1234 #comment in extended re
  /x
    1234
 0: 1234

/#rhubarb
  abcd/x
    abcd
 0: abcd

/^abcd#rhubarb/x
    abcd
 0: abcd

/(?!^)abc/
    the abc
 0: abc
\= Expect no match
    abc
No match

/(?=^)abc/
    abc
 0: abc
\= Expect no match
    the abc
No match

/^[ab]{1,3}(ab*|b)/no_auto_possess
    aabbbbb
 0: aabbbbb
 1: aabbbb
 2: aabbb
 3: aabb
 4: aab
 5: aa

/^[ab]{1,3}?(ab*|b)/no_auto_possess
    aabbbbb
 0: aabbbbb
 1: aabbbb
 2: aabbb
 3: aabb
 4: aab
 5: aa

/^[ab]{1,3}?(ab*?|b)/no_auto_possess
    aabbbbb
 0: aabbbbb
 1: aabbbb
 2: aabbb
 3: aabb
 4: aab
 5: aa

/^[ab]{1,3}(ab*?|b)/no_auto_possess
    aabbbbb
 0: aabbbbb
 1: aabbbb
 2: aabbb
 3: aabb
 4: aab
 5: aa

/  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*                          # optional leading comment
(?:    (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?:                      # opening quote...
[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
|                     #    or
\\ [^\x80-\xff]           #   Escaped something (something != CR)
)* "  # closing quote
)                    # initial word
(?:  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  \.  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*   (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?:                      # opening quote...
[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
|                     #    or
\\ [^\x80-\xff]           #   Escaped something (something != CR)
)* "  # closing quote
)  )* # further okay, if led by a period
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  @  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*    (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                           # initial subdomain
(?:                                  #
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  \.                        # if led by a period...
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*   (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                     #   ...further okay
)*
# address
|                     #  or
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?:                      # opening quote...
[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
|                     #    or
\\ [^\x80-\xff]           #   Escaped something (something != CR)
)* "  # closing quote
)             # one word, optionally followed by....
(?:
[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]  |  # atom and space parts, or...
\(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)       |  # comments, or...

" (?:                      # opening quote...
[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
|                     #    or
\\ [^\x80-\xff]           #   Escaped something (something != CR)
)* "  # closing quote
# quoted strings
)*
<  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*                     # leading <
(?:  @  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*    (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                           # initial subdomain
(?:                                  #
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  \.                        # if led by a period...
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*   (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                     #   ...further okay
)*

(?:  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  ,  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  @  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*    (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                           # initial subdomain
(?:                                  #
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  \.                        # if led by a period...
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*   (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                     #   ...further okay
)*
)* # further okay, if led by comma
:                                # closing colon
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  )? #       optional route
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?:                      # opening quote...
[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
|                     #    or
\\ [^\x80-\xff]           #   Escaped something (something != CR)
)* "  # closing quote
)                    # initial word
(?:  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  \.  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*   (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?:                      # opening quote...
[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
|                     #    or
\\ [^\x80-\xff]           #   Escaped something (something != CR)
)* "  # closing quote
)  )* # further okay, if led by a period
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  @  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*    (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                           # initial subdomain
(?:                                  #
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  \.                        # if led by a period...
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*   (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|   \[                         # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
\]                        #           ]
)                     #   ...further okay
)*
#       address spec
(?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*  > #                  trailing >
# name and address
)  (?: [\040\t] |  \(
(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
\)  )*                       # optional trailing comment
/x
    Alan Other <user\@dom.ain>
 0: Alan Other <user@dom.ain>
    <user\@dom.ain>
 0: user@dom.ain
 1: user@dom
    user\@dom.ain
 0: user@dom.ain
 1: user@dom
    \"A. Other\" <user.1234\@dom.ain> (a comment)
 0: "A. Other" <user.1234@dom.ain> (a comment)
 1: "A. Other" <user.1234@dom.ain> 
 2: "A. Other" <user.1234@dom.ain>
    A. Other <user.1234\@dom.ain> (a comment)
 0:  Other <user.1234@dom.ain> (a comment)
 1:  Other <user.1234@dom.ain> 
 2:  Other <user.1234@dom.ain>
    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re
    A missing angle <user\@some.where
 0: user@some.where
 1: user@some
\= Expect no match
    The quick brown fox
No match

/[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional leading comment
(?:
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
|                       #  or
"                                     # "
[^\\\x80-\xff\n\015"] *                            #   normal
(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
"                                     #        "
# Quoted string
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
\.
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
|                       #  or
"                                     # "
[^\\\x80-\xff\n\015"] *                            #   normal
(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
"                                     #        "
# Quoted string
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# additional words
)*
@
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
)*
# address
|                             #  or
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
|                       #  or
"                                     # "
[^\\\x80-\xff\n\015"] *                            #   normal
(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
"                                     #        "
# Quoted string
)
# leading word
[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *               # "normal" atoms and or spaces
(?:
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
|
"                                     # "
[^\\\x80-\xff\n\015"] *                            #   normal
(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
"                                     #        "
) # "special" comment or quoted string
[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *            #  more "normal"
)*
<
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# <
(?:
@
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
)*
(?: ,
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
@
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
)*
)*  # additional domains
:
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
)?     #       optional route
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
|                       #  or
"                                     # "
[^\\\x80-\xff\n\015"] *                            #   normal
(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
"                                     #        "
# Quoted string
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
\.
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
|                       #  or
"                                     # "
[^\\\x80-\xff\n\015"] *                            #   normal
(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
"                                     #        "
# Quoted string
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# additional words
)*
@
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[                            # [
(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
\]                           #           ]
)
[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\015()] *                            #     normal*
(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
\)                           #                       )
)    #         special
[^\\\x80-\xff\n\015()] *                         #         normal*
)*                                  #            )*
\)                             #                )
[\040\t]* )*    # If comment found, allow more spaces.
# optional trailing comments
)*
#       address spec
>                    #                 >
# name and address
)
/x
    Alan Other <user\@dom.ain>
 0: Alan Other <user@dom.ain>
    <user\@dom.ain>
 0: user@dom.ain
 1: user@dom
    user\@dom.ain
 0: user@dom.ain
 1: user@dom
    \"A. Other\" <user.1234\@dom.ain> (a comment)
 0: "A. Other" <user.1234@dom.ain>
    A. Other <user.1234\@dom.ain> (a comment)
 0:  Other <user.1234@dom.ain>
    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re
    A missing angle <user\@some.where
 0: user@some.where
 1: user@some
\= Expect no match
    The quick brown fox
No match

/abc\0def\00pqr\000xyz\0000AB/
    abc\0def\00pqr\000xyz\0000AB
 0: abc\x00def\x00pqr\x00xyz\x000AB
    abc456 abc\0def\00pqr\000xyz\0000ABCDE
 0: abc\x00def\x00pqr\x00xyz\x000AB

/abc\x0def\x00pqr\x000xyz\x0000AB/
    abc\x0def\x00pqr\x000xyz\x0000AB
 0: abc\x0def\x00pqr\x000xyz\x0000AB
    abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
 0: abc\x0def\x00pqr\x000xyz\x0000AB

/^[\000-\037]/
    \0A
 0: \x00
    \01B
 0: \x01
    \037C
 0: \x1f

/\0*/
    \0\0\0\0
 0: \x00\x00\x00\x00

/A\x0{2,3}Z/
    The A\x0\x0Z
 0: A\x00\x00Z
    An A\0\x0\0Z
 0: A\x00\x00\x00Z
\= Expect no match
    A\0Z
No match
    A\0\x0\0\x0Z
No match

/^\s/
    \040abc
 0:  
    \x0cabc
 0: \x0c
    \nabc
 0: \x0a
    \rabc
 0: \x0d
    \tabc
 0: \x09
\= Expect no match
    abc
No match

/^a	b
      c/x
    abc
 0: abc

/ab{1,3}bc/
    abbbbc
 0: abbbbc
    abbbc
 0: abbbc
    abbc
 0: abbc
\= Expect no match
    abc
No match
    abbbbbc
No match

/([^.]*)\.([^:]*):[T ]+(.*)/
    track1.title:TBlah blah blah
 0: track1.title:TBlah blah blah

/([^.]*)\.([^:]*):[T ]+(.*)/i
    track1.title:TBlah blah blah
 0: track1.title:TBlah blah blah

/([^.]*)\.([^:]*):[t ]+(.*)/i
    track1.title:TBlah blah blah
 0: track1.title:TBlah blah blah

/^[W-c]+$/
    WXY_^abc
 0: WXY_^abc
\= Expect no match
    wxy
No match

/^[W-c]+$/i
    WXY_^abc
 0: WXY_^abc
    wxy_^ABC
 0: wxy_^ABC

/^[\x3f-\x5F]+$/i
    WXY_^abc
 0: WXY_^abc
    wxy_^ABC
 0: wxy_^ABC

/^abc$/m
    abc
 0: abc
    qqq\nabc
 0: abc
    abc\nzzz
 0: abc
    qqq\nabc\nzzz
 0: abc

/^abc$/
    abc
 0: abc
\= Expect no match
    qqq\nabc
No match
    abc\nzzz
No match
    qqq\nabc\nzzz
No match

/\Aabc\Z/m
    abc
 0: abc
    abc\n 
 0: abc
\= Expect no match
    qqq\nabc
No match
    abc\nzzz
No match
    qqq\nabc\nzzz
No match
    
/\A(.)*\Z/s
    abc\ndef
 0: abc\x0adef

/\A(.)*\Z/m
\= Expect no match
    abc\ndef
No match

/(?:b)|(?::+)/
    b::c
 0: b
    c::b
 0: ::

/[-az]+/
    az-
 0: az-
\= Expect no match
    b
No match

/[az-]+/
    za-
 0: za-
\= Expect no match
    b
No match

/[a\-z]+/
    a-z
 0: a-z
\= Expect no match
    b
No match

/[a-z]+/
    abcdxyz
 0: abcdxyz

/[\d-]+/
    12-34
 0: 12-34
\= Expect no match
    aaa
No match

/\x5c/
    \\
 0: \

/\x20Z/
    the Zoo
 0:  Z
\= Expect no match
    Zulu
No match

/ab{3cd/
    ab{3cd
 0: ab{3cd

/ab{3,cd/
    ab{3,cd
 0: ab{3,cd

/ab{3,4a}cd/
    ab{3,4a}cd
 0: ab{3,4a}cd

/{4,5a}bc/
    {4,5a}bc
 0: {4,5a}bc

/^a.b/newline=lf
    a\rb
 0: a\x0db
\= Expect no match
    a\nb
No match

/abc$/
    abc
 0: abc
    abc\n
 0: abc
\= Expect no match
    abc\ndef
No match

/(abc)\123/
    abc\x53
 0: abcS

/(abc)\223/
    abc\x93
 0: abc\x93

/(abc)\323/
    abc\xd3
 0: abc\xd3

/(abc)\100/
    abc\x40
 0: abc@
    abc\100
 0: abc@

/(abc)\1000/
    abc\x400
 0: abc@0
    abc\x40\x30
 0: abc@0
    abc\1000
 0: abc@0
    abc\100\x30
 0: abc@0
    abc\100\060
 0: abc@0
    abc\100\60
 0: abc@0

/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
    abcdefghijk\12S
 0: abcdefghijk\x0aS

/a{0}bc/
    bc
 0: bc

/(a|(bc)){0,0}?xyz/
    xyz
 0: xyz

/abc[\10]de/
    abc\010de
 0: abc\x08de

/abc[\1]de/
    abc\1de
 0: abc\x01de

/(abc)[\1]de/
    abc\1de
 0: abc\x01de

/(?s)a.b/
    a\nb
 0: a\x0ab

/^([^a])([^\b])([^c]*)([^d]{3,4})/
    baNOTccccd
 0: baNOTcccc
 1: baNOTccc
 2: baNOTcc
 3: baNOTc
    baNOTcccd
 0: baNOTccc
 1: baNOTcc
 2: baNOTc
    baNOTccd
 0: baNOTcc
 1: baNOTc
    bacccd
 0: baccc
\= Expect no match
    anything
No match
    b\bc   
No match
    baccd
No match

/[^a]/
    Abc
 0: A
  
/[^a]/i
    Abc 
 0: b

/[^a]+/
    AAAaAbc
 0: AAA
  
/[^a]+/i
    AAAaAbc 
 0: bc

/[^a]+/
    bbb\nccc
 0: bbb\x0accc
   
/[^k]$/
    abc
 0: c
\= Expect no match
    abk   
No match
   
/[^k]{2,3}$/
    abc
 0: abc
    kbc
 0: bc
    kabc 
 0: abc
\= Expect no match
    abk
No match
    akb
No match
    akk 
No match

/^\d{8,}\@.+[^k]$/
    12345678\@a.b.c.d
 0: 12345678@a.b.c.d
    123456789\@x.y.z
 0: 123456789@x.y.z
\= Expect no match
    12345678\@x.y.uk
No match
    1234567\@a.b.c.d       
No match

/[^a]/
    aaaabcd
 0: b
    aaAabcd 
 0: A

/[^a]/i
    aaaabcd
 0: b
    aaAabcd 
 0: b

/[^az]/
    aaaabcd
 0: b
    aaAabcd 
 0: A

/[^az]/i
    aaaabcd
 0: b
    aaAabcd 
 0: b

/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
 \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
 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\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff

/P[^*]TAIRE[^*]{1,6}?LL/
    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
 0: PSTAIREISLL

/P[^*]TAIRE[^*]{1,}?LL/
    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
 0: PSTAIREISLL

/(\.\d\d[1-9]?)\d+/
    1.230003938
 0: .230003938
    1.875000282   
 0: .875000282
    1.235  
 0: .235
                  
/(\.\d\d((?=0)|\d(?=\d)))/
    1.230003938      
 0: .230
 1: .23
    1.875000282
 0: .875
\= Expect no match 
    1.235 
No match
    
/a(?)b/
    ab 
 0: ab
 
/\b(foo)\s+(\w+)/i
    Food is on the foo table
 0: foo table
    
/foo(.*)bar/
    The food is under the bar in the barn.
 0: food is under the bar in the bar
 1: food is under the bar
    
/foo(.*?)bar/
    The food is under the bar in the barn.
 0: food is under the bar in the bar
 1: food is under the bar

/(.*)(\d*)/no_auto_possess
    I have 2 numbers: 53147
Matched, but offsets vector is too small to show all matches
 0: I have 2 numbers: 53147
 1: I have 2 numbers: 5314
 2: I have 2 numbers: 531
 3: I have 2 numbers: 53
 4: I have 2 numbers: 5
 5: I have 2 numbers: 
 6: I have 2 numbers:
 7: I have 2 numbers
 8: I have 2 number
 9: I have 2 numbe
10: I have 2 numb
11: I have 2 num
12: I have 2 nu
13: I have 2 n
14: I have 2 
    
/(.*)(\d+)/
    I have 2 numbers: 53147
 0: I have 2 numbers: 53147
 1: I have 2
 
/(.*?)(\d*)/no_auto_possess
    I have 2 numbers: 53147
Matched, but offsets vector is too small to show all matches
 0: I have 2 numbers: 53147
 1: I have 2 numbers: 5314
 2: I have 2 numbers: 531
 3: I have 2 numbers: 53
 4: I have 2 numbers: 5
 5: I have 2 numbers: 
 6: I have 2 numbers:
 7: I have 2 numbers
 8: I have 2 number
 9: I have 2 numbe
10: I have 2 numb
11: I have 2 num
12: I have 2 nu
13: I have 2 n
14: I have 2 

/(.*?)(\d+)/
    I have 2 numbers: 53147
 0: I have 2 numbers: 53147
 1: I have 2

/(.*)(\d+)$/
    I have 2 numbers: 53147
 0: I have 2 numbers: 53147

/(.*?)(\d+)$/
    I have 2 numbers: 53147
 0: I have 2 numbers: 53147

/(.*)\b(\d+)$/
    I have 2 numbers: 53147
 0: I have 2 numbers: 53147

/(.*\D)(\d+)$/
    I have 2 numbers: 53147
 0: I have 2 numbers: 53147

/^\D*(?!123)/
    ABC123
 0: AB
 1: A
 2: 
     
/^(\D*)(?=\d)(?!123)/
    ABC445
 0: ABC
\= Expect no match
    ABC123
No match
    
/^[W-]46]/
    W46]789 
 0: W46]
    -46]789
 0: -46]
\= Expect no match
    Wall
No match
    Zebra
No match
    42
No match
    [abcd] 
No match
    ]abcd[
No match
       
/^[W-\]46]/
    W46]789 
 0: W
    Wall
 0: W
    Zebra
 0: Z
    Xylophone  
 0: X
    42
 0: 4
    [abcd] 
 0: [
    ]abcd[
 0: ]
    \\backslash 
 0: \
\= Expect no match
    -46]789
No match
    well
No match
    
/\d\d\/\d\d\/\d\d\d\d/
    01/01/2000
 0: 01/01/2000

/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
  word cat dog elephant mussel cow horse canary baboon snake shark otherword
 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
\= Expect no match
  word cat dog elephant mussel cow horse canary baboon snake shark
No match

/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
\= Expect no match
  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
No match

/^(a){0,0}/
    bcd
 0: 
    abc
 0: 
    aab     
 0: 

/^(a){0,1}/
    bcd
 0: 
    abc
 0: a
 1: 
    aab  
 0: a
 1: 

/^(a){0,2}/
    bcd
 0: 
    abc
 0: a
 1: 
    aab  
 0: aa
 1: a
 2: 

/^(a){0,3}/
    bcd
 0: 
    abc
 0: a
 1: 
    aab
 0: aa
 1: a
 2: 
    aaa   
 0: aaa
 1: aa
 2: a
 3: 

/^(a){0,}/
    bcd
 0: 
    abc
 0: a
 1: 
    aab
 0: aa
 1: a
 2: 
    aaa
 0: aaa
 1: aa
 2: a
 3: 
    aaaaaaaa    
 0: aaaaaaaa
 1: aaaaaaa
 2: aaaaaa
 3: aaaaa
 4: aaaa
 5: aaa
 6: aa
 7: a
 8: 

/^(a){1,1}/
    abc
 0: a
    aab  
 0: a
\= Expect no match
    bcd
No match

/^(a){1,2}/
    abc
 0: a
    aab  
 0: aa
 1: a
\= Expect no match
    bcd
No match

/^(a){1,3}/
    abc
 0: a
    aab
 0: aa
 1: a
    aaa   
 0: aaa
 1: aa
 2: a
\= Expect no match
    bcd
No match

/^(a){1,}/
    abc
 0: a
    aab
 0: aa
 1: a
    aaa
 0: aaa
 1: aa
 2: a
    aaaaaaaa    
 0: aaaaaaaa
 1: aaaaaaa
 2: aaaaaa
 3: aaaaa
 4: aaaa
 5: aaa
 6: aa
 7: a
\= Expect no match
    bcd
No match

/.*\.gif/
    borfle\nbib.gif\nno
 0: bib.gif

/.{0,}\.gif/
    borfle\nbib.gif\nno
 0: bib.gif

/.*\.gif/m
    borfle\nbib.gif\nno
 0: bib.gif

/.*\.gif/s
    borfle\nbib.gif\nno
 0: borfle\x0abib.gif

/.*\.gif/ms
    borfle\nbib.gif\nno
 0: borfle\x0abib.gif
    
/.*$/
    borfle\nbib.gif\nno
 0: no

/.*$/m
    borfle\nbib.gif\nno
 0: borfle

/.*$/s
    borfle\nbib.gif\nno
 0: borfle\x0abib.gif\x0ano

/.*$/ms
    borfle\nbib.gif\nno
 0: borfle\x0abib.gif\x0ano
 1: borfle\x0abib.gif
 2: borfle
    
/.*$/
    borfle\nbib.gif\nno\n
 0: no

/.*$/m
    borfle\nbib.gif\nno\n
 0: borfle

/.*$/s
    borfle\nbib.gif\nno\n
 0: borfle\x0abib.gif\x0ano\x0a
 1: borfle\x0abib.gif\x0ano

/.*$/ms
    borfle\nbib.gif\nno\n
 0: borfle\x0abib.gif\x0ano\x0a
 1: borfle\x0abib.gif\x0ano
 2: borfle\x0abib.gif
 3: borfle
    
/(.*X|^B)/
    abcde\n1234Xyz
 0: 1234X
    BarFoo 
 0: B
\= Expect no match
    abcde\nBar  
No match

/(.*X|^B)/m
    abcde\n1234Xyz
 0: 1234X
    BarFoo 
 0: B
    abcde\nBar  
 0: B

/(.*X|^B)/s
    abcde\n1234Xyz
 0: abcde\x0a1234X
    BarFoo 
 0: B
\= Expect no match
    abcde\nBar  
No match

/(.*X|^B)/ms
    abcde\n1234Xyz
 0: abcde\x0a1234X
    BarFoo 
 0: B
    abcde\nBar  
 0: B

/(?s)(.*X|^B)/
    abcde\n1234Xyz
 0: abcde\x0a1234X
    BarFoo 
 0: B
\= Expect no match 
    abcde\nBar  
No match

/(?s:.*X|^B)/
    abcde\n1234Xyz
 0: abcde\x0a1234X
    BarFoo 
 0: B
\= Expect no match 
    abcde\nBar  
No match

/^.*B/
\= Expect no match
    abc\nB
No match
     
/(?s)^.*B/
    abc\nB
 0: abc\x0aB

/(?m)^.*B/
    abc\nB
 0: B
     
/(?ms)^.*B/
    abc\nB
 0: abc\x0aB

/(?ms)^B/
    abc\nB
 0: B

/(?s)B$/
    B\n
 0: B

/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
    123456654321
 0: 123456654321
  
/^\d\d\d\d\d\d\d\d\d\d\d\d/
    123456654321 
 0: 123456654321

/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
    123456654321
 0: 123456654321
  
/^[abc]{12}/
    abcabcabcabc
 0: abcabcabcabc
    
/^[a-c]{12}/
    abcabcabcabc
 0: abcabcabcabc
    
/^(a|b|c){12}/
    abcabcabcabc 
 0: abcabcabcabc

/^[abcdefghijklmnopqrstuvwxy0123456789]/
    n
 0: n
\= Expect no match 
    z 
No match

/abcde{0,0}/
    abcd
 0: abcd
\= Expect no match
    abce  
No match

/ab[cd]{0,0}e/
    abe
 0: abe
\= Expect no match
    abcde 
No match
    
/ab(c){0,0}d/
    abd
 0: abd
\= Expect no match
    abcd   
No match

/a(b*)/
    a
 0: a
    ab
 0: ab
    abbbb
 0: abbbb
\= Expect no match
    bbbbb    
No match
    
/ab\d{0}e/
    abe
 0: abe
\= Expect no match
    ab1e   
No match
    
/"([^\\"]+|\\.)*"/
    the \"quick\" brown fox
 0: "quick"
    \"the \\\"quick\\\" brown fox\" 
 0: "the \"quick\" brown fox"

/.*?/g,aftertext
    abc
 0: abc
 0+ 
 1: ab
 2: a
 3: 
 0: 
 0+ 
  
/\b/g,aftertext
    abc 
 0: 
 0+ abc
 0: 
 0+ 

/\b/g,aftertext
    abc 
 0: 
 0+ abc
 0: 
 0+ 

//g
    abc
 0: 
 0: 
 0: 
 0: 

/<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
  <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>
 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>

/a[^a]b/
    acb
 0: acb
    a\nb
 0: a\x0ab
    
/a.b/
    acb
 0: acb
\= Expect no match 
    a\nb   
No match
    
/a[^a]b/s
    acb
 0: acb
    a\nb  
 0: a\x0ab
    
/a.b/s
    acb
 0: acb
    a\nb  
 0: a\x0ab

/^(b+?|a){1,2}?c/
    bac
 0: bac
    bbac
 0: bbac
    bbbac
 0: bbbac
    bbbbac
 0: bbbbac
    bbbbbac 
 0: bbbbbac

/^(b+|a){1,2}?c/
    bac
 0: bac
    bbac
 0: bbac
    bbbac
 0: bbbac
    bbbbac
 0: bbbbac
    bbbbbac 
 0: bbbbbac
    
/(?!\A)x/m
    a\bx\n  
 0: x
\= Expect no match
    x\nb\n
No match
    
/\x0{ab}/
    \0{ab} 
 0: \x00{ab}

/(A|B)*?CD/
    CD 
 0: CD
    
/(A|B)*CD/
    CD 
 0: CD

/(?<!bar)foo/
    foo
 0: foo
    catfood
 0: foo
    arfootle
 0: foo
    rfoosh
 0: foo
\= Expect no match
    barfoo
No match
    towbarfoo
No match

/\w{3}(?<!bar)foo/
    catfood
 0: catfoo
\= Expect no match
    foo
No match
    barfoo
No match
    towbarfoo
No match

/(?<=(foo)a)bar/
    fooabar
 0: bar
\= Expect no match
    bar
No match
    foobbar
No match
      
/\Aabc\z/m
    abc
 0: abc
\= Expect no match
    abc\n   
No match
    qqq\nabc
No match
    abc\nzzz
No match
    qqq\nabc\nzzz
No match

"(?>.*/)foo"
\= Expect no match
    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
No match

"(?>.*/)foo"
    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo

/(?>(\.\d\d[1-9]?))\d+/
    1.230003938
 0: .230003938
    1.875000282
 0: .875000282
\= Expect no match 
    1.235 
No match

/^((?>\w+)|(?>\s+))*$/
    now is the time for all good men to come to the aid of the party
 0: now is the time for all good men to come to the aid of the party
\= Expect no match
    this is not a line with only words and spaces!
No match
    
/(\d+)(\w)/
    12345a
 0: 12345a
 1: 12345
 2: 1234
 3: 123
 4: 12
    12345+ 
 0: 12345
 1: 1234
 2: 123
 3: 12

/((?>\d+))(\w)/
    12345a
 0: 12345a
\= Expect no match
    12345+ 
No match

/(?>a+)b/
    aaab
 0: aaab

/((?>a+)b)/
    aaab
 0: aaab

/(?>(a+))b/
    aaab
 0: aaab

/(?>b)+/
    aaabbbccc
 0: bbb
 1: bb
 2: b

/(?>a+|b+|c+)*c/
    aaabbbbccccd
 0: aaabbbbcccc
 1: aaabbbbc
    
/(a+|b+|c+)*c/
    aaabbbbccccd
 0: aaabbbbcccc
 1: aaabbbbccc
 2: aaabbbbcc
 3: aaabbbbc

/((?>[^()]+)|\([^()]*\))+/
    ((abc(ade)ufh()()x
 0: abc(ade)ufh()()x
 1: abc(ade)ufh()()
 2: abc(ade)ufh()
 3: abc(ade)ufh
 4: abc(ade)
 5: abc
    
/\(((?>[^()]+)|\([^()]+\))+\)/
    (abc)
 0: (abc)
    (abc(def)xyz)
 0: (abc(def)xyz)
\= Expect no match
    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   
No match

/a(?-i)b/i
    ab
 0: ab
    Ab
 0: Ab
\= Expect no match 
    aB
No match
    AB
No match
        
/(a (?x)b c)d e/
    a bcd e
 0: a bcd e
\= Expect no match
    a b cd e
No match
    abcd e   
No match
    a bcde 
No match
 
/(a b(?x)c d (?-x)e f)/
    a bcde f
 0: a bcde f
\= Expect no match
    abcdef  
No match

/(a(?i)b)c/
    abc
 0: abc
    aBc
 0: aBc
\= Expect no match
    abC
No match
    aBC  
No match
    Abc
No match
    ABc
No match
    ABC
No match
    AbC
No match
    
/a(?i:b)c/
    abc
 0: abc
    aBc
 0: aBc
\= Expect no match 
    ABC
No match
    abC
No match
    aBC
No match
    
/a(?i:b)*c/
    aBc
 0: aBc
    aBBc
 0: aBBc
\= Expect no match 
    aBC
No match
    aBBC
No match
    
/a(?=b(?i)c)\w\wd/
    abcd
 0: abcd
    abCd
 0: abCd
\= Expect no match
    aBCd
No match
    abcD     
No match
    
/(?s-i:more.*than).*million/i
    more than million
 0: more than million
    more than MILLION
 0: more than MILLION
    more \n than Million 
 0: more \x0a than Million
\= Expect no match
    MORE THAN MILLION    
No match
    more \n than \n million 
No match

/(?:(?s-i)more.*than).*million/i
    more than million
 0: more than million
    more than MILLION
 0: more than MILLION
    more \n than Million 
 0: more \x0a than Million
\= Expect no match
    MORE THAN MILLION    
No match
    more \n than \n million 
No match
    
/(?>a(?i)b+)+c/
    abc
 0: abc
    aBbc
 0: aBbc
    aBBc 
 0: aBBc
\= Expect no match
    Abc
No match
    abAb    
No match
    abbC 
No match
    
/(?=a(?i)b)\w\wc/
    abc
 0: abc
    aBc
 0: aBc
\= Expect no match
    Ab 
No match
    abC
No match
    aBC     
No match
    
/(?<=a(?i)b)(\w\w)c/
    abxxc
 0: xxc
    aBxxc
 0: xxc
\= Expect no match
    Abxxc
No match
    ABxxc
No match
    abxxC      
No match

/^(?(?=abc)\w{3}:|\d\d)$/
    abc:
 0: abc:
    12
 0: 12
\= Expect no match
    123
No match
    xyz    
No match

/^(?(?!abc)\d\d|\w{3}:)$/
    abc:
 0: abc:
    12
 0: 12
\= Expect no match
    123
No match
    xyz    
No match
    
/(?(?<=foo)bar|cat)/
    foobar
 0: bar
    cat
 0: cat
    fcat
 0: cat
    focat   
 0: cat
\= Expect no match
    foocat  
No match

/(?(?<!foo)cat|bar)/
    foobar
 0: bar
    cat
 0: cat
    fcat
 0: cat
    focat   
 0: cat
\= Expect no match
    foocat  
No match

/(?>a*)*/
    a
 0: a
 1: 
    aa
 0: aa
 1: 
    aaaa
 0: aaaa
 1: 
    
/(abc|)+/
    abc
 0: abc
 1: 
    abcabc
 0: abcabc
 1: abc
 2: 
    abcabcabc
 0: abcabcabc
 1: abcabc
 2: abc
 3: 
    xyz      
 0: 

/([a]*)*/
    a
 0: a
 1: 
    aaaaa 
 0: aaaaa
 1: aaaa
 2: aaa
 3: aa
 4: a
 5: 
 
/([ab]*)*/
    a
 0: a
 1: 
    b
 0: b
 1: 
    ababab
 0: ababab
 1: ababa
 2: abab
 3: aba
 4: ab
 5: a
 6: 
    aaaabcde
 0: aaaab
 1: aaaa
 2: aaa
 3: aa
 4: a
 5: 
    bbbb    
 0: bbbb
 1: bbb
 2: bb
 3: b
 4: 
 
/([^a]*)*/
    b
 0: b
 1: 
    bbbb
 0: bbbb
 1: bbb
 2: bb
 3: b
 4: 
    aaa   
 0: 
 
/([^ab]*)*/
    cccc
 0: cccc
 1: ccc
 2: cc
 3: c
 4: 
    abab  
 0: 
 
/([a]*?)*/
    a
 0: a
 1: 
    aaaa 
 0: aaaa
 1: aaa
 2: aa
 3: a
 4: 
 
/([ab]*?)*/
    a
 0: a
 1: 
    b
 0: b
 1: 
    abab
 0: abab
 1: aba
 2: ab
 3: a
 4: 
    baba   
 0: baba
 1: bab
 2: ba
 3: b
 4: 
 
/([^a]*?)*/
    b
 0: b
 1: 
    bbbb
 0: bbbb
 1: bbb
 2: bb
 3: b
 4: 
    aaa   
 0: 
 
/([^ab]*?)*/
    c
 0: c
 1: 
    cccc
 0: cccc
 1: ccc
 2: cc
 3: c
 4: 
    baba   
 0: 
 
/(?>a*)*/
    a
 0: a
 1: 
    aaabcde 
 0: aaa
 1: 
 
/((?>a*))*/
    aaaaa
 0: aaaaa
 1: 
    aabbaa 
 0: aa
 1: 
 
/((?>a*?))*/
    aaaaa
 0: aaaaa
 1: 
    aabbaa 
 0: aa
 1: 

/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /x
    12-sep-98
 0: 12-sep-98
    12-09-98
 0: 12-09-98
\= Expect no match
    sep-12-98
No match
        
/(?i:saturday|sunday)/
    saturday
 0: saturday
    sunday
 0: sunday
    Saturday
 0: Saturday
    Sunday
 0: Sunday
    SATURDAY
 0: SATURDAY
    SUNDAY
 0: SUNDAY
    SunDay
 0: SunDay
    
/(a(?i)bc|BB)x/
    abcx
 0: abcx
    aBCx
 0: aBCx
    bbx
 0: bbx
    BBx
 0: BBx
\= Expect no match
    abcX
No match
    aBCX
No match
    bbX
No match
    BBX               
No match

/^([ab](?i)[cd]|[ef])/
    ac
 0: ac
    aC
 0: aC
    bD
 0: bD
    elephant
 0: e
    Europe 
 0: E
    frog
 0: f
    France
 0: F
\= Expect no match
    Africa     
No match

/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
    ab
 0: ab
    aBd
 0: aBd
    xy
 0: xy
    xY
 0: xY
    zebra
 0: z
    Zambesi
 0: Z
\= Expect no match
    aCD  
No match
    XY  
No match

/(?<=foo\n)^bar/m
    foo\nbar
 0: bar
\= Expect no match
    bar
No match
    baz\nbar   
No match

/(?<=(?<!foo)bar)baz/
    barbaz
 0: baz
    barbarbaz 
 0: baz
    koobarbaz 
 0: baz
\= Expect no match
    baz
No match
    foobarbaz 
No match

# The following tests are taken from the Perl 5.005 test suite; some of them
# are compatible with 5.004, but I'd rather not have to sort them out.

/abc/
    abc
 0: abc
    xabcy
 0: abc
    ababc
 0: abc
\= Expect no match
    xbc
No match
    axc
No match
    abx
No match

/ab*c/
    abc
 0: abc

/ab*bc/
    abc
 0: abc
    abbc
 0: abbc
    abbbbc
 0: abbbbc

/.{1}/
    abbbbc
 0: a

/.{3,4}/
    abbbbc
 0: abbb

/ab{0,}bc/
    abbbbc
 0: abbbbc

/ab+bc/
    abbc
 0: abbc
\= Expect no match
    abc
No match
    abq
No match

/ab+bc/
    abbbbc
 0: abbbbc

/ab{1,}bc/
    abbbbc
 0: abbbbc

/ab{1,3}bc/
    abbbbc
 0: abbbbc

/ab{3,4}bc/
    abbbbc
 0: abbbbc

/ab{4,5}bc/
\= Expect no match
    abq
No match
    abbbbc
No match

/ab?bc/
    abbc
 0: abbc
    abc
 0: abc

/ab{0,1}bc/
    abc
 0: abc

/ab?bc/

/ab?c/
    abc
 0: abc

/ab{0,1}c/
    abc
 0: abc

/^abc$/
    abc
 0: abc
\= Expect no match
    abbbbc
No match
    abcc
No match

/^abc/
    abcc
 0: abc

/^abc$/

/abc$/
    aabc
 0: abc
    aabc
 0: abc
\= Expect no match
    aabcd
No match

/^/
    abc
 0: 

/$/
    abc
 0: 

/a.c/
    abc
 0: abc
    axc
 0: axc

/a.*c/
    axyzc
 0: axyzc

/a[bc]d/
    abd
 0: abd
\= Expect no match
    axyzd
No match
    abc
No match

/a[b-d]e/
    ace
 0: ace

/a[b-d]/
    aac
 0: ac

/a[-b]/
    a-
 0: a-

/a[b-]/
    a-
 0: a-

/a]/
    a]
 0: a]

/a[]]b/
    a]b
 0: a]b

/a[^bc]d/
    aed
 0: aed
\= Expect no match
    abd
No match
    abd
No match

/a[^-b]c/
    adc
 0: adc

/a[^]b]c/
    adc
 0: adc
    a-c
 0: a-c
\= Expect no match
    a]c
No match

/\ba\b/
    a-
 0: a
    -a
 0: a
    -a-
 0: a

/\by\b/
\= Expect no match
    xy
No match
    yz
No match
    xyz
No match

/\Ba\B/
\= Expect no match
    a-
No match
    -a
No match
    -a-
No match

/\By\b/
    xy
 0: y

/\by\B/
    yz
 0: y

/\By\B/
    xyz
 0: y

/\w/
    a
 0: a

/\W/
    -
 0: -
\= Expect no match
    a
No match

/a\sb/
    a b
 0: a b

/a\Sb/
    a-b
 0: a-b
\= Expect no match
    a b
No match

/\d/
    1
 0: 1

/\D/
    -
 0: -
\= Expect no match
    1
No match

/[\w]/
    a
 0: a

/[\W]/
    -
 0: -
\= Expect no match
    a
No match

/a[\s]b/
    a b
 0: a b

/a[\S]b/
    a-b
 0: a-b
\= Expect no match
    a b
No match

/[\d]/
    1
 0: 1

/[\D]/
    -
 0: -
\= Expect no match
    1
No match

/ab|cd/
    abc
 0: ab
    abcd
 0: ab

/()ef/
    def
 0: ef

/$b/

/a\(b/
    a(b
 0: a(b

/a\(*b/
    ab
 0: ab
    a((b
 0: a((b

/a\\b/
    a\\b
 0: a\b
\= Expect no match
    a\b
No match

/((a))/
    abc
 0: a

/(a)b(c)/
    abc
 0: abc

/a+b+c/
    aabbabc
 0: abc

/a{1,}b{1,}c/
    aabbabc
 0: abc

/a.+?c/
    abcabc
 0: abcabc
 1: abc

/(a+|b)*/
    ab
 0: ab
 1: a
 2: 

/(a+|b){0,}/
    ab
 0: ab
 1: a
 2: 

/(a+|b)+/
    ab
 0: ab
 1: a

/(a+|b){1,}/
    ab
 0: ab
 1: a

/(a+|b)?/
    ab
 0: a
 1: 

/(a+|b){0,1}/
    ab
 0: a
 1: 

/[^ab]*/
    cde
 0: cde

/abc/
\= Expect no match
    b
No match

/a*/

/([abc])*d/
    abbbcd
 0: abbbcd

/([abc])*bcd/
    abcd
 0: abcd

/a|b|c|d|e/
    e
 0: e

/(a|b|c|d|e)f/
    ef
 0: ef

/abcd*efg/
    abcdefg
 0: abcdefg

/ab*/
    xabyabbbz
 0: ab
    xayabbbz
 0: a

/(ab|cd)e/
    abcde
 0: cde

/[abhgefdc]ij/
    hij
 0: hij

/^(ab|cd)e/

/(abc|)ef/
    abcdef
 0: ef

/(a|b)c*d/
    abcd
 0: bcd

/(ab|ab*)bc/
    abc
 0: abc

/a([bc]*)c*/
    abc
 0: abc
 1: a

/a([bc]*)(c*d)/
    abcd
 0: abcd

/a([bc]+)(c*d)/
    abcd
 0: abcd

/a([bc]*)(c+d)/
    abcd
 0: abcd

/a[bcd]*dcdcde/
    adcdcde
 0: adcdcde

/a[bcd]+dcdcde/
\= Expect no match
    abcde
No match
    adcdcde
No match

/(ab|a)b*c/
    abc
 0: abc

/((a)(b)c)(d)/
    abcd
 0: abcd

/[a-zA-Z_][a-zA-Z0-9_]*/
    alpha
 0: alpha

/^a(bc+|b[eh])g|.h$/
    abh
 0: bh

/(bc+d$|ef*g.|h?i(j|k))/
    effgz
 0: effgz
    ij
 0: ij
    reffgz
 0: effgz
\= Expect no match
    effg
No match
    bcdd
No match

/((((((((((a))))))))))/
    a
 0: a

/(((((((((a)))))))))/
    a
 0: a

/multiple words of text/
\= Expect no match
    aa
No match
    uh-uh
No match

/multiple words/
    multiple words, yeah
 0: multiple words

/(.*)c(.*)/
    abcde
 0: abcde

/\((.*), (.*)\)/
    (a, b)
 0: (a, b)

/[k]/

/abcd/
    abcd
 0: abcd

/a(bc)d/
    abcd
 0: abcd

/a[-]?c/
    ac
 0: ac

/abc/i
    ABC
 0: ABC
    XABCY
 0: ABC
    ABABC
 0: ABC
\= Expect no match
    aaxabxbaxbbx
No match
    XBC
No match
    AXC
No match
    ABX
No match

/ab*c/i
    ABC
 0: ABC

/ab*bc/i
    ABC
 0: ABC
    ABBC
 0: ABBC

/ab*?bc/i
    ABBBBC
 0: ABBBBC

/ab{0,}?bc/i
    ABBBBC
 0: ABBBBC

/ab+?bc/i
    ABBC
 0: ABBC

/ab+bc/i
\= Expect no match
    ABC
No match
    ABQ
No match

/ab{1,}bc/i

/ab+bc/i
    ABBBBC
 0: ABBBBC

/ab{1,}?bc/i
    ABBBBC
 0: ABBBBC

/ab{1,3}?bc/i
    ABBBBC
 0: ABBBBC

/ab{3,4}?bc/i
    ABBBBC
 0: ABBBBC

/ab{4,5}?bc/i
\= Expect no match
    ABQ
No match
    ABBBBC
No match

/ab??bc/i
    ABBC
 0: ABBC
    ABC
 0: ABC

/ab{0,1}?bc/i
    ABC
 0: ABC

/ab??bc/i

/ab??c/i
    ABC
 0: ABC

/ab{0,1}?c/i
    ABC
 0: ABC

/^abc$/i
    ABC
 0: ABC
\= Expect no match
    ABBBBC
No match
    ABCC
No match

/^abc/i
    ABCC
 0: ABC

/^abc$/i

/abc$/i
    AABC
 0: ABC

/^/i
    ABC
 0: 

/$/i
    ABC
 0: 

/a.c/i
    ABC
 0: ABC
    AXC
 0: AXC

/a.*?c/i
    AXYZC
 0: AXYZC

/a.*c/i
    AABC
 0: AABC
\= Expect no match
    AXYZD
No match

/a[bc]d/i
    ABD
 0: ABD

/a[b-d]e/i
    ACE
 0: ACE
\= Expect no match
    ABC
No match
    ABD
No match

/a[b-d]/i
    AAC
 0: AC

/a[-b]/i
    A-
 0: A-

/a[b-]/i
    A-
 0: A-

/a]/i
    A]
 0: A]

/a[]]b/i
    A]B
 0: A]B

/a[^bc]d/i
    AED
 0: AED

/a[^-b]c/i
    ADC
 0: ADC
\= Expect no match
    ABD
No match
    A-C
No match

/a[^]b]c/i
    ADC
 0: ADC

/ab|cd/i
    ABC
 0: AB
    ABCD
 0: AB

/()ef/i
    DEF
 0: EF

/$b/i
\= Expect no match
    A]C
No match
    B
No match

/a\(b/i
    A(B
 0: A(B

/a\(*b/i
    AB
 0: AB
    A((B
 0: A((B

/a\\b/i
\= Expect no match
    A\=notbol
No match

/((a))/i
    ABC
 0: A

/(a)b(c)/i
    ABC
 0: ABC

/a+b+c/i
    AABBABC
 0: ABC

/a{1,}b{1,}c/i
    AABBABC
 0: ABC

/a.+?c/i
    ABCABC
 0: ABCABC
 1: ABC

/a.*?c/i
    ABCABC
 0: ABCABC
 1: ABC

/a.{0,5}?c/i
    ABCABC
 0: ABCABC
 1: ABC

/(a+|b)*/i
    AB
 0: AB
 1: A
 2: 

/(a+|b){0,}/i
    AB
 0: AB
 1: A
 2: 

/(a+|b)+/i
    AB
 0: AB
 1: A

/(a+|b){1,}/i
    AB
 0: AB
 1: A

/(a+|b)?/i
    AB
 0: A
 1: 

/(a+|b){0,1}/i
    AB
 0: A
 1: 

/(a+|b){0,1}?/i
    AB
 0: A
 1: 

/[^ab]*/i
    CDE
 0: CDE

/abc/i

/a*/i

/([abc])*d/i
    ABBBCD
 0: ABBBCD

/([abc])*bcd/i
    ABCD
 0: ABCD

/a|b|c|d|e/i
    E
 0: E

/(a|b|c|d|e)f/i
    EF
 0: EF

/abcd*efg/i
    ABCDEFG
 0: ABCDEFG

/ab*/i
    XABYABBBZ
 0: AB
    XAYABBBZ
 0: A

/(ab|cd)e/i
    ABCDE
 0: CDE

/[abhgefdc]ij/i
    HIJ
 0: HIJ

/^(ab|cd)e/i
\= Expect no match
    ABCDE
No match

/(abc|)ef/i
    ABCDEF
 0: EF

/(a|b)c*d/i
    ABCD
 0: BCD

/(ab|ab*)bc/i
    ABC
 0: ABC

/a([bc]*)c*/i
    ABC
 0: ABC
 1: A

/a([bc]*)(c*d)/i
    ABCD
 0: ABCD

/a([bc]+)(c*d)/i
    ABCD
 0: ABCD

/a([bc]*)(c+d)/i
    ABCD
 0: ABCD

/a[bcd]*dcdcde/i
    ADCDCDE
 0: ADCDCDE

/a[bcd]+dcdcde/i

/(ab|a)b*c/i
    ABC
 0: ABC

/((a)(b)c)(d)/i
    ABCD
 0: ABCD

/[a-zA-Z_][a-zA-Z0-9_]*/i
    ALPHA
 0: ALPHA

/^a(bc+|b[eh])g|.h$/i
    ABH
 0: BH

/(bc+d$|ef*g.|h?i(j|k))/i
    EFFGZ
 0: EFFGZ
    IJ
 0: IJ
    REFFGZ
 0: EFFGZ
\= Expect no match
    ADCDCDE
No match
    EFFG
No match
    BCDD
No match

/((((((((((a))))))))))/i
    A
 0: A

/(((((((((a)))))))))/i
    A
 0: A

/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
    A
 0: A

/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
    C
 0: C

/multiple words of text/i
\= Expect no match
    AA
No match
    UH-UH
No match

/multiple words/i
    MULTIPLE WORDS, YEAH
 0: MULTIPLE WORDS

/(.*)c(.*)/i
    ABCDE
 0: ABCDE

/\((.*), (.*)\)/i
    (A, B)
 0: (A, B)

/[k]/i

/abcd/i
    ABCD
 0: ABCD

/a(bc)d/i
    ABCD
 0: ABCD

/a[-]?c/i
    AC
 0: AC

/a(?!b)./
    abad
 0: ad

/a(?=d)./
    abad
 0: ad

/a(?=c|d)./
    abad
 0: ad

/a(?:b|c|d)(.)/
    ace
 0: ace

/a(?:b|c|d)*(.)/
    ace
 0: ace
 1: ac

/a(?:b|c|d)+?(.)/
    ace
 0: ace
    acdbcdbe
 0: acdbcdbe
 1: acdbcdb
 2: acdbcd
 3: acdbc
 4: acdb
 5: acd

/a(?:b|c|d)+(.)/
    acdbcdbe
 0: acdbcdbe
 1: acdbcdb
 2: acdbcd
 3: acdbc
 4: acdb
 5: acd

/a(?:b|c|d){2}(.)/
    acdbcdbe
 0: acdb

/a(?:b|c|d){4,5}(.)/
    acdbcdbe
 0: acdbcdb
 1: acdbcd

/a(?:b|c|d){4,5}?(.)/
    acdbcdbe
 0: acdbcdb
 1: acdbcd

/((foo)|(bar))*/
    foobar
 0: foobar
 1: foo
 2: 

/a(?:b|c|d){6,7}(.)/
    acdbcdbe
 0: acdbcdbe

/a(?:b|c|d){6,7}?(.)/
    acdbcdbe
 0: acdbcdbe

/a(?:b|c|d){5,6}(.)/
    acdbcdbe
 0: acdbcdbe
 1: acdbcdb

/a(?:b|c|d){5,6}?(.)/
    acdbcdbe
 0: acdbcdbe
 1: acdbcdb

/a(?:b|c|d){5,7}(.)/
    acdbcdbe
 0: acdbcdbe
 1: acdbcdb

/a(?:b|c|d){5,7}?(.)/
    acdbcdbe
 0: acdbcdbe
 1: acdbcdb

/a(?:b|(c|e){1,2}?|d)+?(.)/
    ace
 0: ace

/^(.+)?B/
    AB
 0: AB

/^([^a-z])|(\^)$/
    .
 0: .

/^[<>]&/
    <&OUT
 0: <&

/(?:(f)(o)(o)|(b)(a)(r))*/
    foobar
 0: foobar
 1: foo
 2: 

/(?<=a)b/
    ab
 0: b
\= Expect no match
    cb
No match
    b
No match

/(?<!c)b/
    ab
 0: b
    b
 0: b
    b
 0: b

/(?:..)*a/
    aba
 0: aba
 1: a

/(?:..)*?a/
    aba
 0: aba
 1: a

/^(){3,5}/
    abc
 0: 

/^(a+)*ax/
    aax
 0: aax

/^((a|b)+)*ax/
    aax
 0: aax

/^((a|bc)+)*ax/
    aax
 0: aax

/(a|x)*ab/
    cab
 0: ab

/(a)*ab/
    cab
 0: ab

/(?:(?i)a)b/
    ab
 0: ab

/((?i)a)b/
    ab
 0: ab

/(?:(?i)a)b/
    Ab
 0: Ab

/((?i)a)b/
    Ab
 0: Ab

/(?:(?i)a)b/
\= Expect no match
    cb
No match
    aB
No match

/((?i)a)b/

/(?i:a)b/
    ab
 0: ab

/((?i:a))b/
    ab
 0: ab

/(?i:a)b/
    Ab
 0: Ab

/((?i:a))b/
    Ab
 0: Ab

/(?i:a)b/
\= Expect no match
    aB
No match
    aB
No match

/((?i:a))b/

/(?:(?-i)a)b/i
    ab
 0: ab

/((?-i)a)b/i
    ab
 0: ab

/(?:(?-i)a)b/i
    aB
 0: aB

/((?-i)a)b/i
    aB
 0: aB

/(?:(?-i)a)b/i
    aB
 0: aB
\= Expect no match
    Ab
No match

/((?-i)a)b/i

/(?:(?-i)a)b/i
    aB
 0: aB

/((?-i)a)b/i
    aB
 0: aB

/(?:(?-i)a)b/i
\= Expect no match
    Ab
No match
    AB
No match

/((?-i)a)b/i

/(?-i:a)b/i
    ab
 0: ab

/((?-i:a))b/i
    ab
 0: ab

/(?-i:a)b/i
    aB
 0: aB

/((?-i:a))b/i
    aB
 0: aB

/(?-i:a)b/i
\= Expect no match
    AB
No match
    Ab
No match

/((?-i:a))b/i

/(?-i:a)b/i
    aB
 0: aB

/((?-i:a))b/i
    aB
 0: aB

/(?-i:a)b/i
\= Expect no match
    Ab
No match
    AB
No match

/((?-i:a))b/i

/((?-i:a.))b/i
\= Expect no match
    AB
No match
    a\nB
No match

/((?s-i:a.))b/i
    a\nB
 0: a\x0aB

/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
    cabbbb
 0: cabbbb

/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
 0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

/foo\w*\d{4}baz/
    foobar1234baz
 0: foobar1234baz

/x(~~)*(?:(?:F)?)?/
    x~~
 0: x~~
 1: x

/^a(?#xxx){3}c/
    aaac
 0: aaac

/^a (?#xxx) (?#yyy) {3}c/x
    aaac
 0: aaac

/(?<![cd])b/
\= Expect no match
    B\nB
No match
    dbcb
No match

/(?<![cd])[ab]/
    dbaacb
 0: a

/(?<!(c|d))b/

/(?<!(c|d))[ab]/
    dbaacb
 0: a

/(?<!cd)[ab]/
    cdaccb
 0: b

/^(?:a?b?)*$/
\= Expect no match
    dbcb
No match
    a--
No match

/((?s)^a(.))((?m)^b$)/
    a\nb\nc\n
 0: a\x0ab

/((?m)^b$)/
    a\nb\nc\n
 0: b

/(?m)^b/
    a\nb\n
 0: b

/(?m)^(b)/
    a\nb\n
 0: b

/((?m)^b)/
    a\nb\n
 0: b

/\n((?m)^b)/
    a\nb\n
 0: \x0ab

/((?s).)c(?!.)/
    a\nb\nc\n
 0: \x0ac
    a\nb\nc\n
 0: \x0ac

/((?s)b.)c(?!.)/
    a\nb\nc\n
 0: b\x0ac
    a\nb\nc\n
 0: b\x0ac

/^b/

/()^b/
\= Expect no match
    a\nb\nc\n
No match
    a\nb\nc\n
No match

/((?m)^b)/
    a\nb\nc\n
 0: b

/(?(?!a)a|b)/

/(?(?!a)b|a)/
    a
 0: a

/(?(?=a)b|a)/
\= Expect no match
    a
No match
    a
No match

/(?(?=a)a|b)/
    a
 0: a

/(\w+:)+/
    one:
 0: one:

/$(?<=^(a))/
    a
 0: 

/([\w:]+::)?(\w+)$/
    abcd
 0: abcd
    xy:z:::abcd
 0: xy:z:::abcd

/^[^bcd]*(c+)/
    aexycd
 0: aexyc

/(a*)b+/
    caab
 0: aab

/([\w:]+::)?(\w+)$/
    abcd
 0: abcd
    xy:z:::abcd
 0: xy:z:::abcd
\= Expect no match
    abcd:
No match
    abcd:
No match

/^[^bcd]*(c+)/
    aexycd
 0: aexyc

/(>a+)ab/

/(?>a+)b/
    aaab
 0: aaab

/([[:]+)/
    a:[b]:
 0: :[

/([[=]+)/
    a=[b]=
 0: =[

/([[.]+)/
    a.[b].
 0: .[

/((?>a+)b)/
    aaab
 0: aaab

/(?>(a+))b/
    aaab
 0: aaab

/((?>[^()]+)|\([^()]*\))+/
    ((abc(ade)ufh()()x
 0: abc(ade)ufh()()x
 1: abc(ade)ufh()()
 2: abc(ade)ufh()
 3: abc(ade)ufh
 4: abc(ade)
 5: abc

/a\Z/
\= Expect no match
    aaab
No match
    a\nb\n
No match

/b\Z/
    a\nb\n
 0: b

/b\z/

/b\Z/
    a\nb
 0: b

/b\z/
    a\nb
 0: b
    
/(?>.*)(?<=(abcd|wxyz))/
    alphabetabcd
 0: alphabetabcd
    endingwxyz
 0: endingwxyz
\= Expect no match
    a rather long string that doesn't end with one of them
No match

/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
    word cat dog elephant mussel cow horse canary baboon snake shark otherword
 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
\= Expect no match
    word cat dog elephant mussel cow horse canary baboon snake shark
No match
  
/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
\= Expect no match
    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
No match

/(?<=\d{3}(?!999))foo/
    999foo
 0: foo
    123999foo 
 0: foo
\= Expect no match
    123abcfoo
No match
    
/(?<=(?!...999)\d{3})foo/
    999foo
 0: foo
    123999foo 
 0: foo
\= Expect no match
    123abcfoo
No match

/(?<=\d{3}(?!999)...)foo/
    123abcfoo
 0: foo
    123456foo 
 0: foo
\= Expect no match
    123999foo  
No match
    
/(?<=\d{3}...)(?<!999)foo/
    123abcfoo   
 0: foo
    123456foo 
 0: foo
\= Expect no match
    123999foo  
No match

/((Z)+|A)*/
    ZABCDEFG
 0: ZA
 1: Z
 2: 

/(Z()|A)*/
    ZABCDEFG
 0: ZA
 1: Z
 2: 

/(Z(())|A)*/
    ZABCDEFG
 0: ZA
 1: Z
 2: 

/((?>Z)+|A)*/
    ZABCDEFG
 0: ZA
 1: Z
 2: 

/((?>)+|A)*/
    ZABCDEFG
 0: 

/a*/g
    abbab
 0: a
 0: 
 0: 
 0: a
 0: 
 0: 

/[[:space:]]+/
    > \x09\x0a\x0c\x0d\x0b<
 0:  \x09\x0a\x0c\x0d\x0b
     
/[[:blank:]]+/
    > \x09\x0a\x0c\x0d\x0b<
 0:  \x09
     
/[\s]+/
    > \x09\x0a\x0c\x0d\x0b<
 0:  \x09\x0a\x0c\x0d\x0b
     
/\s+/
    > \x09\x0a\x0c\x0d\x0b<
 0:  \x09\x0a\x0c\x0d\x0b
     
/ab/x
    ab
 0: ab

/(?!\A)x/m
  a\nxb\n
 0: x

/(?!^)x/m
\= Expect no match
    a\nxb\n
No match

/abc\Qabc\Eabc/
    abcabcabc
 0: abcabcabc
    
/abc\Q(*+|\Eabc/
    abc(*+|abc 
 0: abc(*+|abc

/   abc\Q abc\Eabc/x
    abc abcabc
 0: abc abcabc
\= Expect no match
    abcabcabc  
No match
    
/abc#comment
    \Q#not comment
    literal\E/x
    abc#not comment\n    literal     
 0: abc#not comment\x0a    literal

/abc#comment
    \Q#not comment
    literal/x
    abc#not comment\n    literal     
 0: abc#not comment\x0a    literal

/abc#comment
    \Q#not comment
    literal\E #more comment
    /x
    abc#not comment\n    literal     
 0: abc#not comment\x0a    literal

/abc#comment
    \Q#not comment
    literal\E #more comment/x
    abc#not comment\n    literal     
 0: abc#not comment\x0a    literal

/\Qabc\$xyz\E/
    abc\\\$xyz
 0: abc\$xyz

/\Qabc\E\$\Qxyz\E/
    abc\$xyz
 0: abc$xyz

/\Gabc/
    abc
 0: abc
\= Expect no match
    xyzabc  
No match

/\Gabc./g
    abc1abc2xyzabc3
 0: abc1
 0: abc2

/abc./g
    abc1abc2xyzabc3 
 0: abc1
 0: abc2
 0: abc3

/a(?x: b c )d/
    XabcdY
 0: abcd
\= Expect no match 
    Xa b c d Y 
No match

/((?x)x y z | a b c)/
    XabcY
 0: abc
    AxyzB 
 0: xyz

/(?i)AB(?-i)C/
    XabCY
 0: abC
\= Expect no match
    XabcY  
No match

/((?i)AB(?-i)C|D)E/
    abCE
 0: abCE
    DE
 0: DE
\= Expect no match
    abcE
No match
    abCe  
No match
    dE
No match
    De    
No match

/[z\Qa-d]\E]/
    z
 0: z
    a
 0: a
    -
 0: -
    d
 0: d
    ] 
 0: ]
\= Expect no match
    b     
No match

/(a+)*b/
\= Expect no match
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
No match
    
/(?i)reg(?:ul(?:[a�]|ae)r|ex)/
    REGular
 0: REGular
    regulaer
 0: regulaer
    Regex  
 0: Regex
    regul�r 
 0: regul\xe4r

/����[�-��-�]+/
    �����
 0: \xc5\xe6\xe5\xe4\xe0
    �����
 0: \xc5\xe6\xe5\xe4\xff
    �����
 0: \xc5\xe6\xe5\xe4\xc0
    �����
 0: \xc5\xe6\xe5\xe4\xdf

/(?<=Z)X./
    \x84XAZXB
 0: XB

/^(?(2)a|(1)(2))+$/
    123a
Failed: error -40: backreference condition or recursion test is not supported for DFA matching

/(?<=a|bbbb)c/
    ac
 0: c
    bbbbc
 0: c

/line\nbreak/
    this is a line\nbreak
 0: line\x0abreak
    line one\nthis is a line\nbreak in the second line 
 0: line\x0abreak

/line\nbreak/firstline
    this is a line\nbreak
 0: line\x0abreak
\= Expect no match 
    line one\nthis is a line\nbreak in the second line 
No match

/line\nbreak/m,firstline
    this is a line\nbreak
 0: line\x0abreak
\= Expect no match 
    line one\nthis is a line\nbreak in the second line 
No match

/1234/
    123\=ps
Partial match: 123
\= Expect no match 
    a4\=ps,dfa_restart
No match

/1234/
    123\=ps
Partial match: 123
    4\=ps,dfa_restart
 0: 4

/^/gm
    a\nb\nc\n
 0: 
 0: 
 0: 
    \ 
 0: 
    
/(?<=C\n)^/gm
    A\nC\nC\n 
 0: 

/(?s)A?B/
    AB
 0: AB
    aB  
 0: B

/(?s)A*B/
    AB
 0: AB
    aB  
 0: B

/(?m)A?B/
    AB
 0: AB
    aB  
 0: B

/(?m)A*B/
    AB
 0: AB
    aB  
 0: B

/Content-Type\x3A[^\r\n]{6,}/
    Content-Type:xxxxxyyy 
 0: Content-Type:xxxxxyyy

/Content-Type\x3A[^\r\n]{6,}z/
    Content-Type:xxxxxyyyz
 0: Content-Type:xxxxxyyyz

/Content-Type\x3A[^a]{6,}/
    Content-Type:xxxyyy 
 0: Content-Type:xxxyyy

/Content-Type\x3A[^a]{6,}z/
    Content-Type:xxxyyyz
 0: Content-Type:xxxyyyz

/^abc/Im,newline=lf
Capture group count = 0
Options: multiline
Forced newline is LF
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
    xyz\nabc
 0: abc
    xyz\r\nabc
 0: abc
\= Expect no match
    xyz\rabc
No match
    xyzabc\r
No match
    xyzabc\rpqr
No match
    xyzabc\r\n
No match
    xyzabc\r\npqr
No match

/^abc/Im,newline=crlf
Capture group count = 0
Options: multiline
Forced newline is CRLF
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
    xyz\r\nabclf>
 0: abc
\= Expect no match
    xyz\nabclf
No match
    xyz\rabclf
No match
    
/^abc/Im,newline=cr
Capture group count = 0
Options: multiline
Forced newline is CR
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
    xyz\rabc
 0: abc
\= Expect no match
    xyz\nabc
No match
    xyz\r\nabc
No match

/.*/I,newline=lf
Capture group count = 0
May match empty string
Forced newline is LF
First code unit at start or follows newline
Subject length lower bound = 0
    abc\ndef
 0: abc
    abc\rdef
 0: abc\x0ddef
    abc\r\ndef
 0: abc\x0d

/.*/I,newline=cr
Capture group count = 0
May match empty string
Forced newline is CR
First code unit at start or follows newline
Subject length lower bound = 0
    abc\ndef
 0: abc\x0adef
    abc\rdef
 0: abc
    abc\r\ndef
 0: abc

/.*/I,newline=crlf
Capture group count = 0
May match empty string
Forced newline is CRLF
First code unit at start or follows newline
Subject length lower bound = 0
    abc\ndef
 0: abc\x0adef
    abc\rdef
 0: abc\x0ddef
    abc\r\ndef
 0: abc

/\w+(.)(.)?def/Is
Capture group count = 2
Options: dotall
Starting code units: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
Last code unit = 'f'
Subject length lower bound = 5
    abc\ndef
 0: abc\x0adef
    abc\rdef
 0: abc\x0ddef
    abc\r\ndef
 0: abc\x0d\x0adef

/\w+(.)(.)?def/s
    abc\ndef
 0: abc\x0adef
    abc\rdef
 0: abc\x0ddef
    abc\r\ndef
 0: abc\x0d\x0adef

/^\w+=.*(\\\n.*)*/
    abc=xyz\\\npqr
 0: abc=xyz\\x0apqr
 1: abc=xyz\\x0apq
 2: abc=xyz\\x0ap
 3: abc=xyz\\x0a
 4: abc=xyz\
 5: abc=xyz
 6: abc=xy
 7: abc=x
 8: abc=

/^(a()*)*/
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a
 4: 

/^(?:a(?:(?:))*)*/
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a
 4: 

/^(a()+)+/
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a

/^(?:a(?:(?:))+)+/
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a

/(a|)*\d/
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
\= Expect no match
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match

/(?>a|)*\d/
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
\= Expect no match
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match

/(?:a|)*\d/
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
\= Expect no match
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match

/^a.b/newline=lf
    a\rb
 0: a\x0db
\= Expect no match
    a\nb
No match

/^a.b/newline=cr
    a\nb
 0: a\x0ab
\= Expect no match
    a\rb
No match

/^a.b/newline=anycrlf
    a\x85b
 0: a\x85b
\= Expect no match
    a\rb
No match

/^a.b/newline=any
\= Expect no match
    a\nb
No match
    a\rb
No match
    a\x85b
No match

/^abc./gmx,newline=any
    abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
 0: abc1
 0: abc2
 0: abc3
 0: abc4
 0: abc5
 0: abc6
 0: abc7

/abc.$/gmx,newline=any
    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9
 0: abc1
 0: abc2
 0: abc3
 0: abc4
 0: abc5
 0: abc6
 0: abc9

/^a\Rb/bsr=unicode
    a\nb
 0: a\x0ab
    a\rb
 0: a\x0db
    a\r\nb
 0: a\x0d\x0ab
    a\x0bb
 0: a\x0bb
    a\x0cb
 0: a\x0cb
    a\x85b   
 0: a\x85b
\= Expect no match
    a\n\rb    
No match

/^a\R*b/bsr=unicode
    ab
 0: ab
    a\nb
 0: a\x0ab
    a\rb
 0: a\x0db
    a\r\nb
 0: a\x0d\x0ab
    a\x0bb
 0: a\x0bb
    a\x0cb
 0: a\x0cb
    a\x85b   
 0: a\x85b
    a\n\rb    
 0: a\x0a\x0db
    a\n\r\x85\x0cb 
 0: a\x0a\x0d\x85\x0cb

/^a\R+b/bsr=unicode
    a\nb
 0: a\x0ab
    a\rb
 0: a\x0db
    a\r\nb
 0: a\x0d\x0ab
    a\x0bb
 0: a\x0bb
    a\x0cb
 0: a\x0cb
    a\x85b   
 0: a\x85b
    a\n\rb    
 0: a\x0a\x0db
    a\n\r\x85\x0cb 
 0: a\x0a\x0d\x85\x0cb
\= Expect no match
    ab  
No match
    
/^a\R{1,3}b/bsr=unicode
    a\nb
 0: a\x0ab
    a\n\rb
 0: a\x0a\x0db
    a\n\r\x85b
 0: a\x0a\x0d\x85b
    a\r\n\r\nb 
 0: a\x0d\x0a\x0d\x0ab
    a\r\n\r\n\r\nb 
 0: a\x0d\x0a\x0d\x0a\x0d\x0ab
    a\n\r\n\rb
 0: a\x0a\x0d\x0a\x0db
    a\n\n\r\nb 
 0: a\x0a\x0a\x0d\x0ab
\= Expect no match
    a\n\n\n\rb
No match
    a\r
No match

/.+foo/
    afoo
 0: afoo
\= Expect no match 
    \r\nfoo 
No match
    \nfoo 
No match

/.+foo/newline=crlf
    afoo
 0: afoo
    \nfoo 
 0: \x0afoo
\= Expect no match 
    \r\nfoo 
No match

/.+foo/newline=any
    afoo
 0: afoo
\= Expect no match 
    \nfoo 
No match
    \r\nfoo 
No match

/.+foo/s
    afoo
 0: afoo
    \r\nfoo 
 0: \x0d\x0afoo
    \nfoo 
 0: \x0afoo

/^$/gm,newline=any
    abc\r\rxyz
 0: 
    abc\n\rxyz  
 0: 
\= Expect no match 
    abc\r\nxyz
No match

/^X/m
    XABC
 0: X
\= Expect no match 
    XABC\=notbol
No match

/(?m)^$/g,newline=any,aftertext
    abc\r\n\r\n
 0: 
 0+ \x0d\x0a

/(?m)^$|^\r\n/g,newline=any,aftertext
    abc\r\n\r\n
 0: \x0d\x0a
 0+ 
 1: 
    
/(?m)$/g,newline=any,aftertext
    abc\r\n\r\n
 0: 
 0+ \x0d\x0a\x0d\x0a
 0: 
 0+ \x0d\x0a
 0: 
 0+ 

/(?|(abc)|(xyz))/
   >abc<
 0: abc
   >xyz< 
 0: xyz

/(x)(?|(abc)|(xyz))(x)/
    xabcx
 0: xabcx
    xxyzx 
 0: xxyzx

/(x)(?|(abc)(pqr)|(xyz))(x)/
    xabcpqrx
 0: xabcpqrx
    xxyzx 
 0: xxyzx

/(?|(abc)|(xyz))(?1)/
    abcabc
 0: abcabc
    xyzabc 
 0: xyzabc
\= Expect no match 
    xyzxyz 
No match
 
/\H\h\V\v/
    X X\x0a
 0: X X\x0a
    X\x09X\x0b
 0: X\x09X\x0b
\= Expect no match
    \xa0 X\x0a   
No match
    
/\H*\h+\V?\v{3,4}/
    \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
 0: \x09 \xa0X\x0a\x0b\x0c\x0d
    \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
 0: \x09 \xa0\x0a\x0b\x0c\x0d
    \x09\x20\xa0\x0a\x0b\x0c
 0: \x09 \xa0\x0a\x0b\x0c
\= Expect no match 
    \x09\x20\xa0\x0a\x0b
No match
     
/\H{3,4}/
    XY  ABCDE
 0: ABCD
    XY  PQR ST 
 0: PQR
    
/.\h{3,4}./
    XY  AB    PQRS
 0: B    P
 1: B    

/\h*X\h?\H+Y\H?Z/
    >XNNNYZ
 0: XNNNYZ
    >  X NYQZ
 0:   X NYQZ
\= Expect no match
    >XYZ   
No match
    >  X NY Z
No match

/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/
    >XY\x0aZ\x0aA\x0bNN\x0c
 0: XY\x0aZ\x0aA\x0bNN\x0c
    >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c
 0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c

/.+A/newline=crlf
\= Expect no match
    \r\nA
No match
    
/\nA/newline=crlf
    \r\nA 
 0: \x0aA

/[\r\n]A/newline=crlf
    \r\nA 
 0: \x0aA

/(\r|\n)A/newline=crlf
    \r\nA 
 0: \x0aA

/a\Rb/I,bsr=anycrlf
Capture group count = 0
\R matches CR, LF, or CRLF
First code unit = 'a'
Last code unit = 'b'
Subject length lower bound = 3
    a\rb
 0: a\x0db
    a\nb
 0: a\x0ab
    a\r\nb
 0: a\x0d\x0ab
\= Expect no match
    a\x85b
No match
    a\x0bb     
No match

/a\Rb/I,bsr=unicode
Capture group count = 0
\R matches any Unicode newline
First code unit = 'a'
Last code unit = 'b'
Subject length lower bound = 3
    a\rb
 0: a\x0db
    a\nb
 0: a\x0ab
    a\r\nb
 0: a\x0d\x0ab
    a\x85b
 0: a\x85b
    a\x0bb     
 0: a\x0bb
    
/a\R?b/I,bsr=anycrlf
Capture group count = 0
\R matches CR, LF, or CRLF
First code unit = 'a'
Last code unit = 'b'
Subject length lower bound = 2
    a\rb
 0: a\x0db
    a\nb
 0: a\x0ab
    a\r\nb
 0: a\x0d\x0ab
\= Expect no match
    a\x85b
No match
    a\x0bb     
No match

/a\R?b/I,bsr=unicode
Capture group count = 0
\R matches any Unicode newline
First code unit = 'a'
Last code unit = 'b'
Subject length lower bound = 2
    a\rb
 0: a\x0db
    a\nb
 0: a\x0ab
    a\r\nb
 0: a\x0d\x0ab
    a\x85b
 0: a\x85b
    a\x0bb     
 0: a\x0bb
    
/a\R{2,4}b/I,bsr=anycrlf
Capture group count = 0
\R matches CR, LF, or CRLF
First code unit = 'a'
Last code unit = 'b'
Subject length lower bound = 4
    a\r\n\nb
 0: a\x0d\x0a\x0ab
    a\n\r\rb
 0: a\x0a\x0d\x0db
    a\r\n\r\n\r\n\r\nb
 0: a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0ab
\= Expect no match
    a\x0b\x0bb     
No match
    a\x85\x85b
No match

/a\R{2,4}b/I,bsr=unicode
Capture group count = 0
\R matches any Unicode newline
First code unit = 'a'
Last code unit = 'b'
Subject length lower bound = 4
    a\r\rb
 0: a\x0d\x0db
    a\n\n\nb
 0: a\x0a\x0a\x0ab
    a\r\n\n\r\rb
 0: a\x0d\x0a\x0a\x0d\x0db
    a\x85\x85b
 0: a\x85\x85b
    a\x0b\x0bb     
 0: a\x0b\x0bb
\= Expect no match 
    a\r\r\r\r\rb 
No match
    
/a(?!)|\wbc/
    abc 
 0: abc

/a[]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
\= Expect no match
    ab
No match

/a[]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
\= Expect no match
    ab 
No match

/a[]*+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
\= Expect no match
    ab 
No match

/a[^]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
    aXb
 0: aXb
    a\nb 
 0: a\x0ab
\= Expect no match
    ab  
No match
    
/a[^]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
    aXb
 0: aXb
    a\nX\nXb 
 0: a\x0aX\x0aXb
\= Expect no match
    ab  
No match

/X$/dollar_endonly
    X
 0: X
\= Expect no match 
    X\n 
No match

/X$/
    X
 0: X
    X\n 
 0: X

/xyz/auto_callout
  xyz 
--->xyz
 +0 ^       x
 +1 ^^      y
 +2 ^ ^     z
 +3 ^  ^    End of pattern
 0: xyz
  abcxyz 
--->abcxyz
 +0    ^       x
 +1    ^^      y
 +2    ^ ^     z
 +3    ^  ^    End of pattern
 0: xyz
\= Expect no match 
  abc
No match
  abcxypqr  
No match

/xyz/auto_callout,no_start_optimize
  abcxyz 
--->abcxyz
 +0 ^          x
 +0  ^         x
 +0   ^        x
 +0    ^       x
 +1    ^^      y
 +2    ^ ^     z
 +3    ^  ^    End of pattern
 0: xyz
\= Expect no match 
  abc
--->abc
 +0 ^       x
 +0  ^      x
 +0   ^     x
 +0    ^    x
No match
  abcxypqr  
--->abcxypqr
 +0 ^            x
 +0  ^           x
 +0   ^          x
 +0    ^         x
 +1    ^^        y
 +2    ^ ^       z
 +0     ^        x
 +0      ^       x
 +0       ^      x
 +0        ^     x
 +0         ^    x
No match

/(*NO_START_OPT)xyz/auto_callout
  abcxyz 
--->abcxyz
+15 ^          x
+15  ^         x
+15   ^        x
+15    ^       x
+16    ^^      y
+17    ^ ^     z
+18    ^  ^    End of pattern
 0: xyz
  
/(?C)ab/
  ab
--->ab
  0 ^      a
 0: ab
  ab\=callout_none
 0: ab
  
/ab/auto_callout
  ab
--->ab
 +0 ^      a
 +1 ^^     b
 +2 ^ ^    End of pattern
 0: ab
  ab\=callout_none
 0: ab

/^"((?(?=[a])[^"])|b)*"$/auto_callout
    "ab"
--->"ab"
 +0 ^        ^
 +1 ^        "
 +2 ^^       (
+21 ^^       "
 +3 ^^       (?
+18 ^^       b
 +5 ^^       (?=
 +8  ^       [a]
+11  ^^      )
+12 ^^       [^"]
+16 ^ ^      )
+17 ^ ^      |
+21 ^ ^      "
 +3 ^ ^      (?
+18 ^ ^      b
 +5 ^ ^      (?=
 +8   ^      [a]
+19 ^  ^     )*
+21 ^  ^     "
 +3 ^  ^     (?
+18 ^  ^     b
 +5 ^  ^     (?=
 +8    ^     [a]
+17 ^  ^     |
+22 ^   ^    $
+23 ^   ^    End of pattern
 0: "ab"
    "ab"\=callout_none
 0: "ab"

/\d+X|9+Y/
    ++++123999\=ps
Partial match: 123999
    ++++123999Y\=ps
 0: 999Y

/Z(*F)/
\= Expect no match 
    Z\=ps
No match
    ZA\=ps
No match
    
/Z(?!)/
\= Expect no match 
    Z\=ps
No match
    ZA\=ps
No match

/dog(sbody)?/
    dogs\=ps
 0: dog
    dogs\=ph
Partial match: dogs
    
/dog(sbody)??/
    dogs\=ps
 0: dog
    dogs\=ph
Partial match: dogs

/dog|dogsbody/
    dogs\=ps
 0: dog
    dogs\=ph
Partial match: dogs
 
/dogsbody|dog/
    dogs\=ps
 0: dog
    dogs\=ph
Partial match: dogs

/Z(*F)Q|ZXY/
    Z\=ps
Partial match: Z
\= Expect no match 
    ZA\=ps
No match
    X\=ps
No match

/\bthe cat\b/
    the cat\=ps
 0: the cat
    the cat\=ph
Partial match: the cat

/dog(sbody)?/
    dogs\=ps
 0: dog
    body\=dfa_restart
 0: body

/dog(sbody)?/
    dogs\=ph
Partial match: dogs
    body\=dfa_restart
 0: body

/abc/
   abc\=ps
 0: abc
   abc\=ph
 0: abc

/abc\K123/
    xyzabc123pqr
Failed: error -42: pattern contains an item that is not supported for DFA matching
    
/(?<=abc)123/allusedtext
    xyzabc123pqr 
 0: abc123
    <<<   
    xyzabc12\=ps
Partial match: abc12
               <<<
    xyzabc12\=ph
Partial match: abc12
               <<<

/\babc\b/allusedtext
    +++abc+++
 0: +abc+
    <   >
    +++ab\=ps
Partial match: +ab
               <
    +++ab\=ph
Partial match: +ab
               <

/(?=C)/g,aftertext
    ABCDECBA
 0: 
 0+ CDECBA
 0: 
 0+ CBA

/(abc|def|xyz)/I
Capture group count = 1
Starting code units: a d x 
Subject length lower bound = 3
    terhjk;abcdaadsfe
 0: abc
    the quick xyz brown fox 
 0: xyz
\= Expect no match
    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
No match

/(abc|def|xyz)/I,no_start_optimize
Capture group count = 1
Options: no_start_optimize
    terhjk;abcdaadsfe
 0: abc
    the quick xyz brown fox
 0: xyz
\= Expect no match
    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
No match

/abcd*/aftertext
    xxxxabcd\=ps
 0: abcd
 0+ 
    xxxxabcd\=ph
Partial match: abcd
    dddxxx\=dfa_restart
 0: ddd
 0+ xxx
    xxxxabcd\=ph
Partial match: abcd
    xxx\=dfa_restart
 0: 
 0+ xxx

/abcd*/i
    xxxxabcd\=ps
 0: abcd
    xxxxabcd\=ph
Partial match: abcd
    XXXXABCD\=ps
 0: ABCD
    XXXXABCD\=ph
Partial match: ABCD

/abc\d*/
    xxxxabc1\=ps
 0: abc1
    xxxxabc1\=ph
Partial match: abc1

/abc[de]*/
    xxxxabcde\=ps
 0: abcde
    xxxxabcde\=ph
Partial match: abcde

/(?:(?1)|B)(A(*F)|C)/
    ABCD
 0: BC
    CCD
 0: CC
\= Expect no match
    CAD   
No match

/^(?:(?1)|B)(A(*F)|C)/
    CCD
 0: CC
    BCD 
 0: BC
\= Expect no match
    ABCD
No match
    CAD
No match
    BAD    
No match

/^(?!a(*SKIP)b)/
    ac
Failed: error -42: pattern contains an item that is not supported for DFA matching
    
/^(?=a(*SKIP)b|ac)/
    ac
Failed: error -42: pattern contains an item that is not supported for DFA matching
    
/^(?=a(*THEN)b|ac)/
    ac
Failed: error -42: pattern contains an item that is not supported for DFA matching
    
/^(?=a(*PRUNE)b)/
    ab  
Failed: error -42: pattern contains an item that is not supported for DFA matching

/^(?(?!a(*SKIP)b))/
    ac
Failed: error -42: pattern contains an item that is not supported for DFA matching

/(?<=abc)def/allusedtext
    abc\=ph
Partial match: abc
               <<<

/abc$/
    abc
 0: abc
    abc\=ps
 0: abc
    abc\=ph
Partial match: abc

/abc$/m
    abc
 0: abc
    abc\n
 0: abc
    abc\=ph
Partial match: abc
    abc\n\=ph
 0: abc
    abc\=ps
 0: abc
    abc\n\=ps
 0: abc

/abc\z/
    abc
 0: abc
    abc\=ps
 0: abc
    abc\=ph
Partial match: abc

/abc\Z/
    abc
 0: abc
    abc\=ps
 0: abc
    abc\=ph
Partial match: abc

/abc\b/
    abc
 0: abc
    abc\=ps
 0: abc
    abc\=ph
Partial match: abc

/abc\B/
    abc\=ps
Partial match: abc
    abc\=ph
Partial match: abc
\= Expect no match 
    abc
No match

/.+/
    abc\=offset=0
 0: abc
    abc\=offset=1
 0: bc
    abc\=offset=2
 0: c
\= Bad offsets
    abc\=offset=4
Failed: error -33: bad offset value
    abc\=offset=-4 
** Invalid value in 'offset=-4'
\= Expect no match 
    abc\=offset=3
No match

/^(?:a)++\w/
     aaaab
 0: aaaab
\= Expect no match 
     aaaa 
No match
     bbb 
No match

/^(?:aa|(?:a)++\w)/
     aaaab
 0: aaaab
 1: aa
     aaaa 
 0: aa
\= Expect no match 
     bbb 
No match

/^(?:a)*+\w/
     aaaab
 0: aaaab
     bbb 
 0: b
\= Expect no match 
     aaaa 
No match

/^(a)++\w/
     aaaab
 0: aaaab
\= Expect no match 
     aaaa 
No match
     bbb 
No match

/^(a|)++\w/
     aaaab
 0: aaaab
\= Expect no match 
     aaaa 
No match
     bbb 
No match

/(?=abc){3}abc/aftertext
    abcabcabc
 0: abc
 0+ abcabc
\= Expect no match
    xyz  
No match
    
/(?=abc)+abc/aftertext
    abcabcabc
 0: abc
 0+ abcabc
\= Expect no match
    xyz  
No match
    
/(?=abc)++abc/aftertext
    abcabcabc
 0: abc
 0+ abcabc
\= Expect no match
    xyz  
No match
    
/(?=abc){0}xyz/
    xyz 
 0: xyz

/(?=abc){1}xyz/
\= Expect no match
    xyz 
No match
    
/(?=(a))?./
    ab
 0: a
    bc
 0: b
      
/(?=(a))??./
    ab
 0: a
    bc
 0: b

/^(?=(a)){0}b(?1)/
    backgammon
 0: ba

/^(?=(?1))?[az]([abc])d/
    abd 
 0: abd
    zcdxx 
 0: zcd

/^(?!a){0}\w+/
    aaaaa
 0: aaaaa

/(?<=(abc))?xyz/
    abcxyz
 0: xyz
    pqrxyz 
 0: xyz

/((?2))((?1))/
    abc
Failed: error -52: nested recursion at the same subject position

/(?(R)a+|(?R)b)/
    aaaabcde
 0: aaaab

/(?(R)a+|((?R))b)/
    aaaabcde
 0: aaaab

/((?(R)a+|(?1)b))/
    aaaabcde
 0: aaaab

/((?(R2)a+|(?1)b))()/
    aaaabcde
Failed: error -40: backreference condition or recursion test is not supported for DFA matching

/(?(R)a*(?1)|((?R))b)/
    aaaabcde
Failed: error -52: nested recursion at the same subject position

/(a+)/no_auto_possess
    aaaa\=ovector=3
Matched, but offsets vector is too small to show all matches
 0: aaaa
 1: aaa
 2: aa
    aaaa\=ovector=4
 0: aaaa
 1: aaa
 2: aa
 3: a

/^\R/
    \r\=ps
 0: \x0d
    \r\=ph
Partial match: \x0d
    
/^\R{2,3}x/
    \r\=ps
Partial match: \x0d
    \r\=ph
Partial match: \x0d
    \r\r\=ps
Partial match: \x0d\x0d
    \r\r\=ph
Partial match: \x0d\x0d
    \r\r\r\=ps
Partial match: \x0d\x0d\x0d
    \r\r\r\=ph
Partial match: \x0d\x0d\x0d
    \r\rx
 0: \x0d\x0dx
    \r\r\rx    
 0: \x0d\x0d\x0dx

/^\R{2,3}?x/
    \r\=ps
Partial match: \x0d
    \r\=ph
Partial match: \x0d
    \r\r\=ps
Partial match: \x0d\x0d
    \r\r\=ph
Partial match: \x0d\x0d
    \r\r\r\=ps
Partial match: \x0d\x0d\x0d
    \r\r\r\=ph
Partial match: \x0d\x0d\x0d
    \r\rx
 0: \x0d\x0dx
    \r\r\rx    
 0: \x0d\x0d\x0dx
    
/^\R?x/
    \r\=ps
Partial match: \x0d
    \r\=ph
Partial match: \x0d
    x
 0: x
    \rx  
 0: \x0dx

/^\R+x/
    \r\=ps
Partial match: \x0d
    \r\=ph
Partial match: \x0d
    \r\n\=ps
Partial match: \x0d\x0a
    \r\n\=ph
Partial match: \x0d\x0a
    \rx  
 0: \x0dx

/^a$/newline=crlf
    a\r\=ps
Partial match: a\x0d
    a\r\=ph
Partial match: a\x0d

/^a$/m,newline=crlf
    a\r\=ps
Partial match: a\x0d
    a\r\=ph
Partial match: a\x0d

/^(a$|a\r)/newline=crlf
    a\r\=ps
 0: a\x0d
    a\r\=ph
Partial match: a\x0d

/^(a$|a\r)/m,newline=crlf
    a\r\=ps
 0: a\x0d
    a\r\=ph
Partial match: a\x0d

/./newline=crlf
    \r\=ps
 0: \x0d
    \r\=ph
Partial match: \x0d
  
/.{2,3}/newline=crlf
    \r\=ps
Partial match: \x0d
    \r\=ph
Partial match: \x0d
    \r\r\=ps
 0: \x0d\x0d
    \r\r\=ph
Partial match: \x0d\x0d
    \r\r\r\=ps
 0: \x0d\x0d\x0d
    \r\r\r\=ph
Partial match: \x0d\x0d\x0d

/.{2,3}?/newline=crlf
    \r\=ps
Partial match: \x0d
    \r\=ph
Partial match: \x0d
    \r\r\=ps
 0: \x0d\x0d
    \r\r\=ph
Partial match: \x0d\x0d
    \r\r\r\=ps
 0: \x0d\x0d\x0d
 1: \x0d\x0d
    \r\r\r\=ph
Partial match: \x0d\x0d\x0d

# Test simple validity check for restarts 

/abcdef/
   abc\=dfa_restart
Failed: error -38: invalid data in workspace for DFA restart

/<H((?(?!<H|F>)(.)|(?R))++)*F>/
    text <H more text <H texting more  hexA0-"\xA0"    hex above 7F-"\xBC" F> text xxxxx <H text F> text F> text2 <H text sample F> more text.
 0: <H more text <H texting more  hexA0-"\xa0"    hex above 7F-"\xbc" F> text xxxxx <H text F> text F>

/^(?>.{4})abc|^\w\w.xabcd/
    xxxxabcd
 0: xxxxabcd
 1: xxxxabc
    xx\xa0xabcd 
 0: xx\xa0xabcd
 1: xx\xa0xabc

/^(.{4}){2}+abc|^\w\w.x\w\w\w\wabcd/
    xxxxxxxxabcd
 0: xxxxxxxxabcd
 1: xxxxxxxxabc
    xx\xa0xxxxxabcd 
 0: xx\xa0xxxxxabcd
 1: xx\xa0xxxxxabc

/abcd/
    abcd\=ovector=0
 0: abcd

# These tests show up auto-possessification 

/[ab]*/
    aaaa
 0: aaaa
    
/[ab]*?/
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a
 4: 
    
/[ab]?/
    aaaa
 0: a
    
/[ab]??/
    aaaa
 0: a
 1: 
    
/[ab]+/
    aaaa
 0: aaaa
    
/[ab]+?/
    aaaa
 0: aaaa
 1: aaa
 2: aa
 3: a
    
/[ab]{2,3}/
    aaaa
 0: aaa
    
/[ab]{2,3}?/
    aaaa
 0: aaa
 1: aa
    
/[ab]{2,}/
    aaaa    
 0: aaaa

/[ab]{2,}?/
    aaaa    
 0: aaaa
 1: aaa
 2: aa

'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'
    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
 0: NON QUOTED "QUOT""ED" AFTER 

'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
 0: NON QUOTED "QUOT""ED" AFTER 

/abc(?=xyz)/allusedtext
    abcxyzpqr
 0: abcxyz
       >>>
    abcxyzpqr\=aftertext
 0: abcxyz
       >>>
 0+ xyzpqr
    
/(?<=pqr)abc(?=xyz)/allusedtext
    xyzpqrabcxyzpqr
 0: pqrabcxyz
    <<<   >>>
    xyzpqrabcxyzpqr\=aftertext
 0: pqrabcxyz
    <<<   >>>
 0+ xyzpqr
    
/a\b/
    a.\=allusedtext
 0: a.
     >
    a\=allusedtext  
 0: a

/abc(?=abcde)(?=ab)/allusedtext
    abcabcdefg
 0: abcabcde
       >>>>>

/a*?b*?/
    ab
 0: ab
 1: a
 2: 

/(*NOTEMPTY)a*?b*?/
    ab
 0: ab
 1: a
    ba
 0: b
    cb  
 0: b

/(*NOTEMPTY_ATSTART)a*?b*?/aftertext
    ab
 0: ab
 0+ 
 1: a
    cdab 
 0: 
 0+ dab

/(a)(b)|(c)/
    XcX\=ovector=2,get=1,get=2,get=3,get=4,getall
 0: c
Get substring 1 failed (-55): requested value is not set
Get substring 2 failed (-54): requested value is not available
Get substring 3 failed (-54): requested value is not available
Get substring 4 failed (-54): requested value is not available
 0L c

/(?<A>aa)/
    aa\=get=A
 0: aa
Get substring 'A' failed (-41): function is not supported for DFA matching
    aa\=copy=A 
 0: aa
Copy substring 'A' failed (-41): function is not supported for DFA matching

/a+/no_auto_possess
    a\=ovector=2,get=1,get=2,getall
 0: a
Get substring 1 failed (-55): requested value is not set
Get substring 2 failed (-54): requested value is not available
 0L a
    aaa\=ovector=2,get=1,get=2,getall
Matched, but offsets vector is too small to show all matches
 0: aaa
 1: aa
 1G aa (2)
Get substring 2 failed (-54): requested value is not available
 0L aaa
 1L aa

/a(b)c(d)/
    abc\=ph,copy=0,copy=1,getall
Partial match: abc
 0C abc (3)
Copy substring 1 failed (-2): partial match
get substring list failed (-2): partial match

/ab(?C" any text with spaces ")cde/B
------------------------------------------------------------------
        Bra
        ab
        CalloutStr " any text with spaces " 6 30 1
        cde
        Ket
        End
------------------------------------------------------------------
    abcde
Callout (6): " any text with spaces "
--->abcde
    ^ ^       c
 0: abcde
    12abcde
Callout (6): " any text with spaces "
--->12abcde
      ^ ^       c
 0: abcde

/^a(b)c(?C1)def/
      abcdef
--->abcdef
  1 ^  ^       d
 0: abcdef

/^a(b)c(?C"AB")def/
      abcdef
Callout (10): "AB"
--->abcdef
    ^  ^       d
 0: abcdef

/^a(b)c(?C1)def/
      abcdef\=callout_capture
Callout 1: last capture = 0
--->abcdef
    ^  ^       d
 0: abcdef

/^a(b)c(?C{AB})def/B
------------------------------------------------------------------
        Bra
        ^
        a
        CBra 1
        b
        Ket
        c
        CalloutStr {AB} 10 14 1
        def
        Ket
        End
------------------------------------------------------------------
      abcdef\=callout_capture
Callout (10): {AB} last capture = 0
--->abcdef
    ^  ^       d
 0: abcdef

/^(?(?C25)(?=abc)abcd|xyz)/B
------------------------------------------------------------------
        Bra
        ^
        Cond
        Callout 25 9 3
        Assert
        abc
        Ket
        abcd
        Alt
        xyz
        Ket
        Ket
        End
------------------------------------------------------------------
    abcdefg
--->abcdefg
 25 ^           (?=
 0: abcd
    xyz123 
--->xyz123
 25 ^          (?=
 0: xyz

/^(?(?C$abc$)(?=abc)abcd|xyz)/B
------------------------------------------------------------------
        Bra
        ^
        Cond
        CalloutStr $abc$ 7 12 3
        Assert
        abc
        Ket
        abcd
        Alt
        xyz
        Ket
        Ket
        End
------------------------------------------------------------------
    abcdefg
Callout (7): $abc$
--->abcdefg
    ^           (?=
 0: abcd
    xyz123 
Callout (7): $abc$
--->xyz123
    ^          (?=
 0: xyz

/^ab(?C'first')cd(?C"second")ef/
    abcdefg
Callout (7): 'first'
--->abcdefg
    ^ ^         c
Callout (20): "second"
--->abcdefg
    ^   ^       e
 0: abcdef

/(?:a(?C`code`)){3}X/
    aaaXY
Callout (8): `code`
--->aaaXY
    ^^        ){3}
Callout (8): `code`
--->aaaXY
    ^ ^       ){3}
Callout (8): `code`
--->aaaXY
    ^  ^      ){3}
 0: aaaX

# Binary zero in callout string
/"a(?C'x" 00 "z')b"/hex
    abcdefgh
Callout (5): 'x\x00z'
--->abcdefgh
    ^^           b
 0: ab

/(?(?!)a|b)/
    bbb
 0: b
\= Expect no match
    aaa 
No match

/^/gm
    \n\n\n
 0: 
 0: 
 0: 

/^/gm,alt_circumflex
    \n\n\n
 0: 
 0: 
 0: 
 0: 

/abc/use_offset_limit
    1234abcde\=offset_limit=100
 0: abc
    1234abcde\=offset_limit=9
 0: abc
    1234abcde\=offset_limit=4
 0: abc
    1234abcde\=offset_limit=4,offset=4
 0: abc
\= Expect no match
    1234abcde\=offset_limit=4,offset=5
No match
    1234abcde\=offset_limit=3
No match

/(?<=abc)/use_offset_limit
    1234abc\=offset_limit=7
 0: 
\= Expect no match
    1234abc\=offset_limit=6
No match

/abcd/null_context
    abcd\=null_context
 0: abcd

/()()a+/no_auto_possess
    aaa\=allcaptures
** Ignored after DFA matching: allcaptures
 0: aaa
 1: aa
 2: a
    a\=allcaptures
** Ignored after DFA matching: allcaptures
 0: a

/(*LIMIT_DEPTH=100)^((.)(?1)|.)$/
\= Expect depth limit exceeded
    a[00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]
Failed: error -53: matching depth limit exceeded

/(*LIMIT_HEAP=0)^((.)(?1)|.)$/
\= Expect heap limit exceeded
    a[00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]
Failed: error -63: heap limit exceeded

/(*LIMIT_HEAP=50000)^((.)(?1)|.)$/
\= Expect success
    a[00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]
 0: a[00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]

/(02-)?[0-9]{3}-[0-9]{3}/
    02-123-123
 0: 02-123-123

/^(a(?2))(b)(?1)/
    abbab\=find_limits 
Minimum heap limit = 0
Minimum match limit = 4
Minimum depth limit = 2
 0: abbab

/abc/endanchored
    xyzabc
 0: abc
\= Expect no match
    xyzabcdef
No match
\= Expect error
    xyzabc\=ph
Failed: error -34: bad option value

/abc/
    xyzabc\=endanchored
 0: abc
\= Expect no match
    xyzabcdef\=endanchored
No match
\= Expect error
    xyzabc\=ps,endanchored
Failed: error -34: bad option value

/abc|bcd/endanchored
    xyzabcd
 0: bcd
\= Expect no match
    xyzabcdef
No match

/(*NUL)^.*/
    a\nb\x00ccc
 0: a\x0ab
    
/(*NUL)^.*/s
    a\nb\x00ccc
 0: a\x0ab\x00ccc
    
/^x/m,newline=nul
    ab\x00xy
 0: x
    
/'#comment' 0d 0a 00 '^x\' 0a 'y'/x,newline=nul,hex
    x\nyz 
 0: x\x0ay
 
/(*NUL)^X\NY/
    X\nY
 0: X\x0aY
    X\rY
 0: X\x0dY
\= Expect no match
    X\x00Y      
No match

/(?<=abc|)/
    abcde\=aftertext
 0: 
 0+ abcde
    
/(?<=|abc)/ 
    abcde\=aftertext
 0: 
 0+ abcde

/(?<=abc|)/endanchored
    abcde\=aftertext
 0: 
 0+ 
    
/(?<=|abc)/endanchored
    abcde\=aftertext
 0: 
 0+ 

/(*LIMIT_MATCH=100).*(?![|H]?.*(?![|H]?););.*(?![|H]?.*(?![|H]?););\x00\x00\x00\x00\x00\x00\x00(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?![|);)?.*(![|H]?);)?.*(?![|H]?);)?.*(?![|H]?);)?.*(?![|H]););![|H]?););[|H]?);|H]?);)\x00\x00\x00\x00\x00\x00H]?););?![|H]?);)?.*(?![|H]?););[||H]?);)?.*(?![|H]?););[|H]?);(?![|H]?););![|H]?););[|H]?);|H]?);)?.*(?![|H]?););;[\x00\x00\x00\x00\x00\x00\x00![|H]?););![|H]?););[|H]?);|H]?);)?.*(?![|H]?););/no_dotstar_anchor
\= Expect limit exceeded
.*(?![|H]?.*(?![|H]?););.*(?![|H]?.*(?![|H]?););\x00\x00\x00\x00\x00\x00\x00(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?!(?![|);)?.*(![|H]?);)?.*(?![|H]?);)?.*(?![|H]?);)?.*(?![|H]););![|H]?););[|H]?);|H]?);)\x00\x00\x00\x00\x00\x00H]?););?![|H]?);)?.*(?![|H]?););[||H]?);)?.*(?![|H]?););[|H]?);(?![|H]?););![|H]?););[|H]?);|H]?);)?.*(?![|H]?););;[\x00\x00\x00\x00\x00\x00\x00![|H]?););![|H]?););[|H]?);|H]?);)?.*(?![|H]?););
Failed: error -47: match limit exceeded

/\n/firstline
    xyz\nabc
 0: \x0a

/\nabc/firstline
    xyz\nabc
 0: \x0aabc

/\x{0a}abc/firstline,newline=crlf
\= Expect no match
    xyz\r\nabc
No match

/[abc]/firstline
\= Expect no match
    \na
No match
    
/foobar/
    the foobar thing\=copy_matched_subject
 0: foobar
    the foobar thing\=copy_matched_subject,zero_terminate
 0: foobar

/foobar/g
    the foobar thing foobar again\=copy_matched_subject
 0: foobar
 0: foobar

/(?(VERSION>=0)^B0W)/
    B0W-W0W
 0: B0W
\= Expect no match
    0
No match

/(?(VERSION>=1000)^B0W|W0W)/
    B0W-W0W
 0: W0W
\= Expect no match
    0
No match

/(?<=pqr)abc(?=xyz)/
    123pqrabcxy\=ps,allusedtext
Partial match: pqrabcxy
               <<<
    123pqrabcxyz\=ps,allusedtext
 0: pqrabcxyz
    <<<   >>>

/(?>a+b)/
    aaaa\=ps
Partial match: aaaa
    aaaab\=ps
 0: aaaab
    
/(abc)(?1)/
    abca\=ps
Partial match: abca
    abcabc\=ps
 0: abcabc

/(?(?=abc).*|Z)/
    ab\=ps
Partial match: ab
    abcxyz\=ps
 0: abcxyz

/(abc)++x/
    abcab\=ps
Partial match: abcab
    abc\=ps 
Partial match: abc
    ab\=ps
Partial match: ab
    abcx  
 0: abcx

/\z/
    abc\=ph 
Partial match: 
    abc\=ps 
 0: 
   
/\Z/
    abc\=ph 
Partial match: 
    abc\=ps 
 0: 
    abc\n\=ph
Partial match: \x0a
    abc\n\=ps
 0: 

/c*+(?<=[bc])/
    abc\=ph
Partial match: c
    ab\=ph
Partial match: 
    abc\=ps
 0: c
    ab\=ps
 0: 

/c++(?<=[bc])/
    abc\=ph
Partial match: c
    ab\=ph
Partial match: 

/(?<=(?=.(?<=x)))/
    abx
 0: 
    ab\=ph
Partial match: 
    bxyz 
 0: 
    xyz
 0: 

/(?![ab]).*/
    ab\=ph
Partial match: 

/c*+/
    ab\=ph,offset=2
Partial match: 

# End of testinput6