# This set of tests is for features that are compatible with all versions of
# Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and
# 32-bit PCRE libraries, and also using the perltest.sh script.
    
#forbid_utf
#newline_default lf any anycrlf
#perltest

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

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

/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
    abcd\t\n\r\f\a\e9;\$\\?caxyz

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

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

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

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

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

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

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

/^[]cde]/
    ]thing
    cthing
    dthing
    ething
\= Expect no match
    athing
    fthing

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

/^[^]cde]/
    athing
    fthing
\= Expect no match
    ]thing
    cthing
    dthing
    ething

/^\�/
    �

/^�/
    �

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

/^.*nter/
    enter
    inter
    uponter

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/^$/
    \
\= Expect no match
    A non-empty line

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

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

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

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

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

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

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

/^a*\w/
    z
    az
    aaaz
    a
    aa
    aaaa
    a+
    aa+

/^a*?\w/
    z
    az
    aaaz
    a
    aa
    aaaa
    a+
    aa+

/^a+\w/
    az
    aaaz
    aa
    aaaa
    aa+

/^a+?\w/
    az
    aaaz
    aa
    aaaa
    aa+

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

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

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

/\A(abc|def)=(\1){2,3}\Z/
    abc=abcabc
    def=defdefdef
\= Expect no match
    abc=defdef

/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
    abcdefghijkcda2
    abcdefghijkkkkcda2

/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
    cataract cataract23
    catatonic catatonic23
    caterpillar caterpillar23


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

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

/^12.34/s
    12\n34
    12\r34

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

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

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

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

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

/^1234 #comment in extended re
  /x
    1234

/#rhubarb
  abcd/x
    abcd

/^abcd#rhubarb/x
    abcd

/^(a)\1{2,3}(.)/
    aaab
    aaaab
    aaaaab
    aaaaaab

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

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

/^[ab]{1,3}(ab*|b)/
    aabbbbb

/^[ab]{1,3}?(ab*|b)/
    aabbbbb

/^[ab]{1,3}?(ab*?|b)/
    aabbbbb

/^[ab]{1,3}(ab*?|b)/
    aabbbbb

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

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

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

/[\040\t]*                    # Nab whitespace.
(?:
\(                              #  (
[^\\\x80-\xff\n\015()] *                             #     normal*
(?:                                 #       (
(?:  \\ [^\x80-\xff]  |
\(                            #  (
[^\\\x80-\xff\n\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>
    <user\@dom.ain>
    user\@dom.ain
    \"A. Other\" <user.1234\@dom.ain> (a comment)
    A. Other <user.1234\@dom.ain> (a comment)
    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
    A missing angle <user\@some.where
\= Expect no match
    The quick brown fox

/abc\0def\00pqr\000xyz\0000AB/
    abc\0def\00pqr\000xyz\0000AB
    abc456 abc\0def\00pqr\000xyz\0000ABCDE

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

/^[\000-\037]/
    \0A
    \01B
    \037C

/\0*/
    \0\0\0\0

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

/^(cow|)\1(bell)/
    cowcowbell
    bell
\= Expect no match
    cowbell

/^\s/
    \040abc
    \x0cabc
    \nabc
    \rabc
    \tabc
\= Expect no match
    abc

/^a	b
      c/x
    abc

/^(a|)\1*b/
    ab
    aaaab
    b
\= Expect no match
    acb

/^(a|)\1+b/
    aab
    aaaab
    b
\= Expect no match
    ab

/^(a|)\1?b/
    ab
    aab
    b
\= Expect no match
    acb

/^(a|)\1{2}b/
    aaab
    b
\= Expect no match
    ab
    aab
    aaaab

/^(a|)\1{2,3}b/
    aaab
    aaaab
    b
\= Expect no match
    ab
    aab
    aaaaab

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/[a-z]+/
    abcdxyz

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

/\x5c/
    \\

/\x20Z/
    the Zoo
\= Expect no match
    Zulu

/(abc)\1/i
    abcabc
    ABCabc
    abcABC

/abc$/
    abc
    abc\n
\= Expect no match
    abc\ndef

/(abc)\123/
    abc\x53

/(abc)\223/
    abc\x93

/(abc)\323/
    abc\xd3

/(abc)\100/
    abc\x40
    abc\100

/(abc)\1000/
    abc\x400
    abc\x40\x30
    abc\1000
    abc\100\x30
    abc\100\060
    abc\100\60
    
/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/
    ABCDEFGHIHI 

/^[A\8B\9C]+$/
    A8B9C
\= Expect no match 
    A8B9C\x00

/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
    abcdefghijkllS

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

/a{0}bc/
    bc

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

/abc[\10]de/
    abc\010de

/abc[\1]de/
    abc\1de

/(abc)[\1]de/
    abc\1de

/(?s)a.b/
    a\nb

/^([^a])([^\b])([^c]*)([^d]{3,4})/
    baNOTccccd
    baNOTcccd
    baNOTccd
    bacccd
\= Expect no match
    anything
    b\bc   
    baccd

/[^a]/
    Abc
  
/[^a]/i
    Abc 

/[^a]+/
    AAAaAbc
  
/[^a]+/i
    AAAaAbc 

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

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

/(a)\1{8,}/
    aaaaaaaaa
    aaaaaaaaaa
\= Expect no match
    aaaaaaa   

/[^a]/
    aaaabcd
    aaAabcd 

/[^a]/i
    aaaabcd
    aaAabcd 

/[^az]/
    aaaabcd
    aaAabcd 

/[^az]/i
    aaaabcd
    aaAabcd 

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

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

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

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

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

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

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

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

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

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

/^\D*(?!123)/
    ABC123
     
/^(\D*)(?=\d)(?!123)/
    ABC445
\= Expect no match
    ABC123
    
/^[W-]46]/
    W46]789 
    -46]789
\= Expect no match
    Wall
    Zebra
    42
    [abcd] 
    ]abcd[
       
/^[W-\]46]/
    W46]789 
    Wall
    Zebra
    Xylophone  
    42
    [abcd] 
    ]abcd[
    \\backslash 
\= Expect no match
    -46]789
    well
    
/\d\d\/\d\d\/\d\d\d\d/
    01/01/2000

/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
    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

/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

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

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

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

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

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

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

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

/^(a){1,3}/
    abc
    aab
    aaa   
\= Expect no match
    bcd

/^(a){1,}/
    abc
    aab
    aaa
    aaaaaaaa    
\= Expect no match
    bcd

/.*\.gif/
    borfle\nbib.gif\nno

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

/.*\.gif/m
    borfle\nbib.gif\nno

/.*\.gif/s
    borfle\nbib.gif\nno

/.*\.gif/ms
    borfle\nbib.gif\nno
    
/.*$/
    borfle\nbib.gif\nno

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

/.*$/s
    borfle\nbib.gif\nno

/.*$/ms
    borfle\nbib.gif\nno
    
/.*$/
    borfle\nbib.gif\nno\n

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

/.*$/s
    borfle\nbib.gif\nno\n

/.*$/ms
    borfle\nbib.gif\nno\n
    
/(.*X|^B)/
    abcde\n1234Xyz
    BarFoo 
\= Expect no match
    abcde\nBar  

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

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

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

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

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

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

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

/(?ms)^B/
    abc\nB

/(?s)B$/
    B\n

/^[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
  
/^\d\d\d\d\d\d\d\d\d\d\d\d/
    123456654321 

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

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

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

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

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

/.*?/g,aftertext
    abc
  
/\b/g,aftertext
    abc 

/\b/g,aftertext
    abc 

//g
    abc

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

/a[^a]b/
    acb
    a\nb
    
/a.b/
    acb
\= Expect no match 
    a\nb   
    
/a[^a]b/s
    acb
    a\nb  
    
/a.b/s
    acb
    a\nb  

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

/^(b+|a){1,2}?c/
    bac
    bbac
    bbbac
    bbbbac
    bbbbbac 
    
/(?!\A)x/m
    a\bx\n
    a\nx\n
\= Expect no match     
    x\nb\n
    
/(A|B)*?CD/
    CD 
    
/(A|B)*CD/
    CD 

/(AB)*?\1/
    ABABAB

/(AB)*\1/
    ABABAB
    
/(?<!bar)foo/
    foo
    catfood
    arfootle
    rfoosh
\= Expect no match
    barfoo
    towbarfoo

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

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

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

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

/^((?>\w+)|(?>\s+))*$/
    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!
    
/(\d+)(\w)/
    12345a
    12345+ 

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

/(?>a+)b/
    aaab

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

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

/(?>b)+/
    aaabbbccc

/(?>a+|b+|c+)*c/
    aaabbbbccccd

/((?>[^()]+)|\([^()]*\))+/
    ((abc(ade)ufh()()x
    
/\(((?>[^()]+)|\([^()]+\))+\)/
    (abc)
    (abc(def)xyz)
\= Expect no match
    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   

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

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

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

/(?:(a)|b)(?(1)A|B)/
    aA
    bB
\= Expect no match
    aB
    bA    

/^(a)?(?(1)a|b)+$/
    aa
    b
    bb  
\= Expect no match
    ab   
    
# Perl gets this next one wrong if the pattern ends with $; in that case it
# fails to match "12". 

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

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

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

/( \( )? [^()]+ (?(1) \) |) /x
    abcd
    (abcd)
    the quick (abcd) fox
    (abcd   

/( \( )? [^()]+ (?(1) \) ) /x
    abcd
    (abcd)
    the quick (abcd) fox
    (abcd   

/^(?(2)a|(1)(2))+$/
    12
    12a
    12aa
\= Expect no match
    1234    

/((?i)blah)\s+\1/
    blah blah
    BLAH BLAH
    Blah Blah
    blaH blaH
\= Expect no match
    blah BLAH
    Blah blah      
    blaH blah 

/((?i)blah)\s+(?i:\1)/
    blah blah
    BLAH BLAH
    Blah Blah
    blaH blaH
    blah BLAH
    Blah blah      
    blaH blah 

/((?i)blah)\s+(?m)A(?i:\1)/
    blah ABLAH
\= Expect no match
    blah aBLAH

/(?>a*)*/
    a
    aa
    aaaa
    
/(abc|)+/
    abc
    abcabc
    abcabcabc
    xyz      

/([a]*)*/
    a
    aaaaa 
 
/([ab]*)*/
    a
    b
    ababab
    aaaabcde
    bbbb    
 
/([^a]*)*/
    b
    bbbb
    aaa   
 
/([^ab]*)*/
    cccc
    abab  
 
/([a]*?)*/
    a
    aaaa 
 
/([ab]*?)*/
    a
    b
    abab
    baba   
 
/([^a]*?)*/
    b
    bbbb
    aaa   
 
/([^ab]*?)*/
    c
    cccc
    baba   
 
/(?>a*)*/
    a
    aaabcde 
 
/((?>a*))*/
    aaaaa
    aabbaa 
 
/((?>a*?))*/
    aaaaa
    aabbaa 

/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /x
    12-sep-98
    12-09-98
\= Expect no match
    sep-12-98
        
/(?<=(foo))bar\1/
    foobarfoo
    foobarfootling 
\= Expect no match
    foobar
    barfoo   

/(?i:saturday|sunday)/
    saturday
    sunday
    Saturday
    Sunday
    SATURDAY
    SUNDAY
    SunDay
    
/(a(?i)bc|BB)x/
    abcx
    aBCx
    bbx
    BBx
\= Expect no match
    abcX
    aBCX
    bbX
    BBX               

/^([ab](?i)[cd]|[ef])/
    ac
    aC
    bD
    elephant
    Europe 
    frog
    France
\= Expect no match
    Africa     

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

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

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

# The cases of aaaa and aaaaaa are missed out below because Perl does things
# differently. We know that odd, and maybe incorrect, things happen with
# recursive references in Perl, as far as 5.11.3 - see some stuff in test #2.

/^(a\1?){4}$/
    aaaaa
    aaaaaaa
    aaaaaaaaaa
\= Expect no match
    a
    aa
    aaa
    aaaaaaaa
    aaaaaaaaa
    aaaaaaaaaaa
    aaaaaaaaaaaa
    aaaaaaaaaaaaa
    aaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaa

/^(a\1?)(a\1?)(a\2?)(a\3?)$/
    aaaa
    aaaaa
    aaaaaa
    aaaaaaa
    aaaaaaaaaa
\= Expect no match
    a
    aa
    aaa
    aaaaaaaa
    aaaaaaaaa
    aaaaaaaaaaa
    aaaaaaaaaaaa
    aaaaaaaaaaaaa
    aaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaa               

# 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
    xabcy
    ababc
\= Expect no match
    xbc
    axc
    abx

/ab*c/
    abc

/ab*bc/
    abc
    abbc
    abbbbc

/.{1}/
    abbbbc

/.{3,4}/
    abbbbc

/ab{0,}bc/
    abbbbc

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

/ab{1,}bc/

/ab+bc/
    abbbbc

/ab{1,}bc/
    abbbbc

/ab{1,3}bc/
    abbbbc

/ab{3,4}bc/
    abbbbc

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

/ab?bc/
    abbc
    abc

/ab{0,1}bc/
    abc

/ab?bc/

/ab?c/
    abc

/ab{0,1}c/
    abc

/^abc$/
    abc
\= Expect no match
    abbbbc
    abcc

/^abc/
    abcc

/^abc$/

/abc$/
    aabc
\= Expect no match
    aabcd

/^/
    abc

/$/
    abc

/a.c/
    abc
    axc

/a.*c/
    axyzc

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

/a[b-d]e/
    ace

/a[b-d]/
    aac

/a[-b]/
    a-

/a[b-]/
    a-

/a]/
    a]

/a[]]b/
    a]b

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

/a[^-b]c/
    adc

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

/\ba\b/
    a-
    -a
    -a-

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

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

/\By\b/
    xy

/\by\B/
    yz

/\By\B/
    xyz

/\w/
    a

/\W/
    -
\= Expect no match
    a

/a\sb/
    a b

/a\Sb/
    a-b
\= Expect no match
    a b

/\d/
    1

/\D/
    -
\= Expect no match
    1

/[\w]/
    a

/[\W]/
    -
\= Expect no match
    a

/a[\s]b/
    a b

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

/[\d]/
    1

/[\D]/
    -
\= Expect no match
    1

/ab|cd/
    abc
    abcd

/()ef/
    def

/$b/

/a\(b/
    a(b

/a\(*b/
    ab
    a((b

/a\\b/
    a\\b

/((a))/
    abc

/(a)b(c)/
    abc

/a+b+c/
    aabbabc

/a{1,}b{1,}c/
    aabbabc

/a.+?c/
    abcabc

/(a+|b)*/
    ab

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

/(a+|b)+/
    ab

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

/(a+|b)?/
    ab

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

/[^ab]*/
    cde

/abc/
\= Expect no match
    b

/a*/
    \

/([abc])*d/
    abbbcd

/([abc])*bcd/
    abcd

/a|b|c|d|e/
    e

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

/abcd*efg/
    abcdefg

/ab*/
    xabyabbbz
    xayabbbz

/(ab|cd)e/
    abcde

/[abhgefdc]ij/
    hij

/^(ab|cd)e/

/(abc|)ef/
    abcdef

/(a|b)c*d/
    abcd

/(ab|ab*)bc/
    abc

/a([bc]*)c*/
    abc

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

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

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

/a[bcd]*dcdcde/
    adcdcde

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

/(ab|a)b*c/
    abc

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

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

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

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

/((((((((((a))))))))))/
    a

/((((((((((a))))))))))\10/
    aa

/(((((((((a)))))))))/
    a

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

/multiple words/
    multiple words, yeah

/(.*)c(.*)/
    abcde

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

/[k]/

/abcd/
    abcd

/a(bc)d/
    abcd

/a[-]?c/
    ac

/(abc)\1/
    abcabc

/([a-c]*)\1/
    abcabc

/(a)|\1/
    a
    ab
\= Expect no match
    x

/(([a-c])b*?\2)*/
    ababbbcbc

/(([a-c])b*?\2){3}/
    ababbbcbc

/((\3|b)\2(a)x)+/
    aaaxabaxbaaxbbax

/((\3|b)\2(a)){2,}/
    bbaababbabaaaaabbaaaabba

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

/ab*c/i
    ABC

/ab*bc/i
    ABC
    ABBC

/ab*?bc/i
    ABBBBC

/ab{0,}?bc/i
    ABBBBC

/ab+?bc/i
    ABBC

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

/ab{1,}bc/i

/ab+bc/i
    ABBBBC

/ab{1,}?bc/i
    ABBBBC

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

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

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

/ab??bc/i
    ABBC
    ABC

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

/ab??bc/i

/ab??c/i
    ABC

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

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

/^abc/i
    ABCC

/^abc$/i

/abc$/i
    AABC

/^/i
    ABC

/$/i
    ABC

/a.c/i
    ABC
    AXC

/a.*?c/i
    AXYZC

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

/a[bc]d/i
    ABD

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

/a[b-d]/i
    AAC

/a[-b]/i
    A-

/a[b-]/i
    A-

/a]/i
    A]

/a[]]b/i
    A]B

/a[^bc]d/i
    AED

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

/a[^]b]c/i
    ADC

/ab|cd/i
    ABC
    ABCD

/()ef/i
    DEF

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

/a\(b/i
    A(B

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

/a\\b/i
    A\\b
    a\\B 

/((a))/i
    ABC

/(a)b(c)/i
    ABC

/a+b+c/i
    AABBABC

/a{1,}b{1,}c/i
    AABBABC

/a.+?c/i
    ABCABC

/a.*?c/i
    ABCABC

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

/(a+|b)*/i
    AB

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

/(a+|b)+/i
    AB

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

/(a+|b)?/i
    AB

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

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

/[^ab]*/i
    CDE

/([abc])*d/i
    ABBBCD

/([abc])*bcd/i
    ABCD

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

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

/abcd*efg/i
    ABCDEFG

/ab*/i
    XABYABBBZ
    XAYABBBZ

/(ab|cd)e/i
    ABCDE

/[abhgefdc]ij/i
    HIJ

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

/(abc|)ef/i
    ABCDEF

/(a|b)c*d/i
    ABCD

/(ab|ab*)bc/i
    ABC

/a([bc]*)c*/i
    ABC

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

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

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

/a[bcd]*dcdcde/i
    ADCDCDE

/a[bcd]+dcdcde/i

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

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

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

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

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

/((((((((((a))))))))))/i
    A

/((((((((((a))))))))))\10/i
    AA

/(((((((((a)))))))))/i
    A

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

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

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

/multiple words/i
    MULTIPLE WORDS, YEAH

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

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

/[k]/i

/abcd/i
    ABCD

/a(bc)d/i
    ABCD

/a[-]?c/i
    AC

/(abc)\1/i
    ABCABC

/([a-c]*)\1/i
    ABCABC

/a(?!b)./
    abad

/a(?=d)./
    abad

/a(?=c|d)./
    abad

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

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

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

/a(?:b|c|d)+(.)/
    acdbcdbe

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

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

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

/((foo)|(bar))*/
    foobar

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

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

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

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

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

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

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

/^(.+)?B/
    AB

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

/^[<>]&/
    <&OUT

/^(a\1?){4}$/
    aaaaaaaaaa
\= Expect no match
    AB
    aaaaaaaaa
    aaaaaaaaaaa

/^(a(?(1)\1)){4}$/
    aaaaaaaaaa
\= Expect no match
    aaaaaaaaa
    aaaaaaaaaaa

/(?:(f)(o)(o)|(b)(a)(r))*/
    foobar

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

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

/(?:..)*a/
    aba

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

/^(?:b|a(?=(.)))*\1/
    abc

/^(){3,5}/
    abc

/^(a+)*ax/
    aax

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

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

/(a|x)*ab/
    cab

/(a)*ab/
    cab

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

/((?i)a)b/
    ab

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

/((?i)a)b/
    Ab

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

/((?i)a)b/

/(?i:a)b/
    ab

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

/(?i:a)b/
    Ab

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

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

/((?i:a))b/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/(ab)\d\1/i
    Ab4ab
    ab4Ab

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

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

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

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

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

/(?<![cd])[ab]/
    dbaacb

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

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

/(?<!cd)[ab]/
    cdaccb

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

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

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

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

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

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

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

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

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

/^b/

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

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

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

/(x)?(?(1)b|a)/
    a

/()?(?(1)b|a)/
    a

/()(?(1)b|a)/

/()?(?(1)a|b)/
    a

/^(\()?blah(?(1)(\)))$/
    (blah)
    blah
\= Expect no match
    a
    blah)
    (blah

/^(\(+)?blah(?(1)(\)))$/
    (blah)
    blah
\= Expect no match
    blah)
    (blah

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

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

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

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

/(?=(a+?))(\1ab)/
    aaab

/^(?=(a+?))\1ab/

/(\w+:)+/
    one:

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

/(?=(a+?))(\1ab)/
    aaab

/^(?=(a+?))\1ab/
\= Expect no match
    aaab
    aaab

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

/^[^bcd]*(c+)/
    aexycd

/(a*)b+/
    caab

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

/^[^bcd]*(c+)/
    aexycd

/(>a+)ab/

/(?>a+)b/
    aaab

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

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

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

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

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

/((?>[^()]+)|\([^()]*\))+/
    ((abc(ade)ufh()()x

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

/b\Z/
    a\nb\n

/b\z/

/b\Z/
    a\nb

/b\z/
    a\nb
    
/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
    a
    abc
    a-b
    0-9 
    a.b
    5.6.7  
    the.quick.brown.fox
    a100.b200.300c  
    12-ab.1245 
\= Expect no match
    \
    .a
    -a
    a-
    a.  
    a_b 
    a.-
    a..  
    ab..bc 
    the.quick.brown.fox-
    the.quick.brown.fox.
    the.quick.brown.fox_
    the.quick.brown.fox+       

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

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

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

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

/<a[\s]+href[\s]*=[\s]*          # find <a href=
 ([\"\'])?                       # find single or double quote
 (?(1) (.*?)\1 | ([^\s]+))       # if quote found, match up to next matching
                                 # quote, otherwise match up to next space
/isx
    <a href=abcd xyz
    <a href=\"abcd xyz pqr\" cats
    <a href=\'abcd xyz pqr\' cats

/<a\s+href\s*=\s*                # find <a href=
 (["'])?                         # find single or double quote
 (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
                                 # quote, otherwise match up to next space
/isx
    <a href=abcd xyz
    <a href=\"abcd xyz pqr\" cats
    <a href       =       \'abcd xyz pqr\' cats

/<a\s+href(?>\s*)=(?>\s*)        # find <a href=
 (["'])?                         # find single or double quote
 (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
                                 # quote, otherwise match up to next space
/isx
    <a href=abcd xyz
    <a href=\"abcd xyz pqr\" cats
    <a href       =       \'abcd xyz pqr\' cats

/((Z)+|A)*/
    ZABCDEFG

/(Z()|A)*/
    ZABCDEFG

/(Z(())|A)*/
    ZABCDEFG

/((?>Z)+|A)*/
    ZABCDEFG

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

/a*/g
    abbab

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

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

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

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

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

/abc#comment
    \Q#not comment
    literal/x
    abc#not comment\n    literal     

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

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

/\Qabc\$xyz\E/
    abc\\\$xyz

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

/\Gabc/
    abc
\= Expect no match
    xyzabc  

/\Gabc./g
    abc1abc2xyzabc3

/abc./g
    abc1abc2xyzabc3 

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

/((?x)x y z | a b c)/
    XabcY
    AxyzB 

/(?i)AB(?-i)C/
    XabCY
\= Expect no match
    XabcY  

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

/(.*)\d+\1/
    abc123abc
    abc123bc 

/(.*)\d+\1/s
    abc123abc
    abc123bc 
    
/((.*))\d+\1/
    abc123abc
    abc123bc  

# This tests for an IPv6 address in the form where it can have up to
# eight components, one and only one of which is empty. This must be
# an internal component. 

/^(?!:)                       # colon disallowed at start
  (?:                         # start of item
    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or
    (?(1)0 | () ) )           # if null previously matched, fail; else null
    :                         # followed by colon
  ){1,7}                      # end item; 1-7 of them required               
  [0-9a-f]{1,4} $             # final hex number at end of string
  (?(1)|.)                    # check that there was an empty component
  /ix
    a123::a123
    a123:b342::abcd
    a123:b342::324e:abcd
    a123:ddde:b342::324e:abcd
    a123:ddde:b342::324e:dcba:abcd
    a123:ddde:9999:b342::324e:dcba:abcd
\= Expect no match
    1:2:3:4:5:6:7:8
    a123:bce:ddde:9999:b342::324e:dcba:abcd
    a123::9999:b342::324e:dcba:abcd
    abcde:2:3:4:5:6:7:8
    ::1
    abcd:fee0:123::   
    :1
    1:  

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

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

/����[�-��-�]+/
    �����
    �����
    �����
    �����

/(?<=Z)X./
  \x84XAZXB

/ab cd (?x) de fg/
    ab cd defg

/ab cd(?x) de fg/
    ab cddefg
\= Expect no match 
    abcddefg

/(?<![^f]oo)(bar)/
    foobarX 
\= Expect no match 
    boobarX

/(?<![^f])X/
    offX
\= Expect no match
    onyX  

/(?<=[^f])X/
    onyX
\= Expect no match
    offX 

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

/(?:(?(1)a|b)(X))+/
    bXaX

/(?:(?(1)\1a|b)(X|Y))+/
    bXXaYYaY
    bXYaXXaX  

/()()()()()()()()()(?:(?(10)\10a|b)(X|Y))+/
    bXXaYYaY

/[[,abc,]+]/
    abc]
    a,b]
    [a,b,c]  

/(?-x: )/x
    A\x20B
    
"(?x)(?-x: \s*#\s*)"
    A # B
\= Expect no match
    #  

"(?x-is)(?:(?-ixs) \s*#\s*) include"
    A #include
\= Expect no match
    A#include  
    A #Include

/a*b*\w/
    aaabbbb
    aaaa
    a

/a*b?\w/
    aaabbbb
    aaaa
    a

/a*b{0,4}\w/
    aaabbbb
    aaaa
    a

/a*b{0,}\w/
    aaabbbb
    aaaa
    a
    
/a*\d*\w/
    0a
    a 
    
/a*b *\w/x
    a 

/a*b#comment
  *\w/x
    a 

/a* b *\w/x
    a 

/^\w+=.*(\\\n.*)*/
    abc=xyz\\\npqr

/(?=(\w+))\1:/
    abcd:

/^(?=(\w+))\1:/
    abcd:

/^\Eabc/
    abc
    
/^[\Eabc]/
    a
\= Expect no match 
    E 
    
/^[a-\Ec]/
    b
\= Expect no match
    -
    E    

/^[a\E\E-\Ec]/
    b
\= Expect no match
    -
    E    

/^[\E\Qa\E-\Qz\E]+/
    b
\= Expect no match
    -  
    
/^[a\Q]bc\E]/
    a
    ]
    c
    
/^[a-\Q\E]/
    a
    -     

/^(a()*)*/
    aaaa

/^(?:a(?:(?:))*)*/
    aaaa

/^(a()+)+/
    aaaa

/^(?:a(?:(?:))+)+/
    aaaa

/(a){0,3}(?(1)b|(c|))*D/
    abbD
    ccccD
    D  

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

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

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

/\Z/g
  abc\n
  
/^(?s)(?>.*)(?<!\n)/
  abc
\= Expect no match
  abc\n  

/^(?![^\n]*\n\z)/
  abc
\= Expect no match
  abc\n 
  
/\z(?<!\n)/
  abc
\= Expect no match
  abc\n  

/(.*(.)?)*/
    abcd

/( (A | (?(1)0|) )*   )/x
    abcd

/( ( (?(1)0|) )*   )/x
    abcd

/(  (?(1)0|)*   )/x
    abcd

/[[:abcd:xyz]]/
    a]
    :] 
    
/[abc[:x\]pqr]/
    a
    [
    :
    ]
    p    

/.*[op][xyz]/
\= Expect no match
    fooabcfoo

/(?(?=.*b)b|^)/
   adc
   abc 

/(?(?=^.*b)b|^)/
   adc
\= Expect no match
   abc 

/(?(?=.*b)b|^)*/
   adc
   abc 

/(?(?=.*b)b|^)+/
   adc
   abc 

/(?(?=b).*b|^d)/
    abc

/(?(?=.*b).*b|^d)/
    abc

/^%((?(?=[a])[^%])|b)*%$/
    %ab%

/(?i)a(?-i)b|c/
    XabX
    XAbX
    CcC 
\= Expect no match
    XABX   

/[\x00-\xff\s]+/
    \x0a\x0b\x0c\x0d

/(abc)\1/i
\= Expect no match
   abc

/(abc)\1/
\= Expect no match
   abc

/[^a]*/i
    12abc
    12ABC

/[^a]*+/i
    12abc
    12ABC

/[^a]*?X/i
\= Expect no match
    12abc
    12ABC
    
/[^a]+?X/i
\= Expect no match
    12abc
    12ABC

/[^a]?X/i
    12aXbcX
    12AXBCX
    BCX 

/[^a]??X/i
    12aXbcX
    12AXBCX
    BCX
    
/[^a]?+X/i
    12aXbcX
    12AXBCX
    BCX 

/[^a]{2,3}/i
    abcdef
    ABCDEF  

/[^a]{2,3}?/i
    abcdef
    ABCDEF  

/[^a]{2,3}+/i
    abcdef
    ABCDEF  

/((a|)+)+Z/
    Z

/(a)b|(a)c/
    ac

/(?>(a))b|(a)c/
    ac

/(?=(a))ab|(a)c/
    ac

/((?>(a))b|(a)c)/
    ac

/((?>(a))b|(a)c)++/
    ac

/(?:(?>(a))b|(a)c)++/
    ac

/(?=(?>(a))b|(a)c)(..)/
    ac

/(?>(?>(a))b|(a)c)/
    ac

/(?:(?>([ab])))+a=/aftertext
    =ba=

/(?>([ab]))+a=/aftertext
    =ba=

/((?>(a+)b)+(aabab))/
    aaaabaaabaabab

/(?>a+|ab)+?c/
\= Expect no match
    aabc

/(?>a+|ab)+c/
\= Expect no match
    aabc

/(?:a+|ab)+c/
    aabc

/(?(?=(a))a)/
    a

/(?(?=(a))a)(b)/
    ab

/^(?:a|ab)++c/
\= Expect no match
    aaaabc

/^(?>a|ab)++c/
\= Expect no match
    aaaabc

/^(?:a|ab)+c/
    aaaabc

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

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

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

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

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

/^[\g<a>]+/
    ggg<<<aaa>>>
\= Expect no match
    \\ga  
    
/^[\ga]+/
    gggagagaxyz 
    
/^[:a[:digit:]]+/
    aaaa444:::Z 

/^[:a[:digit:]:b]+/
    aaaa444:::bbbZ 

/[:a]xxx[b:]/
     :xxx:
     
/(?<=a{2})b/i
    xaabc
\= Expect no match
    xabc  

/(?<!a{2})b/i
    xabc
\= Expect no match
    xaabc  

/(?<=a\h)c/
    xa c
    
/(?<=[^a]{2})b/
    axxbc
    aAAbc 
\= Expect no match
    xaabc    

/(?<=[^a]{2})b/i
    axxbc  
\= Expect no match
    aAAbc 
    xaabc    

/(?<=a\H)c/
    abc

/(?<=a\V)c/
    abc
    
/(?<=a\v)c/
    a\nc

/(?(?=c)c|d)++Y/
    XcccddYX

/(?(?=c)c|d)*+Y/
    XcccddYX

/^(a{2,3}){2,}+a/
    aaaaaaa
\= Expect no match
    aaaaaa
    aaaaaaaaa 

/^(a{2,3})++a/
\= Expect no match
    aaaaaa

/^(a{2,3})*+a/
\= Expect no match
    aaaaaa

/\H\h\V\v/
    X X\x0a
    X\x09X\x0b
\= Expect no match
    \xa0 X\x0a   
    
/\H*\h+\V?\v{3,4}/
    \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
    \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
    \x09\x20\xa0\x0a\x0b\x0c
\= Expect no match 
    \x09\x20\xa0\x0a\x0b
     
/\H{3,4}/
    XY  ABCDE
    XY  PQR ST 
    
/.\h{3,4}./
    XY  AB    PQRS

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

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

/(foo)\Kbar/
    foobar
   
/(foo)(\Kbar|baz)/
    foobar
    foobaz 

/(foo\Kbar)baz/
    foobarbaz

/abc\K|def\K/g,aftertext
    Xabcdefghi

/ab\Kc|de\Kf/g,aftertext
    Xabcdefghi
    
/(?=C)/g,aftertext
    ABCDECBA
    
/^abc\K/aftertext
    abcdef
\= Expect no match
    defabcxyz   

/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-2}Z/
    ababababbbabZXXXX

/(?<A>tom|bon)-\g{A}/
    tom-tom
    bon-bon 
    
/(^(a|b\g{-1}))/
\= Expect no match
    bacxxx

/(?|(abc)|(xyz))\1/
    abcabc
    xyzxyz 
\= Expect no match
    abcxyz
    xyzabc   
    
/(?|(abc)|(xyz))(?1)/
    abcabc
    xyzabc 
\= Expect no match 
    xyzxyz 
 
/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/
    XYabcdY

/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/
    XYabcdY

/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/
    XYabcdY

/(?'abc'\w+):\k<abc>{2}/
    a:aaxyz
    ab:ababxyz
\= Expect no match
    a:axyz
    ab:abxyz

/(?'abc'\w+):\g{abc}{2}/
    a:aaxyz
    ab:ababxyz
\= Expect no match
    a:axyz
    ab:abxyz

/^(?<ab>a)? (?(<ab>)b|c) (?('ab')d|e)/x
    abd
    ce

/^(a.)\g-1Z/
    aXaXZ

/^(a.)\g{-1}Z/
    aXaXZ

/^(?(DEFINE) (?<A> a) (?<B> b) )  (?&A) (?&B) /x
    abcd

/(?<NAME>(?&NAME_PAT))\s+(?<ADDR>(?&ADDRESS_PAT))
  (?(DEFINE)
  (?<NAME_PAT>[a-z]+)
  (?<ADDRESS_PAT>\d+)
  )/x
    metcalfe 33

/(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/
    1.2.3.4
    131.111.10.206
    10.0.0.0
\= Expect no match
    10.6
    455.3.4.5

/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/
    1.2.3.4
    131.111.10.206
    10.0.0.0
\= Expect no match
    10.6
    455.3.4.5

/^(\w++|\s++)*$/
    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!

/(\d++)(\w)/
    12345a
\= Expect no match
    12345+

/a++b/
    aaab

/(a++b)/
    aaab

/(a++)b/
    aaab

/([^()]++|\([^()]*\))+/
    ((abc(ade)ufh()()x

/\(([^()]++|\([^()]+\))+\)/
    (abc)
    (abc(def)xyz)
\= Expect no match
    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

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

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

/^(?:((.)(?1)\2|)|((.)(?3)\4|.))$/i
    1221
    Satanoscillatemymetallicsonatas
    AmanaplanacanalPanama
    AblewasIereIsawElba
\= Expect no match
    Thequickbrownfox

/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
    12
    (((2+2)*-3)-7)
    -12
\= Expect no match
    ((2+2)*-3)-7)

/^(x(y|(?1){2})z)/
    xyz
    xxyzxyzz
\= Expect no match
    xxyzz
    xxyzxyzxyzz

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

/^a+(*FAIL)/
\= Expect no match
    aaaaaa
    
/a+b?c+(*FAIL)/
\= Expect no match
    aaabccc

/a+b?(*PRUNE)c+(*FAIL)/
\= Expect no match
    aaabccc

/a+b?(*COMMIT)c+(*FAIL)/
\= Expect no match
    aaabccc
    
/a+b?(*SKIP)c+(*FAIL)/
\= Expect no match
    aaabcccaaabccc

/^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/
    aaaxxxxxx
    aaa++++++ 
    bbbxxxxx
    bbb+++++ 
    cccxxxx
    ccc++++ 
    dddddddd   

/^(aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/
    aaaxxxxxx
    aaa++++++ 
    bbbxxxxx
    bbb+++++ 
    cccxxxx
    ccc++++ 
    dddddddd   

/a+b?(*THEN)c+(*FAIL)/
\= Expect no match
    aaabccc

/(A (A|B(*ACCEPT)|C) D)(E)/x
    AB
    ABX
    AADE
    ACDE
\= Expect no match
    AD 
        
/^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
    1221
    Satan, oscillate my metallic sonatas!
    A man, a plan, a canal: Panama!
    Able was I ere I saw Elba.
\= Expect no match
    The quick brown fox

/^((.)(?1)\2|.)$/
    a
    aba
    aabaa  
    abcdcba 
    pqaabaaqp  
    ablewasiereisawelba
\= Expect no match     
    rhubarb
    the quick brown fox  

/(a)(?<=b(?1))/
    baz
\= Expect no match
    caz  
    
/(?<=b(?1))(a)/
    zbaaz
\= Expect no match
    aaa  
    
/(?<X>a)(?<=b(?&X))/
    baz

/^(?|(abc)|(def))\1/
    abcabc
    defdef 
\= Expect no match
    abcdef
    defabc   
    
/^(?|(abc)|(def))(?1)/
    abcabc
    defabc
\= Expect no match
    defdef
    abcdef    

/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/x,dupnames
    a\"aaaaa
    b\"aaaaa 
\= Expect no match 
    b\"11111

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

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

/(?:(?1)|B)(A(*ACCEPT)XX|C)D/
    AAD
    ACD
    BAD
    BCD
    BAX  
\= Expect no match
    ACX
    ABC   

/(?(DEFINE)(A))B(?1)C/
    BAC

/(?(DEFINE)((A)\2))B(?1)C/
    BAAC

/(?<pn> \( ( [^()]++ | (?&pn) )* \) )/x
    (ab(cd)ef)

/^(?=a(*SKIP)b|ac)/
\= Expect no match
    ac
    
/^(?=a(*PRUNE)b)/
    ab  
\= Expect no match 
    ac

/^(?=a(*ACCEPT)b)/
    ac

/(?>a\Kb)/
    ab

/((?>a\Kb))/
    ab

/(a\Kb)/
    ab
    
/^a\Kcz|ac/
    ac
    
/(?>a\Kbz|ab)/
    ab 

/^(?&t)(?(DEFINE)(?<t>a\Kb))$/
    ab

/^([^()]|\((?1)*\))*$/
    a(b)c
    a(b(c)d)e 

/(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/
    0
    00
    0000  

/(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/
    0
    00
    0000  

# This one does fail, as expected, in Perl. It needs the complex item at the
# end of the pattern. A single letter instead of (B|D) makes it not fail, which
# I think is a Perl bug.

/A(*COMMIT)(B|D)/
\= Expect no match
    ACABX

# Check the use of names for failure

/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
\= Expect no match
    AC
    CB    
    
/(*MARK:A)(*SKIP:B)(C|X)/mark
    C
\= Expect no match
    D
     
/^(A(*THEN:A)B|C(*THEN:B)D)/mark
\= Expect no match
    CB    

/^(?:A(*THEN:A)B|C(*THEN:B)D)/mark
\= Expect no match
    CB    
    
/^(?>A(*THEN:A)B|C(*THEN:B)D)/mark
\= Expect no match
    CB    
    
# This should succeed, as the skip causes bump to offset 1 (the mark). Note
# that we have to have something complicated such as (B|Z) at the end because,
# for Perl, a simple character somehow causes an unwanted optimization to mess
# with the handling of backtracking verbs.

/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/x,mark
    AAAC
    
# Test skipping over a non-matching mark.

/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/x,mark
    AAAC
    
# Check shorthand for MARK.

/A(*:A)A+(*SKIP:A)(B|Z) | AC/x,mark
    AAAC

/(*:A)A+(*SKIP:A)(B|Z)/mark
\= Expect no match
    AAAC

# This should succeed, as a non-existent skip name disables the skip.

/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
    AAAC

/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/x,mark
    AAAC

# COMMIT at the start of a pattern should act like an anchor. Again, however,
# we need the complication for Perl.

/(*COMMIT)(A|P)(B|P)(C|P)/
    ABCDEFG
\= Expect no match
    DEFGABC  

# COMMIT inside an atomic group can't stop backtracking over the group.

/(\w+)(?>b(*COMMIT))\w{2}/
    abbb

/(\w+)b(*COMMIT)\w{2}/
\= Expect no match
    abbb

# Check opening parens in comment when seeking forward reference.

/(?&t)(?#()(?(DEFINE)(?<t>a))/
    bac

# COMMIT should override THEN.

/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/
\= Expect no match
  yes

/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/
\= Expect no match
  yes

/b?(*SKIP)c/
    bc
    abc
   
/(*SKIP)bc/
\= Expect no match
    a

/(*SKIP)b/
\= Expect no match
    a 

/(?P<abn>(?P=abn)xxx|)+/
    xxx

/(?i:([^b]))(?1)/
    aa
    aA     
\= Expect no match
    ab
    aB
    Ba
    ba

/^(?&t)*+(?(DEFINE)(?<t>a))\w$/
    aaaaaaX
\= Expect no match 
    aaaaaa 

/^(?&t)*(?(DEFINE)(?<t>a))\w$/
    aaaaaaX
    aaaaaa 

/^(a)*+(\w)/
    aaaaX
    YZ 
\= Expect no match 
    aaaa

/^(?:a)*+(\w)/
    aaaaX
    YZ 
\= Expect no match 
    aaaa

/^(a)++(\w)/
    aaaaX
\= Expect no match 
    aaaa
    YZ 

/^(?:a)++(\w)/
    aaaaX
\= Expect no match 
    aaaa
    YZ 

/^(a)?+(\w)/
    aaaaX
    YZ 

/^(?:a)?+(\w)/
    aaaaX
    YZ 

/^(a){2,}+(\w)/
    aaaaX
\= Expect no match
    aaa
    YZ 

/^(?:a){2,}+(\w)/
    aaaaX
\= Expect no match
    aaa
    YZ 

/(a|)*(?1)b/
    b
    ab
    aab  

/(a)++(?1)b/
\= Expect no match
    ab 
    aab

/(a)*+(?1)b/
\= Expect no match
    ab
    aab  

/(?1)(?:(b)){0}/
    b

/(foo ( \( ((?:(?> [^()]+ )|(?2))*) \) ) )/x
    foo(bar(baz)+baz(bop))

/(A (A|B(*ACCEPT)|C) D)(E)/x
    AB

/\A.*?(a|bc)/
    ba

/\A.*?(?:a|bc)++/
    ba

/\A.*?(a|bc)++/
    ba

/\A.*?(?:a|bc|d)/
    ba

/(?:(b))++/
    beetle

/(?(?=(a(*ACCEPT)z))a)/
    a

/^(a)(?1)+ab/
    aaaab
    
/^(a)(?1)++ab/
\= Expect no match
    aaaab

/^(?=a(*:M))aZ/mark
    aZbc

/^(?!(*:M)b)aZ/mark
    aZbc

/(?(DEFINE)(a))?b(?1)/
    backgammon

/^\N+/
    abc\ndef
    
/^\N{1,}/
    abc\ndef 

/(?(R)a+|(?R)b)/
    aaaabcde

/(?(R)a+|((?R))b)/
    aaaabcde

/((?(R)a+|(?1)b))/
    aaaabcde

/((?(R1)a+|(?1)b))/
    aaaabcde
    
/((?(R)a|(?1)))*/
    aaa

/((?(R)a|(?1)))+/
    aaa 

/a(*:any 
name)/mark
    abc
    
/(?>(?&t)c|(?&t))(?(DEFINE)(?<t>a|b(*PRUNE)c))/
    a
    ba
    bba 
    
# Checking revised (*THEN) handling.

# Capture

/^.*? (a(*THEN)b) c/x
\= Expect no match
    aabc

/^.*? (a(*THEN)b|(*F)) c/x
    aabc

/^.*? ( (a(*THEN)b) | (*F) ) c/x
    aabc

/^.*? ( (a(*THEN)b) ) c/x
\= Expect no match
    aabc

# Non-capture

/^.*? (?:a(*THEN)b) c/x
\= Expect no match
    aabc

/^.*? (?:a(*THEN)b|(*F)) c/x
    aabc

/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x
    aabc

/^.*? (?: (?:a(*THEN)b) ) c/x
\= Expect no match
    aabc

# Atomic

/^.*? (?>a(*THEN)b) c/x
\= Expect no match
    aabc

/^.*? (?>a(*THEN)b|(*F)) c/x
    aabc

/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x
    aabc

/^.*? (?> (?>a(*THEN)b) ) c/x
\= Expect no match
    aabc

# Possessive capture

/^.*? (a(*THEN)b)++ c/x
\= Expect no match
    aabc

/^.*? (a(*THEN)b|(*F))++ c/x
    aabc

/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x
    aabc

/^.*? ( (a(*THEN)b)++ )++ c/x
\= Expect no match
    aabc

# Possessive non-capture

/^.*? (?:a(*THEN)b)++ c/x
\= Expect no match
    aabc

/^.*? (?:a(*THEN)b|(*F))++ c/x
    aabc

/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x
    aabc

/^.*? (?: (?:a(*THEN)b)++ )++ c/x
\= Expect no match
    aabc
    
# Condition assertion

/^(?(?=a(*THEN)b)ab|ac)/
    ac
 
# Condition

/^.*?(?(?=a)a|b(*THEN)c)/
\= Expect no match
    ba

/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/
    ba

/^.*?(?(?=a)a(*THEN)b|c)/
\= Expect no match
    ac

# Assertion

/^.*(?=a(*THEN)b)/
    aabc

# --------------------------

/(?>a(*:m))/imsx,mark
    a

/(?>(a)(*:m))/imsx,mark
    a

/(?<=a(*ACCEPT)b)c/
    xacd

/(?<=(a(*ACCEPT)b))c/
    xacd

/(?<=(a(*COMMIT)b))c/
    xabcd
\= Expect no match 
    xacd
    
/(?<!a(*FAIL)b)c/
    xcd
    acd 

/(?<=a(*:N)b)c/mark
    xabcd
    
/(?<=a(*PRUNE)b)c/
    xabcd 

/(?<=a(*SKIP)b)c/
    xabcd 

/(?<=a(*THEN)b)c/
    xabcd 

/(a)(?2){2}(.)/
    abcd

/(*MARK:A)(*PRUNE:B)(C|X)/mark
    C
\= Expect no match
    D 

/(*MARK:A)(*PRUNE:B)(C|X)/mark
    C
\= Expect no match
    D 

/(*MARK:A)(*THEN:B)(C|X)/mark
    C
\= Expect no match
    D 

/(*MARK:A)(*THEN:B)(C|X)/mark,no_start_optimize
    C
\= Expect no match
    D 

/(*MARK:A)(*THEN:B)(C|X)/mark
    C
\= Expect no match
    D 

# This should fail, as the skip causes a bump to offset 3 (the skip).

/A(*MARK:A)A+(*SKIP)(B|Z) | AC/x,mark
\= Expect no match
    AAAC

# Same 

/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/x,mark
\= Expect no match
    AAAC

/A(*:A)A+(*SKIP)(B|Z) | AC/x,mark
\= Expect no match
    AAAC

# This should fail, as a null name is the same as no name.

/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/x,mark
\= Expect no match
    AAAC

# A check on what happens after hitting a mark and them bumping along to
# something that does not even start. Perl reports tags after the failures
# here, though it does not when the individual letters are made into something
# more complicated.

/A(*:A)B|XX(*:B)Y/mark
    AABC
    XXYZ 
\= Expect no match
    XAQQ  
    XAQQXZZ  
    AXQQQ 
    AXXQQQ 
    
/^(A(*THEN:A)B|C(*THEN:B)D)/mark
    AB
    CD
\= Expect no match
    AC
    CB    
    
/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
    AB
    CD
\= Expect no match
    AC
    CB    
    
# An empty name does not pass back an empty string. It is the same as if no
# name were given.

/^(A(*PRUNE:)B|C(*PRUNE:B)D)/mark
    AB
    CD 

# PRUNE goes to next bumpalong; COMMIT does not.
    
/A(*PRUNE:A)B/mark
    ACAB

# Mark names can be duplicated.

/A(*:A)B|X(*:A)Y/mark
    AABC
    XXYZ 
    
/b(*:m)f|a(*:n)w/mark
    aw 
\= Expect no match 
    abc

/b(*:m)f|aw/mark
    abaw
\= Expect no match 
    abc
    abax 

/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/x,mark
    AAAC

/(?=a(*MARK:A)b)..x/mark
    abxy
\= Expect no match
    abpq  

/(?=a(*MARK:A)b)..(*:Y)x/mark
    abxy
\= Expect no match
    abpq  

/(?=a(*PRUNE:A)b)..x/mark
    abxy
\= Expect no match
    abpq  

/(?=a(*PRUNE:A)b)..(*:Y)x/mark
    abxy
\= Expect no match
    abpq  

/(?=a(*THEN:A)b)..x/mark
    abxy
\= Expect no match
    abpq  

/(?=a(*THEN:A)b)..(*:Y)x/mark
    abxy
\= Expect no match
    abpq  

/(another)?(\1?)test/
    hello world test

/(another)?(\1+)test/
\= Expect no match
    hello world test

/(a(*COMMIT)b){0}a(?1)|aac/
    aac

/((?:a?)*)*c/
    aac   

/((?>a?)*)*c/
    aac   

/(?>.*?a)(?<=ba)/
    aba

/(?:.*?a)(?<=ba)/
    aba

/(?>.*?a)b/s
    aab

/(?>.*?a)b/
    aab

/(?>^a)b/s
\= Expect no match
    aab

/(?>.*?)(?<=(abcd)|(wxyz))/
    alphabetabcd
    endingwxyz 

/(?>.*)(?<=(abcd)|(wxyz))/
    alphabetabcd
    endingwxyz 

"(?>.*)foo"
\= Expect no match
    abcdfooxyz
    
"(?>.*?)foo"
    abcdfooxyz

/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/
    ac
    
/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/
    ac 

/(?<=(*SKIP)ac)a/
\= Expect no match
    aa

/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
    AAAC

/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/mark
    acacd

/A(*SKIP:m)x|A(*SKIP:n)x|AB/mark
    AB

/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/mark
    acacd

# Tests that try to figure out how Perl works. My hypothesis is that the first
# verb that is backtracked onto is the one that acts. This seems to be the case
# almost all the time, but there is one exception that is perhaps a bug.

# This matches "aaaac"; each PRUNE advances one character until the subject no
# longer starts with 5 'a's.

/aaaaa(*PRUNE)b|a+c/
    aaaaaac

# Putting SKIP in front of PRUNE makes no difference, as it is never
# backtracked onto, whether or not it has a label.

/aaaaa(*SKIP)(*PRUNE)b|a+c/
    aaaaaac

/aaaaa(*SKIP:N)(*PRUNE)b|a+c/
    aaaaaac

/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/
    aaaaaac

# Putting THEN in front makes no difference.
    
/aaaaa(*THEN)(*PRUNE)b|a+c/
    aaaaaac
 
# However, putting COMMIT in front of the prune changes it to "no match". I 
# think this is inconsistent and possibly a bug. For the moment, running this
# test is moved out of the Perl-compatible file. 

/aaaaa(*COMMIT)(*PRUNE)b|a+c/
    
# OK, lets play the same game again using SKIP instead of PRUNE.

# This matches "ac" because SKIP forces the next match to start on the
# sixth "a". 

/aaaaa(*SKIP)b|a+c/
    aaaaaac
 
# Putting PRUNE in front makes no difference. 

/aaaaa(*PRUNE)(*SKIP)b|a+c/
    aaaaaac

# Putting THEN in front makes no difference. 

/aaaaa(*THEN)(*SKIP)b|a+c/
    aaaaaac

# In this case, neither does COMMIT. This still matches "ac". 

/aaaaa(*COMMIT)(*SKIP)b|a+c/
    aaaaaac
    
# This gives "no match", as expected. 

/aaaaa(*COMMIT)b|a+c/
\= Expect no match
    aaaaaac

# ---- Tests using THEN ----

# This matches "aaaaaac", as expected. 

/aaaaa(*THEN)b|a+c/
    aaaaaac

# Putting SKIP in front makes no difference. 

/aaaaa(*SKIP)(*THEN)b|a+c/
    aaaaaac
    
# Putting PRUNE in front makes no difference. 

/aaaaa(*PRUNE)(*THEN)b|a+c/
    aaaaaac
    
# Putting COMMIT in front makes no difference. 

/aaaaa(*COMMIT)(*THEN)b|a+c/
    aaaaaac
    
# End of "priority" tests  

/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/
    aaaaaa

/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/
    aaaaaa

/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/
    aaaaaa

/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/
    aaaaaa

/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/
    aaaac

/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/
    aaaac

/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/
    aaaac

/aaa(*MARK:A)a(*SKIP:A)b|a+c/
    aaaac

/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/mark
    aaaaaac

/.?(a|b(*THEN)c)/
    ba

/(a(*COMMIT)b)c|abd/
    abc
\= Expect no match
    abd

/(?=a(*COMMIT)b)abc|abd/
    abc
    abd

/(?>a(*COMMIT)b)c|abd/
    abc
    abd

/a(?=b(*COMMIT)c)[^d]|abd/
    abc
\= Expect no match
    abd

/a(?=bc).|abd/
    abd
    abc 
    
/a(?>b(*COMMIT)c)d|abd/
\= Expect no match
    abceabd 

/a(?>bc)d|abd/
    abceabd 

/(?>a(*COMMIT)b)c|abd/
    abd

/(?>a(*COMMIT)c)d|abd/
\= Expect no match
    abd

/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/
    ac 
    
# These tests were formerly in test 2, but changes in PCRE and Perl have
# made them compatible. 
    
/^(a)?(?(1)a|b)+$/
\= Expect no match
    a

/(?=a\Kb)ab/
    ab 

/(?!a\Kb)ac/
    ac 
    
/^abc(?<=b\Kc)d/
    abcd

/^abc(?<!b\Kq)d/
    abcd

/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/x,mark
\= Expect no match
    AAAC

/^((abc|abcx)(*THEN)y|abcd)/
    abcd
\= Expect no match 
    abcxy 
    
/^((yes|no)(*THEN)(*F))?/
\= Expect no match
    yes

/(A (.*)   C? (*THEN)  | A D) (*FAIL)/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   C? (*THEN)  | A D) z/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   C? (*THEN)  | A D) \s* (*FAIL)/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   C? (*THEN)  | A D) \s* z/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   (?:C|) (*THEN)  | A D) (*FAIL)/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   (?:C|) (*THEN)  | A D) z/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   C{0,6} (*THEN)  | A D) (*FAIL)/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   C{0,6} (*THEN)  | A D) z/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   (CE){0,6} (*THEN)  | A D) (*FAIL)/x
\= Expect no match
    AbcdCEBefgBhiBqz

/(A (.*)   (CE){0,6} (*THEN)  | A D) z/x
\= Expect no match
    AbcdCEBefgBhiBqz

/(A (.*)   (CE*){0,6} (*THEN)  | A D) (*FAIL)/x
\= Expect no match
    AbcdCBefgBhiBqz

/(A (.*)   (CE*){0,6} (*THEN)  | A D) z/x
\= Expect no match
    AbcdCBefgBhiBqz

/(?=a(*COMMIT)b|ac)ac|ac/
\= Expect no match
    ac

/(?=a(*COMMIT)b|(ac)) ac | (a)c/x
\= Expect no match
    ac

# ----

/(?(?!b(*THEN)a)bn|bnn)/
    bnn 

/(?!b(*SKIP)a)bn|bnn/
    bnn
    
/(?(?!b(*SKIP)a)bn|bnn)/
    bnn 

/(?!b(*PRUNE)a)bn|bnn/
    bnn
    
/(?(?!b(*PRUNE)a)bn|bnn)/
    bnn 
   
/(?!b(*COMMIT)a)bn|bnn/
    bnn
    
/(?(?!b(*COMMIT)a)bn|bnn)/
   bnn 

/(?=b(*SKIP)a)bn|bnn/
\= Expect no match
    bnn

/(?=b(*THEN)a)bn|bnn/
    bnn
    
/^(?!a(*SKIP)b)/
    ac

/^(?!a(*SKIP)b)../
    acd

/(?!a(*SKIP)b)../
    acd

/^(?(?!a(*SKIP)b))/
    ac

/^(?!a(*PRUNE)b)../
    acd

/(?!a(*PRUNE)b)../
    acd

/(?!a(*COMMIT)b)ac|cd/
    ac

/\A.*?(?:a|bc)/
    ba

/^(A(*THEN)B|C(*THEN)D)/
    CD           

/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
    abc

/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
    abc

/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
    abc

/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
    abc

/^\d*\w{4}/
    1234
\= Expect no match
    123 

/^[^b]*\w{4}/
    aaaa
\= Expect no match
    aaa     

/^[^b]*\w{4}/i
    aaaa
\= Expect no match
    aaa     

/^a*\w{4}/
    aaaa
\= Expect no match
    aaa     

/^a*\w{4}/i
    aaaa
\= Expect no match
    aaa     

/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
    foofoo
    barbar

/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
    AfooA
    AbarA  
\= Expect no match 
    Afoofoo
    Abarbar

/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
    1 IN SOA non-sp1 non-sp2(

/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/x,dupnames
    Ax
    BAxy 
    
/^A\xZ/
    A\0Z 

/^A\o{123}B/
    A\123B

/ ^ a + + b $ /x
    aaaab
    
/ ^ a + #comment
  + b $ /x
    aaaab
    
/ ^ a + #comment
  #comment
  + b $ /x
    aaaab
    
/ ^ (?> a + ) b $ /x
    aaaab 

/ ^ ( a + ) + + \w $ /x
    aaaab 

/(?:a\Kb)*+/aftertext
    ababc

/(?>a\Kb)*/aftertext
    ababc

/(?:a\Kb)*/aftertext
    ababc

/(a\Kb)*+/aftertext
    ababc

/(a\Kb)*/aftertext
    ababc

/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/
\= Expect no match
    acb

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

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

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

'\A([^\"1]++|[\"2]([^\"3]*+|[\"4][\"5])*+[\"6])++'
    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED

/^\w+(?>\s*)(?<=\w)/
    test test

/(?P<same>a)(?P<same>b)/g,dupnames
    abbaba

/(?P<same>a)(?P<same>b)(?P=same)/g,dupnames
    abbaba

/(?P=same)?(?P<same>a)(?P<same>b)/g,dupnames
    abbaba

/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/g,dupnames
    bbbaaabaabb

/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/g,dupnames
\= Expect no match
    bbbaaaccccaaabbbcc

/(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/
    acl
    bdl
    adl
    bcl    

/\sabc/
    \x{0b}abc

/[\Qa]\E]+/
    aa]]

/[\Q]a\E]+/
    aa]]

/A((((((((a))))))))\8B/ 
    AaaB

/A(((((((((a)))))))))\9B/ 
    AaaB
    
/A[\8\9]B/
    A8B
    A9B  

/(|ab)*?d/
   abd
   xyd 

/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
    1234abcd

/(\2|a)(\1)/
    aaa

/(\2)(\1)/

"Z*(|d*){216}"

"(?1)(?#?'){8}(a)"
    baaaaaaaaac

/((((((((((((x))))))))))))\12/
    xx

/A[\8]B[\9]C/
    A8B9C

/(?1)()((((((\1++))\x85)+)|))/
    \x85\x85

"(?|(\k'Pm')|(?'Pm'))"
    abcd

/(?|(aaa)|(b))\g{1}/
    aaaaaa
    bb 

/(?|(aaa)|(b))(?1)/
    aaaaaa
    baaa 
\= Expect no match 
    bb 

/(?|(aaa)|(b))/
    xaaa
    xbc 

/(?|(?'a'aaa)|(?'a'b))\k'a'/
    aaaaaa
    bb 

/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames
    aaaccccaaa
    bccccb 

# /x does not apply to MARK labels 

/x (*MARK:ab cd # comment
ef) x/x,mark
    axxz

/(?<=a(B){0}c)X/
    acX

/(?<DEFINE>b)(?(DEFINE)(a+))(?&DEFINE)/          
    bbbb 
\= Expect no match     
    baaab

/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/
    \   Fred:099

/(?=.*X)X$/ 
    \  X

/(?s)(?=.*?)b/
    aabc

/(Z)(a)\2{1,2}?(?-i)\1X/i
    ZaAAZX

/(?'c')XX(?'YYYYYYYYYYYYYYYYYYYYYYYCl')/

/[s[:digit:]\E-H]+/
    s09-H

/[s[:digit:]\Q\E-H]+/
    s09-H

/a+(?:|b)a/
    aaaa

/X?(R||){3335}/

/(?1)(A(*COMMIT)|B)D/
    ABD
    XABD
    BAD
    ABXABD  
\= Expect no match 
    ABX 

/(?(DEFINE)(?<m> 1? (?=(?<cond>2)?) 1 2 (?('cond')|3)))
    \A
    ()
    (?&m)
    \Z/x
    123

/^(?: 
(?: A| (1? (?=(?<cond>2)?) (1) 2 (?('cond')|3)) )
(Z)
)+$/x
    AZ123Z
\= Expect no match     
    AZ12Z 
    
/^ (?(DEFINE) ( (?!(a)\2b)..) )   ()(?1)  /x
    acb
\= Expect no match     
    aab
    
'(?>ab|abab){1,5}?M'
    abababababababababababM

'(?>ab|abab){2}?M'
    abababM

'((?(?=(a))a)+k)'
    bbak

'((?(?=(a))a|)+k)'
    bbak

'(?(?!(b))a|b)+k'
    ababbalbbadabak

/(?!(b))c|b/
    Ab
    Ac 

/(?=(b))b|c/
    Ab
    Ac 

/^(.|(.)(?1)\2)$/
    a
    aba
    abcba
    ababa
    abcdcba

/^((.)(?1)\2|.?)$/
    a
    aba
    abba
    abcba
    ababa
    abccba
    abcdcba
    abcddcba

/^(.)(\1|a(?2))/
    bab

/^(.|(.)(?1)?\2)$/
    abcba
    
/^(?(?=(a))abc|def)/
    abc

/^(?(?!(a))def|abc)/
    abc

/^(?(?=(a)(*ACCEPT))abc|def)/
    abc

/^(?(?!(a)(*ACCEPT))def|abc)/
    abc

/^(?1)\d{3}(a)/
    a123a

# This pattern uses a lot of named subpatterns in order to match email
# addresses in various formats. It's a heavy test for named subpatterns. In the
# <atext> group, slash is coded as \x{2f} so that this pattern can also be
# processed by perltest.sh, which does not cater for an escaped delimiter
# within the pattern. $ within the pattern must also be escaped. All $ and @
# characters in subject strings are escaped so that Perl doesn't interpret them
# as variable insertions and " characters must also be escaped for Perl.

# This set of subpatterns is more or less a direct transliteration of the BNF
# definitions in RFC2822, without any of the obsolete features. The addition of
# a possessive + to the definition of <phrase> reduced the match limit in PCRE2
# from over 5 million to just under 400, and eliminated a very noticeable delay
# when this file was passed to perltest.sh.

/(?ix)(?(DEFINE)
(?<addr_spec>       (?&local_part) \@ (?&domain) )
(?<angle_addr>      (?&CFWS)?+ < (?&addr_spec) > (?&CFWS)?+ )
(?<atext>           [a-z\d!#\$%&'*+-\x{2f}=?^_`{|}~] )
(?<atom>            (?&CFWS)?+ (?&atext)+ (?&CFWS)?+ )
(?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment) )
(?<ctext>           [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ ()\\] )
(?<comment>         \( (?: (?&FWS)?+ (?&ccontent) )*+ (?&FWS)?+ \) )
(?<CFWS>            (?: (?&FWS)?+ (?&comment) )* (?# NOT possessive)
                    (?: (?&FWS)?+ (?&comment) | (?&FWS) ) )
(?<dcontent>        (?&dtext) | (?&quoted_pair) )
(?<display_name>    (?&phrase) )
(?<domain>          (?&dot_atom) | (?&domain_literal) )
(?<domain_literal>  (?&CFWS)?+ \[ (?: (?&FWS)?+ (?&dcontent) )* (?&FWS)?+ \]
                    (?&CFWS)?+ )
(?<dot_atom>        (?&CFWS)?+ (?&dot_atom_text) (?&CFWS)?+ )
(?<dot_atom_text>   (?&atext)++ (?: \. (?&atext)++)*+ )
(?<dtext>           [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ \[\]\\] )
(?<FWS>             (?: [\t\ ]*+ \n)?+ [\t\ ]++ )
(?<local_part>      (?&dot_atom) | (?&quoted_string)  )
(?<mailbox>         (?&name_addr) | (?&addr_spec) )
(?<name_addr>       (?&display_name)? (?&angle_addr) )
(?<phrase>          (?&word)++ )
(?<qcontent>        (?&qtext) | (?&quoted_pair) )
(?<quoted_pair>     " (?&text) )
(?<quoted_string>   (?&CFWS)?+ " (?: (?&FWS)?+ (?&qcontent))* (?&FWS)?+ "
                    (?&CFWS)?+ )
(?<qtext>           [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ "\\] )
(?<text>            [^\r\n] )
(?<word>            (?&atom) | (?&quoted_string) )
) # End DEFINE
^(?&mailbox)$/
    Alan Other <user\@dom.ain>
    <user\@dom.ain>
    user\@dom.ain
    user\@[] 
    user\@[domain literal] 
    user\@[domain literal with \"[square brackets\"] inside] 
    \"A. Other\" <user.1234\@dom.ain> (a comment)
    A. Other <user.1234\@dom.ain> (a comment)
    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
\= Expect no match
    A missing angle <user\@some.where
    The quick brown fox
    
# -------------------------------------------------------------------------- 

# This pattern uses named groups to match default PCRE2 patterns. It's another
# heavy test for named subpatterns. Once again, code slash as \x{2f} and escape 
# $ even in classes so that this works with pcre2test.

/(?sx)(?(DEFINE)

(?<assertion>         (?&simple_assertion) | (?&lookaround) )

(?<atomic_group>      \( \? > (?&regex) \) )

(?<back_reference>    \\ \d+ |
                      \\g (?: [+-]?\d+ | \{ (?: [+-]?\d+ | (?&groupname) ) \} ) |
                      \\k <(?&groupname)> |
                      \\k '(?&groupname)' |
                      \\k \{ (?&groupname) \} |
                      \( \? P= (?&groupname) \) )

(?<branch>            (?:(?&assertion) |
                         (?&callout) |
                         (?&comment) |
                         (?&option_setting) |
                         (?&qualified_item) |
                         (?&quoted_string) |
                         (?&quoted_string_empty) | 
                         (?&special_escape) |
                         (?&verb)
                      )* )

(?<callout>           \(\?C (?: \d+ | 
                      (?: (?<D>["'`^%\#\$]) 
                        (?: \k'D'\k'D' | (?!\k'D') . )* \k'D' |
                      \{ (?: \}\} | [^}]*+ )* \} ) 
                      )? \) )

(?<capturing_group>   \( (?: \? P? < (?&groupname) > | \? ' (?&groupname) ' )?
                      (?&regex) \) )

(?<character_class>   \[ \^?+ (?: \] (?&class_item)* | (?&class_item)+ ) \] )

(?<character_type>    (?! \\N\{\w+\} ) \\ [dDsSwWhHvVRN] )

(?<class_item>        (?: \[ : (?:
                      alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|
                      punct|space|upper|word|xdigit
                      ) : \] |
                      (?&quoted_string) |  
                      (?&quoted_string_empty) | 
                      (?&escaped_character) | 
                      (?&character_type) | 
                      [^]] ) )

(?<comment>           \(\?\# [^)]* \) | (?&quoted_string_empty) | \\E )

(?<condition>         (?: \( [+-]? \d+ \) |
                          \( < (?&groupname) > \) |
                          \( ' (?&groupname) ' \) |
                          \( R \d* \) |
                          \( R & (?&groupname) \) |
                          \( (?&groupname) \) | 
                          \( DEFINE \) |
                          \( VERSION >?=\d+(?:\.\d\d?)? \) |
                          (?&callout)?+ (?&comment)* (?&lookaround) ) )

(?<conditional_group> \(\? (?&condition) (?&branch) (?: \| (?&branch) )? \) )

(?<delimited_regex>   (?<delimiter> [-\x{2f}!"'`=_:;,%&@~]) (?&regex) 
                      \k'delimiter' .* )

(?<escaped_character> \\ (?: 0[0-7]{1,2} | [0-7]{1,3} | o\{ [0-7]+ \} |
                      x \{ (*COMMIT) [[:xdigit:]]* \} | x [[:xdigit:]]{0,2} | 
                      [aefnrt] | c[[:print:]] |
                      [^[:alnum:]] ) )

(?<group>             (?&capturing_group) | (?&non_capturing_group) |
                      (?&resetting_group) | (?&atomic_group) |
                      (?&conditional_group) )

(?<groupname>         [a-zA-Z_]\w* )

(?<literal_character> (?! (?&range_qualifier) ) [^[()|*+?.\$\\] )

(?<lookaround>        \(\? (?: = | ! | <= | <! ) (?&regex) \) )

(?<non_capturing_group> \(\? [iJmnsUx-]* : (?&regex) \) )

(?<option_setting>    \(\? [iJmnsUx-]* \) )

(?<qualified_item>    (?:\. |
                         (?&lookaround) |
                         (?&back_reference) |
                         (?&character_class) |
                         (?&character_type) |
                         (?&escaped_character) |
                         (?&group) |
                         (?&subroutine_call) |
                         (?&literal_character) |
                         (?&quoted_string) 
                      ) (?&comment)? (?&qualifier)? )

(?<qualifier>         (?: [?*+] | (?&range_qualifier) ) [+?]? )

(?<quoted_string>     (?: \\Q (?: (?!\\E | \k'delimiter') . )++ (?: \\E | ) ) ) 
                      
(?<quoted_string_empty>  \\Q\\E ) 

(?<range_qualifier>   \{ (?: \d+ (?: , \d* )? | , \d+ ) \} )

(?<regex>             (?&start_item)* (?&branch) (?: \| (?&branch) )* )

(?<resetting_group>   \( \? \| (?&regex) \) )

(?<simple_assertion>  \^ | \$ | \\A | \\b | \\B | \\G | \\z | \\Z )

(?<special_escape>    \\K )

(?<start_item>        \( \* (?:
                      ANY |
                      ANYCRLF |
                      BSR_ANYCRLF |
                      BSR_UNICODE |
                      CR |
                      CRLF |
                      LF |
                      LIMIT_MATCH=\d+ |
                      LIMIT_DEPTH=\d+ |
                      LIMIT_HEAP=\d+ | 
                      NOTEMPTY |
                      NOTEMPTY_ATSTART |
                      NO_AUTO_POSSESS |
                      NO_DOTSTAR_ANCHOR |
                      NO_JIT |
                      NO_START_OPT |
                      NUL |
                      UTF |
                      UCP ) \) )

(?<subroutine_call>   (?: \(\?R\) | \(\?[+-]?\d+\) |
                      \(\? (?: & | P> ) (?&groupname) \) |
                      \\g < (?&groupname) > |
                      \\g ' (?&groupname) ' |
                      \\g < [+-]? \d+ > |
                      \\g ' [+-]? \d+ ) )

(?<verb>              \(\* (?: ACCEPT | FAIL | F | COMMIT |
                      (?:MARK)?:(?&verbname) |
                      (?:PRUNE|SKIP|THEN) (?: : (?&verbname)? )? ) \) )

(?<verbname>          [^)]+ )

) # End DEFINE
# Kick it all off...
^(?&delimited_regex)$/subject_literal,jitstack=256
    /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
    /(cat(a(ract|tonic)|erpillar)) \1()2(3)/
    /^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\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
    /<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
    /^(?(DEFINE) (?<A> a) (?<B> b) )  (?&A) (?&B) /
    /(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/
    /\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/
    /^(\w++|\s++)*$/
    /a+b?(*THEN)c+(*FAIL)/
    /(A (A|B(*ACCEPT)|C) D)(E)/x
    /^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
    /A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/B
    /(?C`a``b`)(?C'a''b')(?C"a""b")(?C^a^^b^)(?C%a%%b%)(?C#a##b#)(?C$a$$b$)(?C{a}}b})/B,callout_info
    /(?sx)(?(DEFINE)(?<assertion> (?&simple_assertion) | (?&lookaround) )(?<atomic_group> \( \? > (?&regex) \) )(?<back_reference> \\ \d+ | \\g (?: [+-]?\d+ | \{ (?: [+-]?\d+ | (?&groupname) ) \} ) | \\k <(?&groupname)> | \\k '(?&groupname)' | \\k \{ (?&groupname) \} | \( \? P= (?&groupname) \) )(?<branch> (?:(?&assertion) | (?&callout) | (?&comment) | (?&option_setting) | (?&qualified_item) | (?&quoted_string) | (?&quoted_string_empty) | (?&special_escape) | (?&verb) )* )(?<callout> \(\?C (?: \d+ | (?: (?<D>["'`^%\#\$]) (?: \k'D'\k'D' | (?!\k'D') . )* \k'D' | \{ (?: \}\} | [^}]*+ )* \} ) )? \) )(?<capturing_group> \( (?: \? P? < (?&groupname) > | \? ' (?&groupname) ' )? (?&regex) \) )(?<character_class> \[ \^?+ (?: \] (?&class_item)* | (?&class_item)+ ) \] )(?<character_type> (?! \\N\{\w+\} ) \\ [dDsSwWhHvVRN] )(?<class_item> (?: \[ : (?: alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print| punct|space|upper|word|xdigit ) : \] | (?&quoted_string) | (?&quoted_string_empty) | (?&escaped_character) | (?&character_type) | [^]] ) )(?<comment> \(\?\# [^)]* \) | (?&quoted_string_empty) | \\E )(?<condition> (?: \( [+-]? \d+ \) | \( < (?&groupname) > \) | \( ' (?&groupname) ' \) | \( R \d* \) | \( R & (?&groupname) \) | \( (?&groupname) \) | \( DEFINE \) | \( VERSION >?=\d+(?:\.\d\d?)? \) | (?&callout)?+ (?&comment)* (?&lookaround) ) )(?<conditional_group> \(\? (?&condition) (?&branch) (?: \| (?&branch) )? \) )(?<delimited_regex> (?<delimiter> [-\x{2f}!"'`=_:;,%&@~]) (?&regex) \k'delimiter' .* )(?<escaped_character> \\ (?: 0[0-7]{1,2} | [0-7]{1,3} | o\{ [0-7]+ \} | x \{ (*COMMIT) [[:xdigit:]]* \} | x [[:xdigit:]]{0,2} | [aefnrt] | c[[:print:]] | [^[:alnum:]] ) )(?<group> (?&capturing_group) | (?&non_capturing_group) | (?&resetting_group) | (?&atomic_group) | (?&conditional_group) )(?<groupname> [a-zA-Z_]\w* )(?<literal_character> (?! (?&range_qualifier) ) [^[()|*+?.\$\\] )(?<lookaround> \(\? (?: = | ! | <= | <! ) (?&regex) \) )(?<non_capturing_group> \(\? [iJmnsUx-]* : (?&regex) \) )(?<option_setting> \(\? [iJmnsUx-]* \) )(?<qualified_item> (?:\. | (?&lookaround) | (?&back_reference) | (?&character_class) | (?&character_type) | (?&escaped_character) | (?&group) | (?&subroutine_call) | (?&literal_character) | (?&quoted_string) ) (?&comment)? (?&qualifier)? )(?<qualifier> (?: [?*+] | (?&range_qualifier) ) [+?]? )(?<quoted_string> (?: \\Q (?: (?!\\E | \k'delimiter') . )++ (?: \\E | ) ) ) (?<quoted_string_empty> \\Q\\E ) (?<range_qualifier> \{ (?: \d+ (?: , \d* )? | , \d+ ) \} )(?<regex> (?&start_item)* (?&branch) (?: \| (?&branch) )* )(?<resetting_group> \( \? \| (?&regex) \) )(?<simple_assertion> \^ | \$ | \\A | \\b | \\B | \\G | \\z | \\Z )(?<special_escape> \\K )(?<start_item> \( \* (?: ANY | ANYCRLF | BSR_ANYCRLF | BSR_UNICODE | CR | CRLF | LF | LIMIT_MATCH=\d+ | LIMIT_DEPTH=\d+ | LIMIT_HEAP=\d+ | NOTEMPTY | NOTEMPTY_ATSTART | NO_AUTO_POSSESS | NO_DOTSTAR_ANCHOR | NO_JIT | NO_START_OPT | NUL | UTF | UCP ) \) )(?<subroutine_call> (?: \(\?R\) | \(\?[+-]?\d+\) | \(\? (?: & | P> ) (?&groupname) \) | \\g < (?&groupname) > | \\g ' (?&groupname) ' | \\g < [+-]? \d+ > | \\g ' [+-]? \d+ ) )(?<verb> \(\* (?: ACCEPT | FAIL | F | COMMIT | (?:MARK)?:(?&verbname) | (?:PRUNE|SKIP|THEN) (?: : (?&verbname)? )? ) \) )(?<verbname> [^)]+ ))^(?&delimited_regex)$/
\= Expect no match
    /((?(?C'')\QX\E(?!((?(?C'')(?!X=X));=)r*X=X));=)/
    /(?:(?(2y)a|b)(X))+/
    /a(*MARK)b/
    /a(*CR)b/
    /(?P<abn>(?P=abn)(?<badstufxxx)/

# -------------------------------------------------------------------------- 

/<(?x:[a b])>/xx
    < >

/<(?:[a b])>/xx
    < >

/<(?xxx:[a b])>/
    < >
    
/<(?-x:[a b])>/xx
    < >

/[[:digit:]-]+/
    12-24

/((?<=((*ACCEPT)) )\1?\b) /
\= Expect no match     
    ((?<=((*ACCEPT)) )\\1?\\b)\x20

/((?<=((*ACCEPT))X)\1?Y)\1/
    XYYZ

/((?<=((*ACCEPT))X)\1?Y(*ACCEPT))\1/
    XYYZ

/(?(DEFINE)(?<optional_a>a?)X)^(?&optional_a)a$/
    aa
    a

/^(a?)b(?1)a/
    abaa
    aba 
    baa
    ba  

/^(a?)+b(?1)a/
    abaa
    aba 
    baa
    ba  

/^(a?)++b(?1)a/
    abaa
    aba 
    baa
    ba  

/^(a?)+b/
    b
    ab
    aaab 

/(?=a+)a(a+)++b/
    aab

/(?<=\G.)/g,aftertext
    abc

/(?<=(?=.)?)/

/(?<=(?=.)?+)/

/(?<=(?=.)*)/

/(?<=(?=.){4,5})/

/(?<=(?=.){4,5}x)/

/a(?=.(*:X))(*SKIP:X)(*F)|(.)/
    abc

/a(?>(*:X))(*SKIP:X)(*F)|(.)/
    abc

/a(?:(*:X))(*SKIP:X)(*F)|(.)/
    abc

#pattern no_start_optimize

/(?>a(*:1))(?>b(*:1))(*SKIP:1)x|.*/
    abc

/(?>a(*:1))(?>b)(*SKIP:1)x|.*/
    abc

#subject mark

/a(*ACCEPT:X)b/
    abc
    
/(?=a(*ACCEPT:QQ)bc)axyz/
    axyz

/(?(DEFINE)(a(*ACCEPT:X)))(?1)b/
    abc
    
/a(*F:X)b/
    abc
    
/(?(DEFINE)(a(*F:X)))(?1)b/
    abc

/a(*COMMIT:X)b/
    abc
    
/(?(DEFINE)(a(*COMMIT:X)))(?1)b/
    abc
    
/a+(*:Z)b(*COMMIT:X)(*SKIP:Z)c|.*/
    aaaabd

/a+(*:Z)b(*COMMIT:X)(*SKIP:X)c|.*/
    aaaabd

/a(*COMMIT:X)b/
    axabc

#pattern -no_start_optimize
#subject -mark 

/(.COMMIT)(*COMMIT::::::::::interal error:::)/

/(*COMMIT:��)/

/(*COMMIT:]w)/

/(?i)A(?^)B(?^x:C D)(?^i)e f/
    aBCDE F
\= Expect no match
    aBCDEF
    AbCDe f

/(*pla:foo).{6}/
    abcfoobarxyz
\= Expect no match
    abcfooba

/(*positive_lookahead:foo).{6}/
    abcfoobarxyz
    
/(?(*pla:foo).{6}|a..)/
    foobarbaz
    abcfoobar       

/(?(*positive_lookahead:foo).{6}|a..)/
    foobarbaz
    abcfoobar       
    
/(*plb:foo)bar/
    abcfoobar
\= Expect no match
    abcbarfoo     

/(*positive_lookbehind:foo)bar/
    abcfoobar
\= Expect no match
    abcbarfoo
    
/(?(*plb:foo)bar|baz)/
    abcfoobar
    bazfoobar
    abcbazfoobar
    foobazfoobar    
 
/(?(*positive_lookbehind:foo)bar|baz)/
    abcfoobar
    bazfoobar
    abcbazfoobar
    foobazfoobar    
 
/(*nlb:foo)bar/
    abcbarfoo     
\= Expect no match
    abcfoobar

/(*negative_lookbehind:foo)bar/
    abcbarfoo     
\= Expect no match
    abcfoobar
    
/(?(*nlb:foo)bar|baz)/
    abcfoobaz 
    abcbarbaz 
\= Expect no match
    abcfoobar
 
/(?(*negative_lookbehind:foo)bar|baz)/
    abcfoobaz 
    abcbarbaz 
\= Expect no match
    abcfoobar
 
/(*atomic:a+)\w/
    aaab
\= Expect no match
    aaaa      

/   (?<word> \w+ )*    \.   /xi
    pokus.
    
/(?(DEFINE) (?<word> \w+ ) ) (?&word)*   \./xi
    pokus.

/(?(DEFINE) (?<word> \w+ ) ) ( (?&word)* )   \./xi 
    pokus.

/(?&word)*  (?(DEFINE) (?<word> \w+ ) )  \./xi
    pokus.

/(?&word)*  \. (?<word> \w+ )/xi
    pokus.hokus

/a(?(?=(*:2)b).)/mark
    abc
    acb     

/a(?(?!(*:2)b).)/mark
    acb
    abc     

/(?:a|ab){1}+c/
\= Expect no match
    abc

/(a|ab){1}+c/
    abc
    
/(a+){1}+a/
\= Expect no match
    aaaa

/(?(DEFINE)(a|ab))(?1){1}+c/
    abc    

/(?:a|(?=b)|.)*\z/
    abc
    
/(?:a|(?=b)|.)*/
    abc 
    
/(?<=a(*SKIP)x)|c/
    abcd
    
/(?<=a(*SKIP)x)|d/
    abcd
 
/(?<=(?=.(?<=x)))/aftertext
    abx

/(?<=(?=(?<=a)))b/
    ab

/^(?<A>a)(?(<A>)b)((?<=b).*)$/
    abc

/^(a\1?){4}$/
    aaaa
    aaaaaa

/^((\1+)|\d)+133X$/
    111133X

/^(?=.*(?=(([A-Z]).*(?(1)\1)))(?!.+\2)){26}/i
    The quick brown fox jumps over the lazy dog.
    Jackdaws love my big sphinx of quartz.
    Pack my box with five dozen liquor jugs.
\= Expect no match
    The quick brown fox jumps over the lazy cat.
    Hackdaws love my big sphinx of quartz.
    Pack my fox with five dozen liquor jugs.

/^(?>.*?([A-Z])(?!.*\1)){26}/i
    The quick brown fox jumps over the lazy dog.
    Jackdaws love my big sphinx of quartz.
    Pack my box with five dozen liquor jugs.
\= Expect no match
    The quick brown fox jumps over the lazy cat.
    Hackdaws love my big sphinx of quartz.
    Pack my fox with five dozen liquor jugs.

# End of testinput1