pcre2/testdata/testinput1

5696 lines
97 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.pl script.
#forbid_utf
#perltest
/the quick brown fox/
the quick brown fox
The quick brown FOX
What do you know about the quick brown fox?
What do you know about THE QUICK BROWN FOX?
/The quick brown fox/i
the quick brown fox
The quick brown FOX
What do you know about the quick brown fox?
What do you know about THE QUICK BROWN FOX?
/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
abcd\t\n\r\f\a\e9;\$\\?caxyz
/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
abxyzpqrrrabbxyyyypqAzz
abxyzpqrrrabbxyyyypqAzz
aabxyzpqrrrabbxyyyypqAzz
aaabxyzpqrrrabbxyyyypqAzz
aaaabxyzpqrrrabbxyyyypqAzz
abcxyzpqrrrabbxyyyypqAzz
aabcxyzpqrrrabbxyyyypqAzz
aaabcxyzpqrrrabbxyyyypAzz
aaabcxyzpqrrrabbxyyyypqAzz
aaabcxyzpqrrrabbxyyyypqqAzz
aaabcxyzpqrrrabbxyyyypqqqAzz
aaabcxyzpqrrrabbxyyyypqqqqAzz
aaabcxyzpqrrrabbxyyyypqqqqqAzz
aaabcxyzpqrrrabbxyyyypqqqqqqAzz
aaaabcxyzpqrrrabbxyyyypqAzz
abxyzzpqrrrabbxyyyypqAzz
aabxyzzzpqrrrabbxyyyypqAzz
aaabxyzzzzpqrrrabbxyyyypqAzz
aaaabxyzzzzpqrrrabbxyyyypqAzz
abcxyzzpqrrrabbxyyyypqAzz
aabcxyzzzpqrrrabbxyyyypqAzz
aaabcxyzzzzpqrrrabbxyyyypqAzz
aaaabcxyzzzzpqrrrabbxyyyypqAzz
aaaabcxyzzzzpqrrrabbbxyyyypqAzz
aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
aaabcxyzpqrrrabbxyyyypABzz
aaabcxyzpqrrrabbxyyyypABBzz
>>>aaabxyzpqrrrabbxyyyypqAzz
>aaaabxyzpqrrrabbxyyyypqAzz
>>>>abcxyzpqrrrabbxyyyypqAzz
*** Failers
abxyzpqrrabbxyyyypqAzz
abxyzpqrrrrabbxyyyypqAzz
abxyzpqrrrabxyyyypqAzz
aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
aaaabcxyzzzzpqrrrabbbxyyypqAzz
aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
/^(abc){1,2}zz/
abczz
abcabczz
*** Failers
zz
abcabcabczz
>>abczz
/^(b+?|a){1,2}?c/
bc
bbc
bbbc
bac
bbac
aac
abbbbbbbbbbbc
bbbbbbbbbbbac
*** Failers
aaac
abbbbbbbbbbbac
/^(b+|a){1,2}c/
bc
bbc
bbbc
bac
bbac
aac
abbbbbbbbbbbc
bbbbbbbbbbbac
*** Failers
aaac
abbbbbbbbbbbac
/^(b+|a){1,2}?bc/
bbc
/^(b*|ba){1,2}?bc/
babc
bbabc
bababc
*** Failers
bababbc
babababc
/^(ba|b*){1,2}?bc/
babc
bbabc
bababc
*** Failers
bababbc
babababc
/^\ca\cA\c[;\c:/
\x01\x01\e;z
/^[ab\]cde]/
athing
bthing
]thing
cthing
dthing
ething
*** Failers
fthing
[thing
\\thing
/^[]cde]/
]thing
cthing
dthing
ething
*** Failers
athing
fthing
/^[^ab\]cde]/
fthing
[thing
\\thing
*** Failers
athing
bthing
]thing
cthing
dthing
ething
/^[^]cde]/
athing
fthing
*** Failers
]thing
cthing
dthing
ething
/^\<5C>/
<20>
/^<5E>/
<20>
/^[0-9]+$/
0
1
2
3
4
5
6
7
8
9
10
100
*** Failers
abc
/^.*nter/
enter
inter
uponter
/^xxx[0-9]+$/
xxx0
xxx1234
*** Failers
xxx
/^.+[0-9][0-9][0-9]$/
x123
xx123
123456
*** Failers
123
x1234
/^.+?[0-9][0-9][0-9]$/
x123
xx123
123456
*** Failers
123
x1234
/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
abc!pqr=apquxz.ixr.zzz.ac.uk
*** Failers
!pqr=apquxz.ixr.zzz.ac.uk
abc!=apquxz.ixr.zzz.ac.uk
abc!pqr=apquxz:ixr.zzz.ac.uk
abc!pqr=apquxz.ixr.zzz.ac.ukk
/:/
Well, we need a colon: somewhere
*** Fail if we don't
/([\da-f:]+)$/i
0abc
abc
fed
E
::
5f03:12C0::932e
fed def
Any old stuff
*** Failers
0zzz
gzzz
fed\x20
Any old rubbish
/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
.1.2.3
A.12.123.0
*** Failers
.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 (
*** Failers
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-.
*** Failers
-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
*** Failers
*.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
*** Failers
\"1234\" : things
/^$/
\
*** Failers
/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
ab c
*** Failers
abc
ab cde
/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
ab c
*** Failers
abc
ab cde
/^ a\ b[c ]d $/x
a bcd
a b d
*** Failers
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__
*** Failers
1234567
/^[aeiou\d]{4,5}$/
uoie
1234
12345
aaaaa
*** Failers
123456
/^[aeiou\d]{4,5}?/
uoie
1234
12345
aaaaa
123456
/\A(abc|def)=(\1){2,3}\Z/
abc=abcabc
def=defdefdef
*** Failers
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
*** Failers
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
*** Failers
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
*** Failers
abc
/(?=^)abc/
abc
*** Failers
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
*** Failers
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
*** Failers
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
*** Failers
A\0Z
A\0\x0\0\x0Z
/^(cow|)\1(bell)/
cowcowbell
bell
*** Failers
cowbell
/^\s/
\040abc
\x0cabc
\nabc
\rabc
\tabc
*** Failers
abc
/^a b
c/x
abc
/^(a|)\1*b/
ab
aaaab
b
*** Failers
acb
/^(a|)\1+b/
aab
aaaab
b
*** Failers
ab
/^(a|)\1?b/
ab
aab
b
*** Failers
acb
/^(a|)\1{2}b/
aaab
b
*** Failers
ab
aab
aaaab
/^(a|)\1{2,3}b/
aaab
aaaab
b
*** Failers
ab
aab
aaaaab
/ab{1,3}bc/
abbbbc
abbbc
abbc
*** Failers
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
*** Failers
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
*** Failers
qqq\nabc
abc\nzzz
qqq\nabc\nzzz
/\Aabc\Z/m
abc
abc\n
*** Failers
qqq\nabc
abc\nzzz
qqq\nabc\nzzz
/\A(.)*\Z/s
abc\ndef
/\A(.)*\Z/m
*** Failers
abc\ndef
/(?:b)|(?::+)/
b::c
c::b
/[-az]+/
az-
*** Failers
b
/[az-]+/
za-
*** Failers
b
/[a\-z]+/
a-z
*** Failers
b
/[a-z]+/
abcdxyz
/[\d-]+/
12-34
*** Failers
aaa
/[\d-z]+/
12-34z
*** Failers
aaa
/\x5c/
\\
/\x20Z/
the Zoo
*** Failers
Zulu
/(abc)\1/i
abcabc
ABCabc
abcABC
/ab{3cd/
ab{3cd
/ab{3,cd/
ab{3,cd
/ab{3,4a}cd/
ab{3,4a}cd
/{4,5a}bc/
{4,5a}bc
/abc$/
abc
abc\n
*** Failers
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
*** Failers
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
*** Failers
anything
b\bc
baccd
/[^a]/
Abc
/[^a]/i
Abc
/[^a]+/
AAAaAbc
/[^a]+/i
AAAaAbc
/[^a]+/
bbb\nccc
/[^k]$/
abc
*** Failers
abk
/[^k]{2,3}$/
abc
kbc
kabc
*** Failers
abk
akb
akk
/^\d{8,}\@.+[^k]$/
12345678\@a.b.c.d
123456789\@x.y.z
*** Failers
12345678\@x.y.uk
1234567\@a.b.c.d
/(a)\1{8,}/
aaaaaaaaa
aaaaaaaaaa
*** Failers
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
*** Failers
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
*** Failers
ABC123
/^[W-]46]/
W46]789
-46]789
*** Failers
Wall
Zebra
42
[abcd]
]abcd[
/^[W-\]46]/
W46]789
Wall
Zebra
Xylophone
42
[abcd]
]abcd[
\\backslash
*** Failers
-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
word cat dog elephant mussel cow horse canary baboon snake shark
/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
/^(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}/
bcd
abc
aab
/^(a){1,2}/
bcd
abc
aab
/^(a){1,3}/
bcd
abc
aab
aaa
/^(a){1,}/
bcd
abc
aab
aaa
aaaaaaaa
/.*\.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
*** Failers
abcde\nBar
/(.*X|^B)/m
abcde\n1234Xyz
BarFoo
abcde\nBar
/(.*X|^B)/s
abcde\n1234Xyz
BarFoo
*** Failers
abcde\nBar
/(.*X|^B)/ms
abcde\n1234Xyz
BarFoo
abcde\nBar
/(?s)(.*X|^B)/
abcde\n1234Xyz
BarFoo
*** Failers
abcde\nBar
/(?s:.*X|^B)/
abcde\n1234Xyz
BarFoo
*** Failers
abcde\nBar
/^.*B/
**** Failers
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
*** Failers
z
/abcde{0,0}/
abcd
*** Failers
abce
/ab[cd]{0,0}e/
abe
*** Failers
abcde
/ab(c){0,0}d/
abd
*** Failers
abcd
/a(b*)/
a
ab
abbbb
*** Failers
bbbbb
/ab\d{0}e/
abe
*** Failers
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
*** Failers
a\nb
/a[^a]b/s
acb
a\nb
/a.b/s
acb
a\nb
/^(b+?|a){1,2}?c/
bac
bbac
bbbac
bbbbac
bbbbbac
/^(b+|a){1,2}?c/
bac
bbac
bbbac
bbbbac
bbbbbac
/(?!\A)x/m
x\nb\n
a\bx\n
/\x0{ab}/
\0{ab}
/(A|B)*?CD/
CD
/(A|B)*CD/
CD
/(AB)*?\1/
ABABAB
/(AB)*\1/
ABABAB
/(?<!bar)foo/
foo
catfood
arfootle
rfoosh
*** Failers
barfoo
towbarfoo
/\w{3}(?<!bar)foo/
catfood
*** Failers
foo
barfoo
towbarfoo
/(?<=(foo)a)bar/
fooabar
*** Failers
bar
foobbar
/\Aabc\z/m
abc
*** Failers
abc\n
qqq\nabc
abc\nzzz
qqq\nabc\nzzz
"(?>.*/)foo"
/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
"(?>.*/)foo"
/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
/(?>(\.\d\d[1-9]?))\d+/
1.230003938
1.875000282
*** Failers
1.235
/^((?>\w+)|(?>\s+))*$/
now is the time for all good men to come to the aid of the party
*** Failers
this is not a line with only words and spaces!
/(\d+)(\w)/
12345a
12345+
/((?>\d+))(\w)/
12345a
*** Failers
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)
*** Failers
((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/a(?-i)b/i
ab
Ab
*** Failers
aB
AB
/(a (?x)b c)d e/
a bcd e
*** Failers
a b cd e
abcd e
a bcde
/(a b(?x)c d (?-x)e f)/
a bcde f
*** Failers
abcdef
/(a(?i)b)c/
abc
aBc
*** Failers
abC
aBC
Abc
ABc
ABC
AbC
/a(?i:b)c/
abc
aBc
*** Failers
ABC
abC
aBC
/a(?i:b)*c/
aBc
aBBc
*** Failers
aBC
aBBC
/a(?=b(?i)c)\w\wd/
abcd
abCd
*** Failers
aBCd
abcD
/(?s-i:more.*than).*million/i
more than million
more than MILLION
more \n than Million
*** Failers
MORE THAN MILLION
more \n than \n million
/(?:(?s-i)more.*than).*million/i
more than million
more than MILLION
more \n than Million
*** Failers
MORE THAN MILLION
more \n than \n million
/(?>a(?i)b+)+c/
abc
aBbc
aBBc
*** Failers
Abc
abAb
abbC
/(?=a(?i)b)\w\wc/
abc
aBc
*** Failers
Ab
abC
aBC
/(?<=a(?i)b)(\w\w)c/
abxxc
aBxxc
*** Failers
Abxxc
ABxxc
abxxC
/(?:(a)|b)(?(1)A|B)/
aA
bB
*** Failers
aB
bA
/^(a)?(?(1)a|b)+$/
aa
b
bb
*** Failers
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
*** Failers
xyz
/^(?(?!abc)\d\d|\w{3}:)$/
abc:
12
*** Failers
123
xyz
/(?(?<=foo)bar|cat)/
foobar
cat
fcat
focat
*** Failers
foocat
/(?(?<!foo)cat|bar)/
foobar
cat
fcat
focat
*** Failers
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
*** Failers
1234
/((?i)blah)\s+\1/
blah blah
BLAH BLAH
Blah Blah
blaH blaH
*** Failers
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
/(?>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
*** Failers
sep-12-98
/(?<=(foo))bar\1/
foobarfoo
foobarfootling
*** Failers
foobar
barfoo
/(?i:saturday|sunday)/
saturday
sunday
Saturday
Sunday
SATURDAY
SUNDAY
SunDay
/(a(?i)bc|BB)x/
abcx
aBCx
bbx
BBx
*** Failers
abcX
aBCX
bbX
BBX
/^([ab](?i)[cd]|[ef])/
ac
aC
bD
elephant
Europe
frog
France
*** Failers
Africa
/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
ab
aBd
xy
xY
zebra
Zambesi
*** Failers
aCD
XY
/(?<=foo\n)^bar/m
foo\nbar
*** Failers
bar
baz\nbar
/(?<=(?<!foo)bar)baz/
barbaz
barbarbaz
koobarbaz
*** Failers
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}$/
a
aa
aaa
aaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaaa
aaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaa
/^(a\1?)(a\1?)(a\2?)(a\3?)$/
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
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
*** Failers
xbc
axc
abx
/ab*c/
abc
/ab*bc/
abc
abbc
abbbbc
/.{1}/
abbbbc
/.{3,4}/
abbbbc
/ab{0,}bc/
abbbbc
/ab+bc/
abbc
*** Failers
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/
*** Failers
abq
abbbbc
/ab?bc/
abbc
abc
/ab{0,1}bc/
abc
/ab?bc/
/ab?c/
abc
/ab{0,1}c/
abc
/^abc$/
abc
*** Failers
abbbbc
abcc
/^abc/
abcc
/^abc$/
/abc$/
aabc
*** Failers
aabc
aabcd
/^/
abc
/$/
abc
/a.c/
abc
axc
/a.*c/
axyzc
/a[bc]d/
abd
*** Failers
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
*** Failers
abd
abd
/a[^-b]c/
adc
/a[^]b]c/
adc
*** Failers
a-c
a]c
/\ba\b/
a-
-a
-a-
/\by\b/
*** Failers
xy
yz
xyz
/\Ba\B/
*** Failers
a-
-a
-a-
/\By\b/
xy
/\by\B/
yz
/\By\B/
xyz
/\w/
a
/\W/
-
*** Failers
-
a
/a\sb/
a b
/a\Sb/
a-b
*** Failers
a-b
a b
/\d/
1
/\D/
-
*** Failers
-
1
/[\w]/
a
/[\W]/
-
*** Failers
-
a
/a[\s]b/
a b
/a[\S]b/
a-b
*** Failers
a-b
a b
/[\d]/
1
/[\D]/
-
*** Failers
-
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/
*** Failers
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/
*** Failers
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
*** Failers
effg
bcdd
/((((((((((a))))))))))/
a
/((((((((((a))))))))))\10/
aa
/(((((((((a)))))))))/
a
/multiple words of text/
*** Failers
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
*** Failers
ab
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
*** Failers
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
*** Failers
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
*** Failers
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
*** Failers
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
*** Failers
AABC
AXYZD
/a[bc]d/i
ABD
/a[b-d]e/i
ACE
*** Failers
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
*** Failers
ABD
A-C
/a[^]b]c/i
ADC
/ab|cd/i
ABC
ABCD
/()ef/i
DEF
/$b/i
*** Failers
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/i
/a*/i
/([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
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
*** Failers
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
*** Failers
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
*** Failers
AB
aaaaaaaaa
aaaaaaaaaaa
/^(a(?(1)\1)){4}$/
aaaaaaaaaa
*** Failers
aaaaaaaaa
aaaaaaaaaaa
/(?:(f)(o)(o)|(b)(a)(r))*/
foobar
/(?<=a)b/
ab
*** Failers
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/
*** Failers
cb
aB
/((?i)a)b/
/(?i:a)b/
ab
/((?i:a))b/
ab
/(?i:a)b/
Ab
/((?i:a))b/
Ab
/(?i:a)b/
*** Failers
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
*** Failers
aB
Ab
/((?-i)a)b/i
/(?:(?-i)a)b/i
aB
/((?-i)a)b/i
aB
/(?:(?-i)a)b/i
*** Failers
Ab
AB
/((?-i)a)b/i
/(?-i:a)b/i
ab
/((?-i:a))b/i
ab
/(?-i:a)b/i
aB
/((?-i:a))b/i
aB
/(?-i:a)b/i
*** Failers
AB
Ab
/((?-i:a))b/i
/(?-i:a)b/i
aB
/((?-i:a))b/i
aB
/(?-i:a)b/i
*** Failers
Ab
AB
/((?-i:a))b/i
/((?-i:a.))b/i
*** Failers
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/
*** Failers
B\nB
dbcb
/(?<![cd])[ab]/
dbaacb
/(?<!(c|d))b/
/(?<!(c|d))[ab]/
dbaacb
/(?<!cd)[ab]/
cdaccb
/^(?:a?b?)*$/
\
a
ab
aaa
*** Failers
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/
*** Failers
a\nb\nc\n
a\nb\nc\n
/((?m)^b)/
a\nb\nc\n
/(x)?(?(1)a|b)/
*** Failers
a
a
/(x)?(?(1)b|a)/
a
/()?(?(1)b|a)/
a
/()(?(1)b|a)/
/()?(?(1)a|b)/
a
/^(\()?blah(?(1)(\)))$/
(blah)
blah
*** Failers
a
blah)
(blah
/^(\(+)?blah(?(1)(\)))$/
(blah)
blah
*** Failers
blah)
(blah
/(?(?!a)a|b)/
/(?(?!a)b|a)/
a
/(?(?=a)b|a)/
*** Failers
a
a
/(?(?=a)a|b)/
a
/(?=(a+?))(\1ab)/
aaab
/^(?=(a+?))\1ab/
/(\w+:)+/
one:
/$(?<=^(a))/
a
/(?=(a+?))(\1ab)/
aaab
/^(?=(a+?))\1ab/
*** Failers
aaab
aaab
/([\w:]+::)?(\w+)$/
abcd
xy:z:::abcd
/^[^bcd]*(c+)/
aexycd
/(a*)b+/
caab
/([\w:]+::)?(\w+)$/
abcd
xy:z:::abcd
*** Failers
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/
*** Failers
aaab
a\nb\n
/b\Z/
a\nb\n
/b\z/
/b\Z/
a\nb
/b\z/
a\nb
*** Failers
/^(?>(?(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
*** Failers
\
.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
*** Failers
a rather long string that doesn't end with one of them
/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
word cat dog elephant mussel cow horse canary baboon snake shark otherword
word cat dog elephant mussel cow horse canary baboon snake shark
/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
/(?<=\d{3}(?!999))foo/
999foo
123999foo
*** Failers
123abcfoo
/(?<=(?!...999)\d{3})foo/
999foo
123999foo
*** Failers
123abcfoo
/(?<=\d{3}(?!999)...)foo/
123abcfoo
123456foo
*** Failers
123999foo
/(?<=\d{3}...)(?<!999)foo/
123abcfoo
123456foo
*** Failers
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
/^[\d-a]/
abcde
-things
0digit
*** Failers
bcdef
/[[:space:]]+/
> \x09\x0a\x0c\x0d\x0b<
/[[:blank:]]+/
> \x09\x0a\x0c\x0d\x0b<
/[\s]+/
> \x09\x0a\x0c\x0d\x0b<
/\s+/
> \x09\x0a\x0c\x0d\x0b<
/a b/x
ab
/(?!\A)x/m
a\nxb\n
/(?!^)x/m
a\nxb\n
/abc\Qabc\Eabc/
abcabcabc
/abc\Q(*+|\Eabc/
abc(*+|abc
/ abc\Q abc\Eabc/x
abc abcabc
*** Failers
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
*** Failers
xyzabc
/\Gabc./g
abc1abc2xyzabc3
/abc./g
abc1abc2xyzabc3
/a(?x: b c )d/
XabcdY
*** Failers
Xa b c d Y
/((?x)x y z | a b c)/
XabcY
AxyzB
/(?i)AB(?-i)C/
XabCY
*** Failers
XabcY
/((?i)AB(?-i)C|D)E/
abCE
DE
*** Failers
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
*** Failers
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
]
*** Failers
b
/(a+)*b/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/(?i)reg(?:ul(?:[a<>]|ae)r|ex)/
REGular
regulaer
Regex
regul<75>r
/<2F><><EFBFBD><EFBFBD>[<5B>-<2D><>-<2D>]+/
<20><><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD>
/(?<=Z)X./
\x84XAZXB
/ab cd (?x) de fg/
ab cd defg
/ab cd(?x) de fg/
ab cddefg
** Failers
abcddefg
/(?<![^f]oo)(bar)/
foobarX
** Failers
boobarX
/(?<![^f])X/
offX
** Failers
onyX
/(?<=[^f])X/
onyX
** Failers
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
** Failers
#
"(?x-is)(?:(?-ixs) \s*#\s*) include"
A #include
** Failers
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
** Failers
E
/^[a-\Ec]/
b
** Failers
-
E
/^[a\E\E-\Ec]/
b
** Failers
-
E
/^[\E\Qa\E-\Qz\E]+/
b
** Failers
-
/^[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/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
/(?>a|)*\d/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
/(?:a|)*\d/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
/\Z/g
abc\n
/^(?s)(?>.*)(?<!\n)/
abc
abc\n
/^(?![^\n]*\n\z)/
abc
abc\n
/\z(?<!\n)/
abc
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]/
fooabcfoo
/(?(?=.*b)b|^)/
adc
abc
/(?(?=^.*b)b|^)/
adc
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
** Failers
XABX
/[\x00-\xff\s]+/
\x0a\x0b\x0c\x0d
/(abc)\1/i
abc
/(abc)\1/
abc
/[^a]*/i
12abc
12ABC
/[^a]*+/i
12abc
12ABC
/[^a]*?X/i
** Failers
12abc
12ABC
/[^a]+?X/i
** Failers
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/
aabc
/(?>a+|ab)+c/
aabc
/(?:a+|ab)+c/
aabc
/(?(?=(a))a)/
a
/(?(?=(a))a)(b)/
ab
/^(?:a|ab)++c/
aaaabc
/^(?>a|ab)++c/
aaaabc
/^(?:a|ab)+c/
aaaabc
/(?=abc){3}abc/aftertext
abcabcabc
** Failers
xyz
/(?=abc)+abc/aftertext
abcabcabc
** Failers
xyz
/(?=abc)++abc/aftertext
abcabcabc
** Failers
xyz
/(?=abc){0}xyz/
xyz
/(?=abc){1}xyz/
** Failers
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>>>
** Failers
\\ga
/^[\ga]+/
gggagagaxyz
/^[:a[:digit:]]+/
aaaa444:::Z
/^[:a[:digit:]:b]+/
aaaa444:::bbbZ
/[:a]xxx[b:]/
:xxx:
/(?<=a{2})b/i
xaabc
** Failers
xabc
/(?<!a{2})b/i
xabc
** Failers
xaabc
/(?<=a\h)c/
xa c
/(?<=[^a]{2})b/
axxbc
aAAbc
** Failers
xaabc
/(?<=[^a]{2})b/i
axxbc
** Failers
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
** Failers
aaaaaa
aaaaaaaaa
/^(a{2,3})++a/
** Failers
aaaaaa
/^(a{2,3})*+a/
** Failers
aaaaaa
/ab\Cde/
abXde
/(?<=ab\Cde)X/
abZdeX
/\H\h\V\v/
X X\x0a
X\x09X\x0b
** Failers
\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
** Failers
\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
** Failers
>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
** Failers
defabcxyz
/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/
ababababbbabZXXXX
/(?<A>tom|bon)-\g{A}/
tom-tom
bon-bon
/(^(a|b\g{-1}))/
bacxxx
/(?|(abc)|(xyz))\1/
abcabc
xyzxyz
** Failers
abcxyz
xyzabc
/(?|(abc)|(xyz))(?1)/
abcabc
xyzabc
** Failers
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
** Failers
a:axyz
ab:abxyz
/(?'abc'\w+):\g{abc}{2}/
a:aaxyz
ab:ababxyz
** Failers
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
** Failers
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
** Failers
10.6
455.3.4.5
/^(\w++|\s++)*$/
now is the time for all good men to come to the aid of the party
*** Failers
this is not a line with only words and spaces!
/(\d++)(\w)/
12345a
*** Failers
12345+
/a++b/
aaab
/(a++b)/
aaab
/(a++)b/
aaab
/([^()]++|\([^()]*\))+/
((abc(ade)ufh()()x
/\(([^()]++|\([^()]+\))+\)/
(abc)
(abc(def)xyz)
*** Failers
((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/^([^()]|\((?1)*\))*$/
abc
a(b)c
a(b(c))d
*** Failers)
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
*** Failers
Thequickbrownfox
/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
12
(((2+2)*-3)-7)
-12
*** Failers
((2+2)*-3)-7)
/^(x(y|(?1){2})z)/
xyz
xxyzxyzz
*** Failers
xxyzz
xxyzxyzxyzz
/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/x
<>
<abcd>
<abc <123> hij>
<abc <def> hij>
<abc<>def>
<abc<>
*** Failers
<abc
/^a+(*FAIL)/
aaaaaa
/a+b?c+(*FAIL)/
aaabccc
/a+b?(*PRUNE)c+(*FAIL)/
aaabccc
/a+b?(*COMMIT)c+(*FAIL)/
aaabccc
/a+b?(*SKIP)c+(*FAIL)/
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)/
aaabccc
/(A (A|B(*ACCEPT)|C) D)(E)/x
AB
ABX
AADE
ACDE
** Failers
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.
*** Failers
The quick brown fox
/^((.)(?1)\2|.)$/
a
aba
aabaa
abcdcba
pqaabaaqp
ablewasiereisawelba
rhubarb
the quick brown fox
/(a)(?<=b(?1))/
baz
** Failers
caz
/(?<=b(?1))(a)/
zbaaz
** Failers
aaa
/(?<X>a)(?<=b(?&X))/
baz
/^(?|(abc)|(def))\1/
abcabc
defdef
** Failers
abcdef
defabc
/^(?|(abc)|(def))(?1)/
abcabc
defabc
** Failers
defdef
abcdef
/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/x,dupnames
a\"aaaaa
b\"aaaaa
** Failers
b\"11111
/(?:(?1)|B)(A(*F)|C)/
ABCD
CCD
** Failers
CAD
/^(?:(?1)|B)(A(*F)|C)/
CCD
BCD
** Failers
ABCD
CAD
BAD
/(?:(?1)|B)(A(*ACCEPT)XX|C)D/
AAD
ACD
BAD
BCD
BAX
** Failers
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)/
** Failers
ac
/^(?=a(*PRUNE)b)/
ab
** Failers
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)/
ACABX
# Check the use of names for failure
/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
** Failers
AC
CB
/(*MARK:A)(*SKIP:B)(C|X)/mark
C
D
/^(A(*THEN:A)B|C(*THEN:B)D)/mark
** Failers
CB
/^(?:A(*THEN:A)B|C(*THEN:B)D)/mark
CB
/^(?>A(*THEN:A)B|C(*THEN:B)D)/mark
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
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
** Failers
DEFGABC
# COMMIT inside an atomic group can't stop backtracking over the group.
/(\w+)(?>b(*COMMIT))\w{2}/
abbb
/(\w+)b(*COMMIT)\w{2}/
abbb
# Check opening parens in comment when seeking forward reference.
/(?&t)(?#()(?(DEFINE)(?<t>a))/
bac
# COMMIT should override THEN.
/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/
yes
/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/
yes
/b?(*SKIP)c/
bc
abc
/(*SKIP)bc/
a
/(*SKIP)b/
a
/(?P<abn>(?P=abn)xxx|)+/
xxx
/(?i:([^b]))(?1)/
aa
aA
** Failers
ab
aB
Ba
ba
/^(?&t)*+(?(DEFINE)(?<t>a))\w$/
aaaaaaX
** Failers
aaaaaa
/^(?&t)*(?(DEFINE)(?<t>a))\w$/
aaaaaaX
aaaaaa
/^(a)*+(\w)/
aaaaX
YZ
** Failers
aaaa
/^(?:a)*+(\w)/
aaaaX
YZ
** Failers
aaaa
/^(a)++(\w)/
aaaaX
** Failers
aaaa
YZ
/^(?:a)++(\w)/
aaaaX
** Failers
aaaa
YZ
/^(a)?+(\w)/
aaaaX
YZ
/^(?:a)?+(\w)/
aaaaX
YZ
/^(a){2,}+(\w)/
aaaaX
** Failers
aaa
YZ
/^(?:a){2,}+(\w)/
aaaaX
** Failers
aaa
YZ
/(a|)*(?1)b/
b
ab
aab
/(a)++(?1)b/
** Failers
ab
aab
/(a)*+(?1)b/
** Failers
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/
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
/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
aabc
/^.*? (a(*THEN)b|(*F)) c/x
aabc
/^.*? ( (a(*THEN)b) | (*F) ) c/x
aabc
/^.*? ( (a(*THEN)b) ) c/x
aabc
# Non-capture
/^.*? (?:a(*THEN)b) c/x
aabc
/^.*? (?:a(*THEN)b|(*F)) c/x
aabc
/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x
aabc
/^.*? (?: (?:a(*THEN)b) ) c/x
aabc
# Atomic
/^.*? (?>a(*THEN)b) c/x
aabc
/^.*? (?>a(*THEN)b|(*F)) c/x
aabc
/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x
aabc
/^.*? (?> (?>a(*THEN)b) ) c/x
aabc
# Possessive capture
/^.*? (a(*THEN)b)++ c/x
aabc
/^.*? (a(*THEN)b|(*F))++ c/x
aabc
/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x
aabc
/^.*? ( (a(*THEN)b)++ )++ c/x
aabc
# Possessive non-capture
/^.*? (?:a(*THEN)b)++ c/x
aabc
/^.*? (?:a(*THEN)b|(*F))++ c/x
aabc
/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x
aabc
/^.*? (?: (?:a(*THEN)b)++ )++ c/x
aabc
# Condition assertion
/^(?(?=a(*THEN)b)ab|ac)/
ac
# Condition
/^.*?(?(?=a)a|b(*THEN)c)/
ba
/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/
ba
/^.*?(?(?=a)a(*THEN)b|c)/
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
** Failers
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
D
/(*MARK:A)(*PRUNE:B)(C|X)/mark
C
D
/(*MARK:A)(*THEN:B)(C|X)/mark
C
D
/(*MARK:A)(*THEN:B)(C|X)/mark,no_start_optimize
C
D
/(*MARK:A)(*THEN:B)(C|X)/mark
C
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
AAAC
# Same
/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/x,mark
AAAC
/A(*:A)A+(*SKIP)(B|Z) | AC/x,mark
AAAC
# This should fail, as a null name is the same as no name.
/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/x,mark
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
** Failers
XAQQ
XAQQXZZ
AXQQQ
AXXQQQ
/^(A(*THEN:A)B|C(*THEN:B)D)/mark
AB
CD
** Failers
AC
CB
/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
AB
CD
** Failers
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
** Failers
abc
/b(*:m)f|aw/mark
abaw
** Failers
abc
abax
/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/x,mark
AAAC
/a(*PRUNE:X)bc|qq/mark,no_start_optimize
** Failers
axy
/a(*THEN:X)bc|qq/mark,no_start_optimize
** Failers
axy
/(?=a(*MARK:A)b)..x/mark
abxy
** Failers
abpq
/(?=a(*MARK:A)b)..(*:Y)x/mark
abxy
** Failers
abpq
/(?=a(*PRUNE:A)b)..x/mark
abxy
** Failers
abpq
/(?=a(*PRUNE:A)b)..(*:Y)x/mark
abxy
** Failers
abpq
/(?=a(*THEN:A)b)..x/mark
abxy
** Failers
abpq
/(?=a(*THEN:A)b)..(*:Y)x/mark
abxy
** Failers
abpq
/(another)?(\1?)test/
hello world test
/(another)?(\1+)test/
hello world test
/(a(*COMMIT)b){0}a(?1)|aac/
aac
/((?:a?)*)*c/
aac
/((?>a?)*)*c/
aac
/(?>.*?a)(?<=ba)/
aba
/(?:.*?a)(?<=ba)/
aba
/.*?a(*PRUNE)b/
aab
/.*?a(*PRUNE)b/s
aab
/^a(*PRUNE)b/s
aab
/.*?a(*SKIP)b/
aab
/(?>.*?a)b/s
aab
/(?>.*?a)b/
aab
/(?>^a)b/s
aab
/(?>.*?)(?<=(abcd)|(wxyz))/
alphabetabcd
endingwxyz
/(?>.*)(?<=(abcd)|(wxyz))/
alphabetabcd
endingwxyz
"(?>.*)foo"
abcdfooxyz
"(?>.*?)foo"
abcdfooxyz
/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/
ac
/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/
ac
/(?<=(*SKIP)ac)a/
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/
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
abd
/(?=a(*COMMIT)b)abc|abd/
abc
abd
/(?>a(*COMMIT)b)c|abd/
abc
abd
/a(?=b(*COMMIT)c)[^d]|abd/
abd
abc
/a(?=bc).|abd/
abd
abc
/a(?>b(*COMMIT)c)d|abd/
abceabd
/a(?>bc)d|abd/
abceabd
/(?>a(*COMMIT)b)c|abd/
abd
/(?>a(*COMMIT)c)d|abd/
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)+$/
*** Failers
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
AAAC
/^((abc|abcx)(*THEN)y|abcd)/
abcd
*** Failers
abcxy
/^((yes|no)(*THEN)(*F))?/
yes
/(A (.*) C? (*THEN) | A D) (*FAIL)/x
AbcdCBefgBhiBqz
/(A (.*) C? (*THEN) | A D) z/x
AbcdCBefgBhiBqz
/(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x
AbcdCBefgBhiBqz
/(A (.*) C? (*THEN) | A D) \s* z/x
AbcdCBefgBhiBqz
/(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x
AbcdCBefgBhiBqz
/(A (.*) (?:C|) (*THEN) | A D) z/x
AbcdCBefgBhiBqz
/(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x
AbcdCBefgBhiBqz
/(A (.*) C{0,6} (*THEN) | A D) z/x
AbcdCBefgBhiBqz
/(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x
AbcdCEBefgBhiBqz
/(A (.*) (CE){0,6} (*THEN) | A D) z/x
AbcdCEBefgBhiBqz
/(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x
AbcdCBefgBhiBqz
/(A (.*) (CE*){0,6} (*THEN) | A D) z/x
AbcdCBefgBhiBqz
/(?=a(*COMMIT)b|ac)ac|ac/
ac
/(?=a(*COMMIT)b|(ac)) ac | (a)c/x
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/
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
123
/^[^b]*\w{4}/
aaaa
aaa
/^[^b]*\w{4}/i
aaaa
aaa
/^a*\w{4}/
aaaa
aaa
/^a*\w{4}/i
aaaa
aaa
/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
foofoo
barbar
/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
AfooA
AbarA
** Failers
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/
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
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
# End of testinput1