testoutput1   [plain text]


PCRE version 3.9 02-Jan-2002

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

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

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

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

/^(abc){1,2}zz/
    abczz
 0: abczz
 1: abc
    abcabczz
 0: abcabczz
 1: abc
    *** Failers
No match
    zz
No match
    abcabcabczz
No match
    >>abczz
No match

/^(b+?|a){1,2}?c/
    bc
 0: bc
 1: b
    bbc
 0: bbc
 1: b
    bbbc
 0: bbbc
 1: bb
    bac
 0: bac
 1: a
    bbac
 0: bbac
 1: a
    aac
 0: aac
 1: a
    abbbbbbbbbbbc
 0: abbbbbbbbbbbc
 1: bbbbbbbbbbb
    bbbbbbbbbbbac
 0: bbbbbbbbbbbac
 1: a
    *** Failers
No match
    aaac
No match
    abbbbbbbbbbbac
No match

/^(b+|a){1,2}c/
    bc
 0: bc
 1: b
    bbc
 0: bbc
 1: bb
    bbbc
 0: bbbc
 1: bbb
    bac
 0: bac
 1: a
    bbac
 0: bbac
 1: a
    aac
 0: aac
 1: a
    abbbbbbbbbbbc
 0: abbbbbbbbbbbc
 1: bbbbbbbbbbb
    bbbbbbbbbbbac
 0: bbbbbbbbbbbac
 1: a
    *** Failers
No match
    aaac
No match
    abbbbbbbbbbbac
No match

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

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

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

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

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

/^[]cde]/
    ]thing
 0: ]
    cthing
 0: c
    dthing
 0: d
    ething
 0: e
    *** Failers
No match
    athing
No match
    fthing
No match

/^[^ab\]cde]/
    fthing
 0: f
    [thing
 0: [
    \\thing
 0: \
    *** Failers
 0: *
    athing
No match
    bthing
No match
    ]thing
No match
    cthing
No match
    dthing
No match
    ething
No match

/^[^]cde]/
    athing
 0: a
    fthing
 0: f
    *** Failers
 0: *
    ]thing
No match
    cthing
No match
    dthing
No match
    ething
No match

/^\/
    
 0: \x81

/^/
    
 0: \xff

/^[0-9]+$/
    0
 0: 0
    1
 0: 1
    2
 0: 2
    3
 0: 3
    4
 0: 4
    5
 0: 5
    6
 0: 6
    7
 0: 7
    8
 0: 8
    9
 0: 9
    10
 0: 10
    100
 0: 100
    *** Failers
No match
    abc
No match

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

/^xxx[0-9]+$/
    xxx0
 0: xxx0
    xxx1234
 0: xxx1234
    *** Failers
No match
    xxx
No match

/^.+[0-9][0-9][0-9]$/
    x123
 0: x123
    xx123
 0: xx123
    123456
 0: 123456
    *** Failers
No match
    123
No match
    x1234
 0: x1234

/^.+?[0-9][0-9][0-9]$/
    x123
 0: x123
    xx123
 0: xx123
    123456
 0: 123456
    *** Failers
No match
    123
No match
    x1234
 0: x1234

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

/:/
    Well, we need a colon: somewhere
 0: :
    *** Fail if we don't
No match

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

/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
    .1.2.3
 0: .1.2.3
 1: 1
 2: 2
 3: 3
    A.12.123.0
 0: A.12.123.0
 1: 12
 2: 123
 3: 0
    *** Failers
No match
    .1.2.3333
No match
    1.2.3
No match
    1234.2.3
No match

/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
    1 IN SOA non-sp1 non-sp2(
 0: 1 IN SOA non-sp1 non-sp2(
 1: 1
 2: non-sp1
 3: non-sp2
    1    IN    SOA    non-sp1    non-sp2   (
 0: 1    IN    SOA    non-sp1    non-sp2   (
 1: 1
 2: non-sp1
 3: non-sp2
    *** Failers
No match
    1IN SOA non-sp1 non-sp2(
No match

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

/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
    *.a
 0: *.a
    *.b0-a
 0: *.b0-a
 1: 0-a
    *.c3-b.c
 0: *.c3-b.c
 1: 3-b
 2: .c
    *.c-a.b-c
 0: *.c-a.b-c
 1: -a
 2: .b-c
 3: -c
    *** Failers
No match
    *.0
No match
    *.a-
No match
    *.a-b.c-
No match
    *.c-a.0-c
No match

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

/^(?!(ab)de|x)(abd)(f)/
    abdf
 0: abdf
 1: <unset>
 2: abd
 3: f

/^(?=(ab(cd)))(ab)/
    abcd
 0: ab
 1: abcd
 2: cd
 3: ab

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

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

/^$/
    \
 0: 
    *** Failers
No match

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

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

/^   a\ b[c ]d       $/x
    a bcd
 0: a bcd
    a b d
 0: a b d
    *** Failers
No match
    abcd
No match
    ab d
No match

/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
    abcdefhijklm
 0: abcdefhijklm
 1: abc
 2: bc
 3: c
 4: def
 5: ef
 6: f
 7: hij
 8: ij
 9: j
10: klm
11: lm
12: m

/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
    abcdefhijklm
 0: abcdefhijklm
 1: bc
 2: c
 3: ef
 4: f
 5: ij
 6: j
 7: lm
 8: m

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

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

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

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

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

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

/^\d{8}\w{2,}/
    1234567890
 0: 1234567890
    12345678ab
 0: 12345678ab
    12345678__
 0: 12345678__
    *** Failers
No match
    1234567
No match

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

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

/\A(abc|def)=(\1){2,3}\Z/
    abc=abcabc
 0: abc=abcabc
 1: abc
 2: abc
    def=defdefdef
 0: def=defdefdef
 1: def
 2: def
    *** Failers
No match
    abc=defdef
No match

/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
    abcdefghijkcda2
 0: abcdefghijkcda2
 1: a
 2: b
 3: c
 4: d
 5: e
 6: f
 7: g
 8: h
 9: i
10: j
11: k
12: cd
    abcdefghijkkkkcda2
 0: abcdefghijkkkkcda2
 1: a
 2: b
 3: c
 4: d
 5: e
 6: f
 7: g
 8: h
 9: i
10: j
11: k
12: cd

/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
    cataract cataract23
 0: cataract cataract23
 1: cataract
 2: aract
 3: ract
 4: 
 5: 3
    catatonic catatonic23
 0: catatonic catatonic23
 1: catatonic
 2: atonic
 3: tonic
 4: 
 5: 3
    caterpillar caterpillar23
 0: caterpillar caterpillar23
 1: caterpillar
 2: erpillar
 3: <unset>
 4: 
 5: 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 abcd  Mon Sep 01 12:33:02 1997
 0: From abcd  Mon Sep 01 12:33
 1: abcd

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

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

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

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

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

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

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

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

/#rhubarb
  abcd/x
    abcd
 0: abcd

/^abcd#rhubarb/x
    abcd
 0: abcd

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

/(?!^)abc/
    the abc
 0: abc
    *** Failers
No match
    abc
No match

/(?=^)abc/
    abc
 0: abc
    *** Failers
No match
    the abc
No match

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

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

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

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

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

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

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

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

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

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

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

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

/A\x0{2,3}Z/
    The A\x0\x0Z
 0: A\x00\x00Z
    An A\0\x0\0Z
 0: A\x00\x00\x00Z
    *** Failers
No match
    A\0Z
No match
    A\0\x0\0\x0Z
No match

/^(cow|)\1(bell)/
    cowcowbell
 0: cowcowbell
 1: cow
 2: bell
    bell
 0: bell
 1: 
 2: bell
    *** Failers
No match
    cowbell
No match

/^\s/
    \040abc
 0:  
    \x0cabc
 0: \x0c
    \nabc
 0: \x0a
    \rabc
 0: \x0d
    \tabc
 0: \x09
    *** Failers
No match
    abc
No match

/^a	b
  
    c/x
    abc
 0: abc

/^(a|)\1*b/
    ab
 0: ab
 1: a
    aaaab
 0: aaaab
 1: a
    b
 0: b
 1: 
    *** Failers
No match
    acb
No match

/^(a|)\1+b/
    aab
 0: aab
 1: a
    aaaab
 0: aaaab
 1: a
    b
 0: b
 1: 
    *** Failers
No match
    ab
No match

/^(a|)\1?b/
    ab
 0: ab
 1: a
    aab
 0: aab
 1: a
    b
 0: b
 1: 
    *** Failers
No match
    acb
No match

/^(a|)\1{2}b/
    aaab
 0: aaab
 1: a
    b
 0: b
 1: 
    *** Failers
No match
    ab
No match
    aab
No match
    aaaab
No match

/^(a|)\1{2,3}b/
    aaab
 0: aaab
 1: a
    aaaab
 0: aaaab
 1: a
    b
 0: b
 1: 
    *** Failers
No match
    ab
No match
    aab
No match
    aaaaab
No match

/ab{1,3}bc/
    abbbbc
 0: abbbbc
    abbbc
 0: abbbc
    abbc
 0: abbc
    *** Failers
No match
    abc
No match
    abbbbbc
No match

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

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

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

/^[W-c]+$/
    WXY_^abc
 0: WXY_^abc
    ***Failers
No match
    wxy
No match

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

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

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

/^abc$/
    abc
 0: abc
    *** Failers
No match
    qqq\nabc
No match
    abc\nzzz
No match
    qqq\nabc\nzzz
No match

/\Aabc\Z/m
    abc
 0: abc
    abc\n 
 0: abc
    *** Failers
No match
    qqq\nabc
No match
    abc\nzzz
No match
    qqq\nabc\nzzz
No match
    
/\A(.)*\Z/s
    abc\ndef
 0: abc\x0adef
 1: f

/\A(.)*\Z/m
    *** Failers
 0: *** Failers
 1: s
    abc\ndef
No match

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

/[-az]+/
    az-
 0: az-
    *** Failers
 0: a
    b
No match

/[az-]+/
    za-
 0: za-
    *** Failers
 0: a
    b
No match

/[a\-z]+/
    a-z
 0: a-z
    *** Failers
 0: a
    b
No match

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

/[\d-]+/
    12-34
 0: 12-34
    *** Failers
No match
    aaa
No match

/[\d-z]+/
    12-34z
 0: 12-34z
    *** Failers
No match
    aaa
No match

/\x5c/
    \\
 0: \

/\x20Z/
    the Zoo
 0:  Z
    *** Failers
No match
    Zulu
No match

/(abc)\1/i
    abcabc
 0: abcabc
 1: abc
    ABCabc
 0: ABCabc
 1: ABC
    abcABC
 0: abcABC
 1: abc

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

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

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

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

/^a.b/
    a\rb
 0: a\x0db
    *** Failers
No match
    a\nb
No match

/abc$/
    abc
 0: abc
    abc\n
 0: abc
    *** Failers
No match
    abc\ndef
No match

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

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

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

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

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

/abc\81/
    abc\081
 0: abc\x0081
    abc\0\x38\x31
 0: abc\x0081

/abc\91/
    abc\091
 0: abc\x0091
    abc\0\x39\x31
 0: abc\x0091

/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
    abcdefghijkllS
 0: abcdefghijkllS
 1: a
 2: b
 3: c
 4: d
 5: e
 6: f
 7: g
 8: h
 9: i
10: j
11: k
12: l

/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
    abcdefghijk\12S
 0: abcdefghijk\x0aS
 1: a
 2: b
 3: c
 4: d
 5: e
 6: f
 7: g
 8: h
 9: i
10: j
11: k

/ab\gdef/
    abgdef
 0: abgdef

/a{0}bc/
    bc
 0: bc

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

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

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

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

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

/^([^a])([^\b])([^c]*)([^d]{3,4})/
    baNOTccccd
 0: baNOTcccc
 1: b
 2: a
 3: NOT
 4: cccc
    baNOTcccd
 0: baNOTccc
 1: b
 2: a
 3: NOT
 4: ccc
    baNOTccd
 0: baNOTcc
 1: b
 2: a
 3: NO
 4: Tcc
    bacccd
 0: baccc
 1: b
 2: a
 3: 
 4: ccc
    *** Failers
 0: *** Failers
 1: *
 2: *
 3: * Fail
 4: ers
    anything
No match
    b\bc   
No match
    baccd
No match

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

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

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

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

/(a)\1{8,}/
    aaaaaaaaa
 0: aaaaaaaaa
 1: a
    aaaaaaaaaa
 0: aaaaaaaaaa
 1: a
    *** Failers
No match
    aaaaaaa   
No match

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
  word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
No match

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

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

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

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

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

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

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

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

/^(a){1,}/
    bcd
No match
    abc
 0: a
 1: a
    aab
 0: aa
 1: a
    aaa
 0: aaa
 1: a
    aaaaaaaa    
 0: aaaaaaaa
 1: a

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/^[abcdefghijklmnopqrstuvwxy0123456789]/
    n
 0: n
    *** Failers 
No match
    z 
No match

/abcde{0,0}/
    abcd
 0: abcd
    *** Failers
No match
    abce  
No match

/ab[cd]{0,0}e/
    abe
 0: abe
    *** Failers
No match
    abcde 
No match
    
/ab(c){0,0}d/
    abd
 0: abd
    *** Failers
No match
    abcd   
No match

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

/.*?/g+
    abc
 0: 
 0+ abc
 0: a
 0+ bc
 0: 
 0+ bc
 0: b
 0+ c
 0: 
 0+ c
 0: c
 0+ 
 0: 
 0+ 
  
/\b/g+
    abc 
 0: 
 0+ abc
 0: 
 0+ 

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

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

/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
  <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
 0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
 1:  BGCOLOR='#DBE9E9'
 2:  align=left valign=top
 3: 43.
 4: <a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)
 5: 
 6: 
 7: <unset>
 8:  align=left valign=top
 9: Lega lstaff.com
10:  align=left valign=top
11: CA - Statewide

/a[^a]b/
    acb
 0: acb
    a\nb
 0: a\x0ab
    
/a.b/
    acb
 0: acb
    *** Failers 
No match
    a\nb   
No match
    
/a[^a]b/s
    acb
 0: acb
    a\nb  
 0: a\x0ab
    
/a.b/s
    acb
 0: acb
    a\nb  
 0: a\x0ab

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

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

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

/(AB)*?\1/
    ABABAB
 0: ABAB
 1: AB

/(AB)*\1/
    ABABAB
 0: ABABAB
 1: AB
    
/ End of testinput1 /