github的一些开源项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

6114 lines
104 KiB

# This set of tests is not Perl-compatible. It checks on special features
# of PCRE2's API, error diagnostics, and the compiled code of some patterns.
# It also checks the non-Perl syntax that PCRE2 supports (Python, .NET,
# Oniguruma). There are also some tests where PCRE2 and Perl differ,
# either because PCRE2 can't be compatible, or there is a possible Perl
# bug.
# NOTE: This is a non-UTF set of tests. When UTF support is needed, use
# test 5.
#forbid_utf
#newline_default lf any anycrlf
# Test binary zeroes in the pattern
# /a\0B/ where 0 is a binary zero
/61 5c 00 62/B,hex
a\x{0}b
# /a0b/ where 0 is a binary zero
/61 00 62/B,hex
a\x{0}b
# /(?#B0C)DE/ where 0 is a binary zero
/28 3f 23 42 00 43 29 44 45/B,hex
DE
/(a)b|/I
/abc/I
abc
defabc
abc\=anchored
\= Expect no match
defabc\=anchored
ABC
/^abc/I
abc
abc\=anchored
\= Expect no match
defabc
defabc\=anchored
/a+bc/I
/a*bc/I
/a{3}bc/I
/(abc|a+z)/I
/^abc$/I
abc
\= Expect no match
def\nabc
/ab\idef/
/(?X)ab\idef/
/x{5,4}/
/z{65536}/
/[abcd/
/[\B]/B
/[\R]/B
/[\X]/B
/[z-a]/
/^*/
/(abc/
/(?# abc/
/(?z)abc/
/.*b/I
/.*?b/I
/cat|dog|elephant/I
this sentence eventually mentions a cat
this sentences rambles on and on for a while and then reaches elephant
/cat|dog|elephant/I
this sentence eventually mentions a cat
this sentences rambles on and on for a while and then reaches elephant
/cat|dog|elephant/Ii
this sentence eventually mentions a CAT cat
this sentences rambles on and on for a while to elephant ElePhant
/a|[bcd]/I
/(a|[^\dZ])/I
/(a|b)*[\s]/I
/(ab\2)/
/{4,5}abc/
/(a)(b)(c)\2/I
abcb
abcb\=ovector=0
abcb\=ovector=1
abcb\=ovector=2
abcb\=ovector=3
abcb\=ovector=4
/(a)bc|(a)(b)\2/I
abc
abc\=ovector=0
abc\=ovector=1
abc\=ovector=2
aba
aba\=ovector=0
aba\=ovector=1
aba\=ovector=2
aba\=ovector=3
aba\=ovector=4
/abc$/I,dollar_endonly
abc
\= Expect no match
abc\n
abc\ndef
/(a)(b)(c)(d)(e)\6/
/the quick brown fox/I
the quick brown fox
this is a line with the quick brown fox
/the quick brown fox/I,anchored
the quick brown fox
\= Expect no match
this is a line with the quick brown fox
/ab(?z)cd/
/^abc|def/I
abcdef
abcdef\=notbol
/.*((abc)$|(def))/I
defabc
defabc\=noteol
/)/
/a[]b/
/[^aeiou ]{3,}/I
co-processors, and for
/<.*>/I
abc<def>ghi<klm>nop
/<.*?>/I
abc<def>ghi<klm>nop
/<.*>/I,ungreedy
abc<def>ghi<klm>nop
/(?U)<.*>/I
abc<def>ghi<klm>nop
/<.*?>/I,ungreedy
abc<def>ghi<klm>nop
/={3,}/I,ungreedy
abc========def
/(?U)={3,}?/I
abc========def
/(?<!bar|cattle)foo/I
foo
catfoo
\= Expect no match
the barfoo
and cattlefoo
/abc(?<=a+)b/
/(?<!(foo)a\1)bar/
/(?i)abc/I
/(a|(?m)a)/I
/(?i)^1234/I
/(^b|(?i)^d)/I
/(?s).*/I
/[abcd]/I
/(?i)[abcd]/I
/(?m)[xy]|(b|c)/I
/(^a|^b)/Im
/(?i)(^a|^b)/Im
/(a)(?(1)a|b|c)/
/(?(?=a)a|b|c)/
/(?(1a)/
/(?(1a))/
/(?(?i))/
/(?(abc))/
/(?(?<ab))/
/((?s)blah)\s+\1/I
/((?i)blah)\s+\1/I
/((?i)b)/IB
/(a*b|(?i:c*(?-i)d))/I
/a$/I
a
a\n
\= Expect no match
a\=noteol
a\n\=noteol
/a$/Im
a
a\n
a\n\=noteol
\= Expect no match
a\=noteol
/\Aabc/Im
/^abc/Im
/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/I
aaaaabbbbbcccccdef
/(?<=foo)[ab]/I
/(?<!foo)(alpha|omega)/I
/(?!alphabet)[ab]/I
/(?<=foo\n)^bar/Im
foo\nbarbar
\= Expect no match
rhubarb
barbell
abc\nbarton
/^(?<=foo\n)bar/Im
foo\nbarbar
\= Expect no match
rhubarb
barbell
abc\nbarton
/(?>^abc)/Im
abc
def\nabc
\= Expect no match
defabc
/(?<=ab(c+)d)ef/
/(?<=ab(?<=c+)d)ef/
/The next three are in testinput2 because they have variable length branches/
/(?<=bullock|donkey)-cart/I
the bullock-cart
a donkey-cart race
\= Expect no match
cart
horse-and-cart
/(?<=ab(?i)x|y|z)/I
/(?>.*)(?<=(abcd)|(xyz))/I
alphabetabcd
endingxyz
/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I
abxyZZ
abXyZZ
ZZZ
zZZ
bZZ
BZZ
\= Expect no match
ZZ
abXYZZ
zzz
bzz
/(?<!(foo)a)bar/I
bar
foobbar
\= Expect no match
fooabar
# Perl does not fail these two for the final subjects.
/^(xa|=?\1a){2}$/
xa=xaa
\= Expect no match
xa=xaaa
/^(xa|=?\1a)+$/
xa=xaa
\= Expect no match
xa=xaaa
# These are syntax tests from Perl 5.005
/a[b-a]/
/a[]b/
/a[/
/*a/
/(*)b/
/abc)/
/(abc/
/a**/
/)(/
/\1/
/\2/
/(a)|\2/
/a[b-a]/Ii
/a[]b/Ii
/a[/Ii
/*a/Ii
/(*)b/Ii
/abc)/Ii
/(abc/Ii
/a**/Ii
/)(/Ii
/:(?:/
/(?<%)b/
/a(?{)b/
/a(?{{})b/
/a(?{}})b/
/a(?{"{"})b/
/a(?{"{"}})b/
/(?(1?)a|b)/
/[a[:xyz:/
/(?<=x+)y/
/a{37,17}/
/abc/\
/abc/\i
/(a)bc(d)/I
abcd
abcd\=copy=2
abcd\=copy=5
/(.{20})/I
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz\=copy=1
abcdefghijklmnopqrstuvwxyz\=get=1
/(.{15})/I
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz\=copy=1,get=1
/(.{16})/I
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz\=copy=1,get=1,getall
/^(a|(bc))de(f)/I
adef\=get=1,get=2,get=3,get=4,getall
bcdef\=get=1,get=2,get=3,get=4,getall
adefghijk\=copy=0
/^abc\00def/I
abc\00def\=copy=0,getall
/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+
)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+
)?)?)?)?)?)?)?)?)?otherword/I
/.*X/IB
/.*X/IBs
/(.*X|^B)/IB
/(.*X|^B)/IBs
/(?s)(.*X|^B)/IB
/(?s:.*X|^B)/IB
/\Biss\B/I,aftertext
Mississippi
/iss/I,aftertext,altglobal
Mississippi
/\Biss\B/I,aftertext,altglobal
Mississippi
/\Biss\B/Ig,aftertext
Mississippi
\= Expect no match
Mississippi\=anchored
/(?<=[Ms])iss/Ig,aftertext
Mississippi
/(?<=[Ms])iss/I,aftertext,altglobal
Mississippi
/^iss/Ig,aftertext
ississippi
/.*iss/Ig,aftertext
abciss\nxyzisspqr
/.i./Ig,aftertext
Mississippi
Mississippi\=anchored
Missouri river
Missouri river\=anchored
/^.is/Ig,aftertext
Mississippi
/^ab\n/Ig,aftertext
ab\nab\ncd
/^ab\n/Igm,aftertext
ab\nab\ncd
/^/gm,newline=any
a\rb\nc\r\nxyz\=aftertext
/abc/I
/abc|bac/I
/(abc|bac)/I
/(abc|(c|dc))/I
/(abc|(d|de)c)/I
/a*/I
/a+/I
/(baa|a+)/I
/a{0,3}/I
/baa{3,}/I
/"([^\\"]+|\\.)*"/I
/(abc|ab[cd])/I
/(a|.)/I
/a|ba|\w/I
/abc(?=pqr)/I
/...(?<=abc)/I
/abc(?!pqr)/I
/ab./I
/ab[xyz]/I
/abc*/I
/ab.c*/I
/a.c*/I
/.c*/I
/ac*/I
/(a.c*|b.c*)/I
/a.c*|aba/I
/.+a/I
/(?=abcda)a.*/I
/(?=a)a.*/I
/a(b)*/I
/a\d*/I
/ab\d*/I
/a(\d)*/I
/abcde{0,0}/I
/ab\d+/I
/a(?(1)b)(.)/I
/a(?(1)bag|big)(.)/I
/a(?(1)bag|big)*(.)/I
/a(?(1)bag|big)+(.)/I
/a(?(1)b..|b..)(.)/I
/ab\d{0}e/I
/a?b?/I
a
b
ab
\
\= Expect no match
\=notempty
/|-/I
abcd
-abc
ab-c\=notempty
\= Expect no match
abc\=notempty
/^.?abcd/I
/\( # ( at start
(?: # Non-capturing bracket
(?>[^()]+) # Either a sequence of non-brackets (no backtracking)
| # Or
(?R) # Recurse - i.e. nested bracketed string
)* # Zero or more contents
\) # Closing )
/Ix
(abcd)
(abcd)xyz
xyz(abcd)
(ab(xy)cd)pqr
(ab(xycd)pqr
() abc ()
12(abcde(fsh)xyz(foo(bar))lmno)89
\= Expect no match
abcd
abcd)
(abcd
/\( ( (?>[^()]+) | (?R) )* \) /Igx
(ab(xy)cd)pqr
1(abcd)(x(y)z)pqr
/\( (?: (?>[^()]+) | (?R) ) \) /Ix
(abcd)
(ab(xy)cd)
(a(b(c)d)e)
((ab))
\= Expect no match
()
/\( (?: (?>[^()]+) | (?R) )? \) /Ix
()
12(abcde(fsh)xyz(foo(bar))lmno)89
/\( ( (?>[^()]+) | (?R) )* \) /Ix
(ab(xy)cd)
/\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix
(ab(xy)cd)
/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix
(ab(xy)cd)
(123ab(xy)cd)
/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix
(ab(xy)cd)
(123ab(xy)cd)
/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix
(ab(xy)cd)
/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix
(abcd(xyz<p>qrs)123)
/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix
(ab(cd)ef)
(ab(cd(ef)gh)ij)
/^[[:alnum:]]/IB
/^[[:^alnum:]]/IB
/^[[:alpha:]]/IB
/^[[:^alpha:]]/IB
/[_[:alpha:]]/I
/^[[:ascii:]]/IB
/^[[:^ascii:]]/IB
/^[[:blank:]]/IB
/^[[:^blank:]]/IB
/[\n\x0b\x0c\x0d[:blank:]]/I
/^[[:cntrl:]]/IB
/^[[:digit:]]/IB
/^[[:graph:]]/IB
/^[[:lower:]]/IB
/^[[:print:]]/IB
/^[[:punct:]]/IB
/^[[:space:]]/IB
/^[[:upper:]]/IB
/^[[:xdigit:]]/IB
/^[[:word:]]/IB
/^[[:^cntrl:]]/IB
/^[12[:^digit:]]/IB
/^[[:^blank:]]/IB
/[01[:alpha:]%]/IB
/[[.ch.]]/I
/[[=ch=]]/I
/[[:rhubarb:]]/I
/[[:upper:]]/Ii
A
a
/[[:lower:]]/Ii
A
a
/((?-i)[[:lower:]])[[:lower:]]/Ii
ab
aB
\= Expect no match
Ab
AB
/[\200-\110]/I
/^(?(0)f|b)oo/I
# This one's here because of the large output vector needed
/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/I
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC\=ovector=300
# This one's here because Perl does this differently and PCRE2 can't at present
/(main(O)?)+/I
mainmain
mainOmain
# These are all cases where Perl does it differently (nested captures)
/^(a(b)?)+$/I
aba
/^(aa(bb)?)+$/I
aabbaa
/^(aa|aa(bb))+$/I
aabbaa
/^(aa(bb)??)+$/I
aabbaa
/^(?:aa(bb)?)+$/I
aabbaa
/^(aa(b(b))?)+$/I
aabbaa
/^(?:aa(b(b))?)+$/I
aabbaa
/^(?:aa(b(?:b))?)+$/I
aabbaa
/^(?:aa(bb(?:b))?)+$/I
aabbbaa
/^(?:aa(b(?:bb))?)+$/I
aabbbaa
/^(?:aa(?:b(b))?)+$/I
aabbaa
/^(?:aa(?:b(bb))?)+$/I
aabbbaa
/^(aa(b(bb))?)+$/I
aabbbaa
/^(aa(bb(bb))?)+$/I
aabbbbaa
# ----------------
/#/IBx
/a#/IBx
/[\s]/IB
/[\S]/IB
/a(?i)b/IB
ab
aB
\= Expect no match
AB
/(a(?i)b)/IB
ab
aB
\= Expect no match
AB
/ (?i)abc/IBx
/#this is a comment
(?i)abc/IBx
/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/IB
/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/IB
/\Q\E/IB
\
/\Q\Ex/IB
/ \Q\E/IB
/a\Q\E/IB
abc
bca
bac
/a\Q\Eb/IB
abc
/\Q\Eabc/IB
/x*+\w/IB
\= Expect no match
xxxxx
/x?+/IB
/x++/IB
/x{1,3}+/B,no_auto_possess
/x{1,3}+/Bi,no_auto_possess
/[^x]{1,3}+/B,no_auto_possess
/[^x]{1,3}+/Bi,no_auto_possess
/(x)*+/IB
/^(\w++|\s++)*$/I
now is the time for all good men to come to the aid of the party
\= Expect no match
this is not a line with only words and spaces!
/(\d++)(\w)/I
12345a
\= Expect no match
12345+
/a++b/I
aaab
/(a++b)/I
aaab
/(a++)b/I
aaab
/([^()]++|\([^()]*\))+/I
((abc(ade)ufh()()x
/\(([^()]++|\([^()]+\))+\)/I
(abc)
(abc(def)xyz)
\= Expect no match
((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/(abc){1,3}+/IB
/a+?+/I
/a{2,3}?+b/I
/(?U)a+?+/I
/a{2,3}?+b/I,ungreedy
/x(?U)a++b/IB
xaaaab
/(?U)xa++b/IB
xaaaab
/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/IB
/^x(?U)a+b/IB
/^x(?U)(a+)b/IB
/[.x.]/I
/[=x=]/I
/[:x:]/I
/\F/I
/\l/I
/\L/I
/\N{name}/I
/\u/I
/\U/I
/\N{4}/
abcdefg
/\N{,}/
/\N{25,ab}/
/a{1,3}b/ungreedy
ab
/[/I
/[a-/I
/[[:space:]/I
/[\s]/IB
/[[:space:]]/IB
/[[:space:]abcde]/IB
/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/Ix
<>
<abcd>
<abc <123> hij>
<abc <def> hij>
<abc<>def>
<abc<>
\= Expect no match
<abc
/8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b/IB
/\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b/IB
/(.*)\d+\1/I
/(.*)\d+/I
/(.*)\d+\1/Is
/(.*)\d+/Is
/(.*(xyz))\d+\2/I
/((.*))\d+\1/I
abc123bc
/a[b]/I
/(?=a).*/I
/(?=abc).xyz/Ii
/(?=abc)(?i).xyz/I
/(?=a)(?=b)/I
/(?=.)a/I
/((?=abcda)a)/I
/((?=abcda)ab)/I
/()a/I
/(?:(?=.)|(?<!x))a/I
/(?(1)ab|ac)(.)/I
/(?(1)abz|acz)(.)/I
/(?(1)abz)(.)/I
/(?(1)abz)(1)23/I
/(a)+/I
/(a){2,3}/I
/(a)*/I
/[a]/I
/[ab]/I
/[ab]/I
/[^a]/I
/\d456/I
/\d456/I
/a^b/I
/^a/Im
abcde
xy\nabc
\= Expect no match
xyabc
/c|abc/I
/(?i)[ab]/I
/[ab](?i)cd/I
/abc(?C)def/I
abcdef
1234abcdef
\= Expect no match
abcxyz
abcxyzf
/abc(?C)de(?C1)f/I
123abcdef
/(?C1)\dabc(?C2)def/I
1234abcdef
\= Expect no match
abcdef
/(?C1)\dabc(?C2)def/I
1234abcdef
\= Expect no match
abcdef
/(?C255)ab/I
/(?C256)ab/I
/(?Cab)xx/I
/(?C12vr)x/I
/abc(?C)def/I
\x83\x0\x61bcdef
/(abc)(?C)de(?C1)f/I
123abcdef
123abcdef\=callout_capture
123abcdefC-\=callout_none
\= Expect no match
123abcdef\=callout_fail=1
/(?C0)(abc(?C1))*/I
abcabcabc
abcabc\=callout_fail=1:4
abcabcabc\=callout_fail=1:4
/(\d{3}(?C))*/I
123\=callout_capture
123456\=callout_capture
123456789\=callout_capture
/((xyz)(?C)p|(?C1)xyzabc)/I
xyzabc\=callout_capture
/(X)((xyz)(?C)p|(?C1)xyzabc)/I
Xxyzabc\=callout_capture
/(?=(abc))(?C)abcdef/I
abcdef\=callout_capture
/(?!(abc)(?C1)d)(?C2)abcxyz/I
abcxyz\=callout_capture
/(?<=(abc)(?C))xyz/I
abcxyz\=callout_capture
/a(b+)(c*)(?C1)/I
\= Expect no match
abbbbbccc\=callout_data=1
/a(b+?)(c*?)(?C1)/I
\= Expect no match
abbbbbccc\=callout_data=1
/(?C)abc/I
/(?C)^abc/I
/(?C)a|b/I
/a|(b)(?C)/I
b
/x(ab|(bc|(de|(?R))))/I
xab
xbc
xde
xxab
xxxab
\= Expect no match
xyab
/^([^()]|\((?1)*\))*$/I
abc
a(b)c
a(b(c))d
\= Expect no match)
a(b(c)d
/^>abc>([^()]|\((?1)*\))*<xyz<$/I
>abc>123<xyz<
>abc>1(2)3<xyz<
>abc>(1(2)3)<xyz<
/(a(?1)b)/IB
/(a(?1)+b)/IB
/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/I
12
(((2+2)*-3)-7)
-12
\= Expect no match
((2+2)*-3)-7)
/^(x(y|(?1){2})z)/I
xyz
xxyzxyzz
\= Expect no match
xxyzz
xxyzxyzxyzz
/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/Ix
<>
<abcd>
<abc <123> hij>
<abc <def> hij>
<abc<>def>
<abc<>
\= Expect no match
<abc
/(?1)/I
/((?2)(abc)/I
/^(abc)def(?1)/I
abcdefabc
/^(a|b|c)=(?1)+/I
a=a
a=b
a=bc
/^(a|b|c)=((?1))+/I
a=a
a=b
a=bc
/a(?P<name1>b|c)d(?P<longername2>e)/IB
abde
acde
/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/IB
/(?P<a>a)...(?P=a)bbb(?P>a)d/IB
/^\W*(?:(?P<one>(?P<two>.)\W*(?P>one)\W*(?P=two)|)|(?P<three>(?P<four>.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/Ii
1221
Satan, oscillate my metallic sonatas!
A man, a plan, a canal: Panama!
Able was I ere I saw Elba.
\= Expect no match
The quick brown fox
/((?(R)a|b))\1(?1)?/I
bb
bbaa
/(.*)a/Is
/(.*)a\1/Is
/(.*)a(b)\2/Is
/((.*)a|(.*)b)z/Is
/((.*)a|(.*)b)z\1/Is
/((.*)a|(.*)b)z\2/Is
/((.*)a|(.*)b)z\3/Is
/((.*)a|^(.*)b)z\3/Is
/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is
/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is
/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is
/(a)(bc)/IB,no_auto_capture
abc
/(?P<one>a)(bc)/IB,no_auto_capture
abc
/(a)(?P<named>bc)/IB,no_auto_capture
/(aaa(?C1)bbb|ab)/I
aaabbb
aaabbb\=callout_data=0
aaabbb\=callout_data=1
\= Expect no match
aaabbb\=callout_data=-1
/ab(?P<one>cd)ef(?P<two>gh)/I
abcdefgh
abcdefgh\=copy=1,get=two
abcdefgh\=copy=one,copy=two
abcdefgh\=copy=three
/(?P<Tes>)(?P<Test>)/IB
/(?P<Test>)(?P<Tes>)/IB
/(?P<Z>zz)(?P<A>aa)/I
zzaa\=copy=Z
zzaa\=copy=A
/(?P<x>eks)(?P<x>eccs)/I
/(?P<abc>abc(?P<def>def)(?P<abc>xyz))/I
"\[((?P<elem>\d+)(,(?P>elem))*)\]"I
[10,20,30,5,5,4,4,2,43,23,4234]
\= Expect no match
[]
"\[((?P<elem>\d+)(,(?P>elem))*)?\]"I
[10,20,30,5,5,4,4,2,43,23,4234]
[]
/(a(b(?2)c))?/IB
/(a(b(?2)c))*/IB
/(a(b(?2)c)){0,2}/IB
/[ab]{1}+/B
/()(?1){1}/B
/()(?1)/B
/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii
Baby Bjorn Active Carrier - With free SHIPPING!!
/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii
Baby Bjorn Active Carrier - With free SHIPPING!!
/a*.*b/IB
/(a|b)*.?c/IB
/abc(?C255)de(?C)f/IB
/abcde/IB,auto_callout
abcde
\= Expect no match
abcdfe
/a*b/IB,auto_callout
ab
aaaab
aaaacb
/a*b/IB,auto_callout
ab
aaaab
aaaacb
/a+b/IB,auto_callout
ab
aaaab
\= Expect no match
aaaacb
/(abc|def)x/IB,auto_callout
abcx
defx
\= Expect no match
abcdefzx
/(abc|def)x/IB,auto_callout
abcx
defx
\= Expect no match
abcdefzx
/(ab|cd){3,4}/I,auto_callout
ababab
abcdabcd
abcdcdcdcdcd
/([ab]{,}c|xy)/IB,auto_callout
\= Expect no match
Note: that {,} does NOT introduce a quantifier
/([ab]{,}c|xy)/IB,auto_callout
\= Expect no match
Note: that {,} does NOT introduce a quantifier
/([ab]{1,4}c|xy){4,5}?123/IB,auto_callout
aacaacaacaacaac123
/\b.*/I
ab cd\=offset=1
/\b.*/Is
ab cd\=startoffset=1
/(?!.bcd).*/I
Xbcd12345
/abcde/I
ab\=ps
abc\=ps
abcd\=ps
abcde\=ps
the quick brown abc\=ps
\= Expect no match\=ps
the quick brown abxyz fox\=ps
"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"I
13/05/04\=ps
13/5/2004\=ps
02/05/09\=ps
1\=ps
1/2\=ps
1/2/0\=ps
1/2/04\=ps
0\=ps
02/\=ps
02/0\=ps
02/1\=ps
\= Expect no match\=ps
\=ps
123\=ps
33/4/04\=ps
3/13/04\=ps
0/1/2003\=ps
0/\=ps
02/0/\=ps
02/13\=ps
/0{0,2}ABC/I
/\d{3,}ABC/I
/\d*ABC/I
/[abc]+DE/I
/[abc]?123/I
123\=ps
a\=ps
b\=ps
c\=ps
c12\=ps
c123\=ps
/^(?:\d){3,5}X/I
1\=ps
123\=ps
123X
1234\=ps
1234X
12345\=ps
12345X
\= Expect no match
1X
123456\=ps
"<(\w+)/?>(.)*</(\1)>"Igms
<!DOCTYPE seite SYSTEM "http://www.lco.lineas.de/xmlCms.dtd">\n<seite>\n<dokumenteninformation>\n<seitentitel>Partner der LCO</seitentitel>\n<sprache>de</sprache>\n<seitenbeschreibung>Partner der LINEAS Consulting\nGmbH</seitenbeschreibung>\n<schluesselworte>LINEAS Consulting GmbH Hamburg\nPartnerfirmen</schluesselworte>\n<revisit>30 days</revisit>\n<robots>index,follow</robots>\n<menueinformation>\n<aktiv>ja</aktiv>\n<menueposition>3</menueposition>\n<menuetext>Partner</menuetext>\n</menueinformation>\n<lastedited>\n<autor>LCO</autor>\n<firma>LINEAS Consulting</firma>\n<datum>15.10.2003</datum>\n</lastedited>\n</dokumenteninformation>\n<inhalt>\n\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\nGmbH</absatzueberschrift>\n\n<absatz><link ziel="http://www.ca.com/" zielfenster="_blank">\n<bild name="logo_ca.gif" rahmen="no"/></link> <link\nziel="http://www.ey.com/" zielfenster="_blank"><bild\nname="logo_euy.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.cisco.de/" zielfenster="_blank">\n<bild name="logo_cisco.gif" rahmen="ja"/></link></absatz>\n\n<absatz><link ziel="http://www.atelion.de/"\nzielfenster="_blank"><bild\nname="logo_atelion.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.line-information.de/"\nzielfenster="_blank">\n<bild name="logo_line_information.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><bild name="logo_aw.gif" rahmen="no"/></absatz>\n\n<absatz><link ziel="http://www.incognis.de/"\nzielfenster="_blank"><bild\nname="logo_incognis.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.addcraft.com/"\nzielfenster="_blank"><bild\nname="logo_addcraft.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.comendo.com/"\nzielfenster="_blank"><bild\nname="logo_comendo.gif" rahmen="no"/></link></absatz>\n\n</inhalt>\n</seite>\=jitstack=1024
/line\nbreak/I
this is a line\nbreak
line one\nthis is a line\nbreak in the second line
/line\nbreak/I,firstline
this is a line\nbreak
\= Expect no match
line one\nthis is a line\nbreak in the second line
/line\nbreak/Im,firstline
this is a line\nbreak
\= Expect no match
line one\nthis is a line\nbreak in the second line
/(?i)(?-i)AbCd/I
AbCd
\= Expect no match
abcd
/a{11111111111111111111}/I
/(){64294967295}/I
/(){2,4294967295}/I
"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\1B"I
abcdefghijklAkB
"(?P<n0>a)(?P<n1>b)(?P<n2>c)(?P<n3>d)(?P<n4>e)(?P<n5>f)(?P<n6>g)(?P<n7>h)(?P<n8>i)(?P<n9>j)(?P<n10>k)(?P<n11>l)A\11B"I
abcdefghijklAkB
"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"I
abcdefghijklAkB
"(?P<name0>a)(?P<name1>a)(?P<name2>a)(?P<name3>a)(?P<name4>a)(?P<name5>a)(?P<name6>a)(?P<name7>a)(?P<name8>a)(?P<name9>a)(?P<name10>a)(?P<name11>a)(?P<name12>a)(?P<name13>a)(?P<name14>a)(?P<name15>a)(?P<name16>a)(?P<name17>a)(?P<name18>a)(?P<name19>a)(?P<name20>a)(?P<name21>a)(?P<name22>a)(?P<name23>a)(?P<name24>a)(?P<name25>a)(?P<name26>a)(?P<name27>a)(?P<name28>a)(?P<name29>a)(?P<name30>a)(?P<name31>a)(?P<name32>a)(?P<name33>a)(?P<name34>a)(?P<name35>a)(?P<name36>a)(?P<name37>a)(?P<name38>a)(?P<name39>a)(?P<name40>a)(?P<name41>a)(?P<name42>a)(?P<name43>a)(?P<name44>a)(?P<name45>a)(?P<name46>a)(?P<name47>a)(?P<name48>a)(?P<name49>a)(?P<name50>a)(?P<name51>a)(?P<name52>a)(?P<name53>a)(?P<name54>a)(?P<name55>a)(?P<name56>a)(?P<name57>a)(?P<name58>a)(?P<name59>a)(?P<name60>a)(?P<name61>a)(?P<name62>a)(?P<name63>a)(?P<name64>a)(?P<name65>a)(?P<name66>a)(?P<name67>a)(?P<name68>a)(?P<name69>a)(?P<name70>a)(?P<name71>a)(?P<name72>a)(?P<name73>a)(?P<name74>a)(?P<name75>a)(?P<name76>a)(?P<name77>a)(?P<name78>a)(?P<name79>a)(?P<name80>a)(?P<name81>a)(?P<name82>a)(?P<name83>a)(?P<name84>a)(?P<name85>a)(?P<name86>a)(?P<name87>a)(?P<name88>a)(?P<name89>a)(?P<name90>a)(?P<name91>a)(?P<name92>a)(?P<name93>a)(?P<name94>a)(?P<name95>a)(?P<name96>a)(?P<name97>a)(?P<name98>a)(?P<name99>a)(?P<name100>a)"I
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)"I
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
/[^()]*(?:\((?R)\)[^()]*)*/I
(this(and)that
(this(and)that)
(this(and)that)stuff
/[^()]*(?:\((?>(?R))\)[^()]*)*/I
(this(and)that
(this(and)that)
/[^()]*(?:\((?R)\))*[^()]*/I
(this(and)that
(this(and)that)
/(?:\((?R)\))*[^()]*/I
(this(and)that
(this(and)that)
((this))
/(?:\((?R)\))|[^()]*/I
(this(and)that
(this(and)that)
(this)
((this))
/\x{0000ff}/I
/^((?P<A>a1)|(?P<A>a2)b)/I
/^((?P<A>a1)|(?P<A>a2)b)/I,dupnames
a1b\=copy=A
a2b\=copy=A
a1b\=copy=Z,copy=A
/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/I,dupnames
/^(?P<A>a)(?P<A>b)/I,dupnames
ab\=copy=A
/^(?P<A>a)(?P<A>b)|cd/I,dupnames
ab\=copy=A
cd\=copy=A
/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/I,dupnames
cdefgh\=copy=A
/^((?P<A>a1)|(?P<A>a2)b)/I,dupnames
a1b\=get=A
a2b\=get=A
a1b\=get=Z,get=A
/^(?P<A>a)(?P<A>b)/I,dupnames
ab\=get=A
/^(?P<A>a)(?P<A>b)|cd/I,dupnames
ab\=get=A
cd\=get=A
/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/I,dupnames
cdefgh\=get=A
/(?J)^((?P<A>a1)|(?P<A>a2)b)/I
a1b\=copy=A
a2b\=copy=A
/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<A>d)/I
# In this next test, J is not set at the outer level; consequently it isn't set
# in the pattern's options; consequently pcre2_substring_get_byname() produces
# a random value.
/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<C>d)/I
a bc d\=copy=A,copy=B,copy=C
/^(?P<A>a)?(?(A)a|b)/I
aabc
bc
\= Expect no match
abc
/(?:(?(ZZ)a|b)(?P<ZZ>X))+/I
bXaX
/(?:(?(2y)a|b)(X))+/I
/(?:(?(ZA)a|b)(?P<ZZ>X))+/I
/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I
bbXaaX
/(?:(?(ZZ)a|\(b\))\\(?P<ZZ>X))+/I
(b)\\Xa\\X
/(?P<ABC/I
/(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I
bXXaYYaY
bXYaXXaX
/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I
bXXaYYaY
/\s*,\s*/I
\x0b,\x0b
\x0c,\x0d
/^abc/Im,newline=lf
xyz\nabc
xyz\r\nabc
\= Expect no match
xyz\rabc
xyzabc\r
xyzabc\rpqr
xyzabc\r\n
xyzabc\r\npqr
/^abc/Im,newline=crlf
xyz\r\nabclf>
\= Expect no match
xyz\nabclf
xyz\rabclf
/^abc/Im,newline=cr
xyz\rabc
\= Expect no match
xyz\nabc
xyz\r\nabc
/^abc/Im,newline=bad
/.*/I,newline=lf
abc\ndef
abc\rdef
abc\r\ndef
/.*/I,newline=cr
abc\ndef
abc\rdef
abc\r\ndef
/.*/I,newline=crlf
abc\ndef
abc\rdef
abc\r\ndef
/\w+(.)(.)?def/Is
abc\ndef
abc\rdef
abc\r\ndef
/(?P<B>25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>B)){3}/I
/()()()()()()()()()()()()()()()()()()()()
()()()()()()()()()()()()()()()()()()()()
()()()()()()()()()()()()()()()()()()()()
()()()()()()()()()()()()()()()()()()()()
()()()()()()()()()()()()()()()()()()()()
(.(.))/Ix
XY\=ovector=133
/(a*b|(?i:c*(?-i)d))/I
/()[ab]xyz/I
/(|)[ab]xyz/I
/(|c)[ab]xyz/I
/(|c?)[ab]xyz/I
/(d?|c?)[ab]xyz/I
/(d?|c)[ab]xyz/I
/^a*b\d/IB
/^a*+b\d/IB
/^a*?b\d/IB
/^a+A\d/IB
aaaA5
\= Expect no match
aaaa5
/^a*A\d/IBi
aaaA5
aaaa5
a5
/(a*|b*)[cd]/I
/(a+|b*)[cd]/I
/(a*|b+)[cd]/I
/(a+|b+)[cd]/I
/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((
a
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))
/Ix
large nest
/a*\d/B
/a*\D/B
/0*\d/B
/0*\D/B
/a*\s/B
/a*\S/B
/ *\s/B
/ *\S/B
/a*\w/B
/a*\W/B
/=*\w/B
/=*\W/B
/\d*a/B
/\d*2/B
/\d*\d/B
/\d*\D/B
/\d*\s/B
/\d*\S/B
/\d*\w/B
/\d*\W/B
/\D*a/B
/\D*2/B
/\D*\d/B
/\D*\D/B
/\D*\s/B
/\D*\S/B
/\D*\w/B
/\D*\W/B
/\s*a/B
/\s*2/B
/\s*\d/B
/\s*\D/B
/\s*\s/B
/\s*\S/B
/\s*\w/B
/\s*\W/B
/\S*a/B
/\S*2/B
/\S*\d/B
/\S*\D/B
/\S*\s/B
/\S*\S/B
/\S*\w/B
/\S*\W/B
/\w*a/B
/\w*2/B
/\w*\d/B
/\w*\D/B
/\w*\s/B
/\w*\S/B
/\w*\w/B
/\w*\W/B
/\W*a/B
/\W*2/B
/\W*\d/B
/\W*\D/B
/\W*\s/B
/\W*\S/B
/\W*\w/B
/\W*\W/B
/[^a]+a/B
/[^a]+a/Bi
/[^a]+A/Bi
/[^a]+b/B
/[^a]+\d/B
/a*[^a]/B
/(?P<abc>x)(?P<xyz>y)/I
xy\=copy=abc,copy=xyz
/(?<abc>x)(?'xyz'y)/I
xy\=copy=abc,copy=xyz
/(?<abc'x)(?'xyz'y)/I
/(?<abc>x)(?'xyz>y)/I
/(?P'abc'x)(?P<xyz>y)/I
/^(?:(?(ZZ)a|b)(?<ZZ>X))+/
bXaX
bXbX
\= Expect no match
aXaX
aXbX
/^(?P>abc)(?<abcd>xxx)/
/^(?P>abc)(?<abc>x|y)/
xx
xy
yy
yx
/^(?P>abc)(?P<abc>x|y)/
xx
xy
yy
yx
/^((?(abc)a|b)(?<abc>x|y))+/
bxay
bxby
\= Expect no match
axby
/^(((?P=abc)|X)(?<abc>x|y))+/
XxXxxx
XxXyyx
XxXyxx
\= Expect no match
x
/^(?1)(abc)/
abcabc
/^(?:(?:\1|X)(a|b))+/
Xaaa
Xaba
/^[\E\Qa\E-\Qz\E]+/B
/^[a\Q]bc\E]/B
/^[a-\Q\E]/B
/^(?P>abc)[()](?<abc>)/B
/^((?(abc)y)[()](?P<abc>x))+/B
(xy)x
/^(?P>abc)\Q()\E(?<abc>)/B
/^(?P>abc)[a\Q(]\E(](?<abc>)/B
/^(?P>abc) # this is (a comment)
(?<abc>)/Bx
/^\W*(?:(?<one>(?<two>.)\W*(?&one)\W*\k<two>|)|(?<three>(?<four>.)\W*(?&three)\W*\k'four'|\W*.\W*))\W*$/Ii
1221
Satan, oscillate my metallic sonatas!
A man, a plan, a canal: Panama!
Able was I ere I saw Elba.
\= Expect no match
The quick brown fox
/(?=(\w+))\1:/I
abcd:
/(?=(?'abc'\w+))\k<abc>:/I
abcd:
/(?'abc'a|b)(?<abc>d|e)\k<abc>{2}/dupnames
adaa
\= Expect no match
addd
adbb
/(?'abc'a|b)(?<abc>d|e)(?&abc){2}/dupnames
bdaa
bdab
\= Expect no match
bddd
/(?(<bc))/
/(?(''))/
/(?('R')stuff)/
/((abc (?(R) (?(R1)1) (?(R2)2) X | (?1) (?2) (?R) ))) /x
abcabc1Xabc2XabcXabcabc
/(?<A> (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x
abcabc1Xabc2XabcXabcabc
/(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x
/^(?(DEFINE) abc | xyz ) /x
/(?(DEFINE) abc) xyz/Ix
/(a|)*\d/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\=ovector=0
\= Expect no match
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=ovector=0
/^a.b/newline=lf
a\rb
\= Expect no match
a\nb
/^a.b/newline=cr
a\nb
\= Expect no match
a\rb
/^a.b/newline=anycrlf
a\x85b
\= Expect no match
a\rb
/^a.b/newline=any
\= Expect no match
a\nb
a\rb
a\x85b
/^abc./gmx,newline=any
abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
/abc.$/gmx,newline=any
abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7 abc9
/^a\Rb/bsr=unicode
a\nb
a\rb
a\r\nb
a\x0bb
a\x0cb
a\x85b
\= Expect no match
a\n\rb
/^a\R*b/bsr=unicode
ab
a\nb
a\rb
a\r\nb
a\x0bb
a\x0cb
a\x85b
a\n\rb
a\n\r\x85\x0cb
/^a\R+b/bsr=unicode
a\nb
a\rb
a\r\nb
a\x0bb
a\x0cb
a\x85b
a\n\rb
a\n\r\x85\x0cb
\= Expect no match
ab
/^a\R{1,3}b/bsr=unicode
a\nb
a\n\rb
a\n\r\x85b
a\r\n\r\nb
a\r\n\r\n\r\nb
a\n\r\n\rb
a\n\n\r\nb
\= Expect no match
a\n\n\n\rb
a\r
/(?&abc)X(?<abc>P)/I
abcPXP123
/(?1)X(?<abc>P)/I
abcPXP123
/(?:a(?&abc)b)*(?<abc>x)/
123axbaxbaxbx456
123axbaxbaxb456
/(?:a(?&abc)b){1,5}(?<abc>x)/
123axbaxbaxbx456
/(?:a(?&abc)b){2,5}(?<abc>x)/
123axbaxbaxbx456
/(?:a(?&abc)b){2,}(?<abc>x)/
123axbaxbaxbx456
/(abc)(?i:(?1))/
defabcabcxyz
\= Expect no match
DEFabcABCXYZ
/(abc)(?:(?i)(?1))/
defabcabcxyz
\= Expect no match
DEFabcABCXYZ
/^(a)\g-2/
/^(a)\g/
/^(a)\g{0}/
/^(a)\g{3/
/^(a)\g{aa}/
/^a.b/newline=lf
a\rb
\= Expect no match
a\nb
/.+foo/
afoo
\= Expect no match
\r\nfoo
\nfoo
/.+foo/newline=crlf
afoo
\nfoo
\= Expect no match
\r\nfoo
/.+foo/newline=any
afoo
\= Expect no match
\nfoo
\r\nfoo
/.+foo/s
afoo
\r\nfoo
\nfoo
/^$/gm,newline=any
abc\r\rxyz
abc\n\rxyz
\= Expect no match
abc\r\nxyz
/(?m)^$/g,newline=any,aftertext
abc\r\n\r\n
/(?m)^$|^\r\n/g,newline=any,aftertext
abc\r\n\r\n
/(?m)$/g,newline=any,aftertext
abc\r\n\r\n
/abc.$/gmx,newline=anycrlf
abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9
/^X/m
XABC
\= Expect no match
XABC\=notbol
/(ab|c)(?-1)/B
abc
/xy(?+1)(abc)/B
xyabcabc
\= Expect no match
xyabc
/x(?-0)y/
/x(?-1)y/
/x(?+0)y/
/x(?+1)y/
/^(abc)?(?(-1)X|Y)/B
abcX
Y
\= Expect no match
abcY
/^((?(+1)X|Y)(abc))+/B
YabcXabc
YabcXabcXabc
\= Expect no match
XabcXabc
/(?(-1)a)/B
/((?(-1)a))/B
/((?(-2)a))/B
/^(?(+1)X|Y)(.)/B
Y!
/(?<A>tom|bon)-\k{A}/
tom-tom
bon-bon
\= Expect no match
tom-bon
/\g{A/
/(?|(abc)|(xyz))/B
>abc<
>xyz<
/(x)(?|(abc)|(xyz))(x)/B
xabcx
xxyzx
/(x)(?|(abc)(pqr)|(xyz))(x)/B
xabcpqrx
xxyzx
/\H++X/B
\= Expect no match
XXXX
/\H+\hY/B
XXXX Y
/\H+ Y/B
/\h+A/B
/\v*B/B
/\V+\x0a/B
/A+\h/B
/ *\H/B
/A*\v/B
/\x0b*\V/B
/\d+\h/B
/\d*\v/B
/S+\h\S+\v/B
/\w{3,}\h\w+\v/B
/\h+\d\h+\w\h+\S\h+\H/B
/\v+\d\v+\w\v+\S\v+\V/B
/\H+\h\H+\d/B
/\V+\v\V+\w/B
/\( (?: [^()]* | (?R) )* \)/x
(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)\=jitstack=1024
/[\E]AAA/
/[\Q\E]AAA/
/[^\E]AAA/
/[^\Q\E]AAA/
/[\E^]AAA/
/[\Q\E^]AAA/
/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/B
/^a+(*FAIL)/auto_callout
\= Expect no match
aaaaaa
/a+b?c+(*FAIL)/auto_callout
\= Expect no match
aaabccc
/a+b?(*PRUNE)c+(*FAIL)/auto_callout
\= Expect no match
aaabccc
/a+b?(*COMMIT)c+(*FAIL)/auto_callout
\= Expect no match
aaabccc
/a+b?(*SKIP)c+(*FAIL)/auto_callout
\= Expect no match
aaabcccaaabccc
/a+b?(*THEN)c+(*FAIL)/auto_callout
\= Expect no match
aaabccc
/a(*MARK)b/
/\g6666666666/
/[\g6666666666]/B
/(?1)\c[/
/.+A/newline=crlf
\= Expect no match
\r\nA
/\nA/newline=crlf
\r\nA
/[\r\n]A/newline=crlf
\r\nA
/(\r|\n)A/newline=crlf
\r\nA
/a(*CR)b/
/(*CR)a.b/
a\nb
\= Expect no match
a\rb
/(*CR)a.b/newline=lf
a\nb
\= Expect no match
a\rb
/(*LF)a.b/newline=CRLF
a\rb
\= Expect no match
a\nb
/(*CRLF)a.b/
a\rb
a\nb
\= Expect no match
a\r\nb
/(*ANYCRLF)a.b/newline=CR
\= Expect no match
a\rb
a\nb
a\r\nb
/(*ANY)a.b/newline=cr
\= Expect no match
a\rb
a\nb
a\r\nb
a\x85b
/(*ANY).*/g
abc\r\ndef
/(*ANYCRLF).*/g
abc\r\ndef
/(*CRLF).*/g
abc\r\ndef
/(*NUL)^.*/
a\nb\x00ccc
/(*NUL)^.*/s
a\nb\x00ccc
/^x/m,newline=NUL
ab\x00xy
/'#comment' 0d 0a 00 '^x\' 0a 'y'/x,newline=nul,hex
x\nyz
/(*NUL)^X\NY/
X\nY
X\rY
\= Expect no match
X\x00Y
/a\Rb/I,bsr=anycrlf
a\rb
a\nb
a\r\nb
\= Expect no match
a\x85b
a\x0bb
/a\Rb/I,bsr=unicode
a\rb
a\nb
a\r\nb
a\x85b
a\x0bb
/a\R?b/I,bsr=anycrlf
a\rb
a\nb
a\r\nb
\= Expect no match
a\x85b
a\x0bb
/a\R?b/I,bsr=unicode
a\rb
a\nb
a\r\nb
a\x85b
a\x0bb
/a\R{2,4}b/I,bsr=anycrlf
a\r\n\nb
a\n\r\rb
a\r\n\r\n\r\n\r\nb
\= Expect no match
a\x85\x85b
a\x0b\x0bb
/a\R{2,4}b/I,bsr=unicode
a\r\rb
a\n\n\nb
a\r\n\n\r\rb
a\x85\x85b
a\x0b\x0bb
\= Expect no match
a\r\r\r\r\rb
/(*BSR_ANYCRLF)a\Rb/I
a\nb
a\rb
/(*BSR_UNICODE)a\Rb/I
a\x85b
/(*BSR_ANYCRLF)(*CRLF)a\Rb/I
a\nb
a\rb
/(*CRLF)(*BSR_UNICODE)a\Rb/I
a\x85b
/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I
/(?<a>)(?&)/
/(?<abc>)(?&a)/
/(?<a>)(?&aaaaaaaaaaaaaaaaaaaaaaa)/
/(?+-a)/
/(?-+a)/
/(?(-1))/
/(?(+10))/
/(?(10))/
/(?(+2))()()/
/(?(2))()()/
/\k''/
/\k<>/
/\k{}/
/\k/
/\kabc/
/(?P=)/
/(?P>)/
/[[:foo:]]/
/[[:1234:]]/
/[[:f\oo:]]/
/[[: :]]/
/[[:...:]]/
/[[:l\ower:]]/
/[[:abc\:]]/
/[abc[:x\]pqr:]]/
/[[:a\dz:]]/
/(^(a|b\g<-1'c))/
/^(?+1)(?<a>x|y){0}z/
xzxx
yzyy
\= Expect no match
xxz
/(\3)(\1)(a)/
\= Expect no match
cat
/(\3)(\1)(a)/allow_empty_class,match_unset_backref,dupnames
cat
/TA]/
The ACTA] comes
/TA]/allow_empty_class,match_unset_backref,dupnames
The ACTA] comes
/(?2)[]a()b](abc)/
abcbabc
/(?2)[^]a()b](abc)/
abcbabc
/(?1)[]a()b](abc)/
abcbabc
\= Expect no match
abcXabc
/(?1)[^]a()b](abc)/
abcXabc
\= Expect no match
abcbabc
/(?2)[]a()b](abc)(xyz)/
xyzbabcxyz
/(?&N)[]a(?<N>)](?<M>abc)/
abc<abc
/(?&N)[]a(?<N>)](abc)/
abc<abc
/a[]b/
/a[^]b/
/a[]b/allow_empty_class,match_unset_backref,dupnames
\= Expect no match
ab
/a[]+b/allow_empty_class,match_unset_backref,dupnames
\= Expect no match
ab
/a[]*+b/allow_empty_class,match_unset_backref,dupnames
\= Expect no match
ab
/a[^]b/allow_empty_class,match_unset_backref,dupnames
aXb
a\nb
\= Expect no match
ab
/a[^]+b/allow_empty_class,match_unset_backref,dupnames
aXb
a\nX\nXb
\= Expect no match
ab
/a(?!)b/B
/(?!)?a/B
ab
/a(*FAIL)+b/
/(abc|pqr|123){0}[xyz]/I
/(?(?=.*b)b|^)/I,auto_callout
adc
abc
/(?(?=b).*b|^d)/I
/(?(?=.*b).*b|^d)/I
/xyz/auto_callout
xyz
abcxyz
\= Expect no match
abc
abcxypqr
/xyz/auto_callout,no_start_optimize
abcxyz
\= Expect no match
abc
abcxypqr
/(*NO_START_OPT)xyz/auto_callout
abcxyz
/(*NO_AUTO_POSSESS)a+b/B
/xyz/auto_callout,no_start_optimize
abcxyz
/^"((?(?=[a])[^"])|b)*"$/auto_callout
"ab"
/^"((?(?=[a])[^"])|b)*"$/
"ab"
/^X(?5)(a)(?|(b)|(q))(c)(d)Y/
XYabcdY
/^X(?&N)(a)(?|(b)|(q))(c)(d)(?<N>Y)/
XYabcdY
/Xa{2,4}b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/Xa{2,4}?b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/Xa{2,4}+b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/X\d{2,4}b/
X\=ps
X3\=ps
X33\=ps
X333\=ps
X3333\=ps
/X\d{2,4}?b/
X\=ps
X3\=ps
X33\=ps
X333\=ps
X3333\=ps
/X\d{2,4}+b/
X\=ps
X3\=ps
X33\=ps
X333\=ps
X3333\=ps
/X\D{2,4}b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/X\D{2,4}?b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/X\D{2,4}+b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/X[abc]{2,4}b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/X[abc]{2,4}?b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/X[abc]{2,4}+b/
X\=ps
Xa\=ps
Xaa\=ps
Xaaa\=ps
Xaaaa\=ps
/X[^a]{2,4}b/
X\=ps
Xz\=ps
Xzz\=ps
Xzzz\=ps
Xzzzz\=ps
/X[^a]{2,4}?b/
X\=ps
Xz\=ps
Xzz\=ps
Xzzz\=ps
Xzzzz\=ps
/X[^a]{2,4}+b/
X\=ps
Xz\=ps
Xzz\=ps
Xzzz\=ps
Xzzzz\=ps
/(Y)X\1{2,4}b/
YX\=ps
YXY\=ps
YXYY\=ps
YXYYY\=ps
YXYYYY\=ps
/(Y)X\1{2,4}?b/
YX\=ps
YXY\=ps
YXYY\=ps
YXYYY\=ps
YXYYYY\=ps
/(Y)X\1{2,4}+b/
YX\=ps
YXY\=ps
YXYY\=ps
YXYYY\=ps
YXYYYY\=ps
/\++\KZ|\d+X|9+Y/startchar
++++123999\=ps
++++123999Y\=ps
++++Z1234\=ps
/Z(*F)/
\= Expect no match
Z\=ps
ZA\=ps
/Z(?!)/
\= Expect no match
Z\=ps
ZA\=ps
/dog(sbody)?/
dogs\=ps
dogs\=ph
/dog(sbody)??/
dogs\=ps
dogs\=ph
/dog|dogsbody/
dogs\=ps
dogs\=ph
/dogsbody|dog/
dogs\=ps
dogs\=ph
/\bthe cat\b/
the cat\=ps
the cat\=ph
/abc/
abc\=ps
abc\=ph
/abc\K123/startchar
xyzabc123pqr
xyzabc12\=ps
xyzabc12\=ph
/(?<=abc)123/
xyzabc123pqr
xyzabc12\=ps
xyzabc12\=ph
/\babc\b/
+++abc+++
+++ab\=ps
+++ab\=ph
/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\w*+))/B
/(?&word)(?&element)(?(DEFINE)(?<element><[^\d][^>]>[^<])(?<word>\w*+))/B
/(ab)(x(y)z(cd(*ACCEPT)))pq/B
/abc\K/aftertext,startchar
abcdef
abcdef\=notempty_atstart
xyzabcdef\=notempty_atstart
\= Expect no match
abcdef\=notempty
xyzabcdef\=notempty
/^(?:(?=abc)|abc\K)/aftertext,startchar
abcdef
abcdef\=notempty_atstart
\= Expect no match
abcdef\=notempty
/a?b?/aftertext
xyz
xyzabc
xyzabc\=notempty
xyzabc\=notempty_atstart
xyz\=notempty_atstart
\= Expect no match
xyz\=notempty
/^a?b?/aftertext
xyz
xyzabc
\= Expect no match
xyzabc\=notempty
xyzabc\=notempty_atstart
xyz\=notempty_atstart
xyz\=notempty
/^(?<name>a|b\g<name>c)/
aaaa
bacxxx
bbaccxxx
bbbacccxx
/^(?<name>a|b\g'name'c)/
aaaa
bacxxx
bbaccxxx
bbbacccxx
/^(a|b\g<1>c)/
aaaa
bacxxx
bbaccxxx
bbbacccxx
/^(a|b\g'1'c)/
aaaa
bacxxx
bbaccxxx
bbbacccxx
/^(a|b\g'-1'c)/
aaaa
bacxxx
bbaccxxx
bbbacccxx
/(^(a|b\g<-1>c))/
aaaa
bacxxx
bbaccxxx
bbbacccxx
/(?-i:\g<name>)(?i:(?<name>a))/
XaaX
XAAX
/(?i:\g<name>)(?-i:(?<name>a))/
XaaX
\= Expect no match
XAAX
/(?-i:\g<+1>)(?i:(a))/
XaaX
XAAX
/(?=(?<regex>(?#simplesyntax)\$(?<name>[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?<index>[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g<name>)\]|->\g<name>(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g<name>(?<indices>\[(?:\g<index>|'(?:\\.|[^'\\])*'|"(?:\g<regex>|\\.|[^"\\])*")\])?|\g<complex>|\$\{\g<complex>\})\}|(?#complexsyntax)\{(?<complex>\$(?<segment>\g<name>(\g<indices>*|\(.*?\))?)(?:->\g<segment>)*|\$\g<complex>|\$\{\g<complex>\})\}))\{/
/(?<n>a|b|c)\g<n>*/
abc
accccbbb
/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/
XYabcdY
/(?<=b(?1)|zzz)(a)/
xbaax
xzzzax
/(a)(?<=b\1)/
/(a)(?<=b+(?1))/
/(a+)(?<=b(?1))/
/(a(?<=b(?1)))/
/(?<=b(?1))xyz/
/(?<=b(?1))xyz(b+)pqrstuvew/
/(a|bc)\1/I
/(a|bc)\1{2,3}/I
/(a|bc)(?1)/I
/(a|b\1)(a|b\1)/I
/(a|b\1){2}/I
/(a|bbbb\1)(a|bbbb\1)/I
/(a|bbbb\1){2}/I
/^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]/I
/<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>/Iis
"(?>.*/)foo"I
/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /Ix
/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/Ii
/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/I
/<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
/Iisx
/^(?!:) # 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
/Iix
/(?|(?<a>A)|(?<a>B))/I
AB\=copy=a
BA\=copy=a
/(?|(?<a>A)|(?<b>B))/
/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |
b(?<quote> (?<apostrophe>')|(?<realquote>")) )
(?('quote')[a-z]+|[0-9]+)/Ix,dupnames
a"aaaaa
b"aaaaa
\= Expect no match
b"11111
a"11111
/^(?|(a)(b)(c)(?<D>d)|(?<D>e)) (?('D')X|Y)/IBx,dupnames
abcdX
eX
\= Expect no match
abcdY
ey
/(?<A>a) (b)(c) (?<A>d (?(R&A)$ | (?4)) )/IBx,dupnames
abcdd
\= Expect no match
abcdde
/abcd*/
xxxxabcd\=ps
xxxxabcd\=ph
/abcd*/i
xxxxabcd\=ps
xxxxabcd\=ph
XXXXABCD\=ps
XXXXABCD\=ph
/abc\d*/
xxxxabc1\=ps
xxxxabc1\=ph
/(a)bc\1*/
xxxxabca\=ps
xxxxabca\=ph
/abc[de]*/
xxxxabcde\=ps
xxxxabcde\=ph
/(\3)(\1)(a)/allow_empty_class,match_unset_backref,dupnames
cat
/(\3)(\1)(a)/I,allow_empty_class,match_unset_backref,dupnames
cat
/(\3)(\1)(a)/I
\= Expect no match
cat
/i(?(DEFINE)(?<s>a))/I
i
/()i(?(1)a)/I
ia
/(?i)a(?-i)b|c/B
XabX
XAbX
CcC
\= Expect no match
XABX
/(?i)a(?s)b|c/B
/(?i)a(?s-i)b|c/B
/^(ab(c\1)d|x){2}$/B
xabcxd
/^(?&t)*+(?(DEFINE)(?<t>.))$/B
/^(?&t)*(?(DEFINE)(?<t>.))$/B
# This one is here because Perl gives the match as "b" rather than "ab". I
# believe this to be a Perl bug.
/(?>a\Kb)z|(ab)/
ab\=startchar
/(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/
abcd
0abc
/abc(*MARK:)pqr/
/abc(*:)pqr/
/(*COMMIT:X)/B
# This should, and does, fail. In Perl, it does not, which I think is a
# bug because replacing the B in the pattern by (B|D) does make it fail.
# Turning off Perl's optimization by inserting (??{""}) also makes it fail.
/A(*COMMIT)B/aftertext,mark
\= Expect no match
ACABX
# These should be different, but in Perl they are not, which I think
# is a bug in Perl.
/A(*THEN)B|A(*THEN)C/mark
AC
/A(*PRUNE)B|A(*PRUNE)C/mark
\= Expect no match
AC
# Mark names can be duplicated. Perl doesn't give a mark for this one,
# though PCRE2 does.
/^A(*:A)B|^X(*:A)Y/mark
\= Expect no match
XAQQ
# COMMIT at the start of a pattern should be the same as an anchor. Perl
# optimizations defeat this. So does the PCRE2 optimization unless we disable
# it.
/(*COMMIT)ABC/
ABCDEFG
/(*COMMIT)ABC/no_start_optimize
\= Expect no match
DEFGABC
/^(ab (c+(*THEN)cd) | xyz)/x
\= Expect no match
abcccd
/^(ab (c+(*PRUNE)cd) | xyz)/x
\= Expect no match
abcccd
/^(ab (c+(*FAIL)cd) | xyz)/x
\= Expect no match
abcccd
# Perl gets some of these wrong
/(?>.(*ACCEPT))*?5/
abcde
/(.(*ACCEPT))*?5/
abcde
/(.(*ACCEPT))5/
abcde
/(.(*ACCEPT))*5/
abcde
/A\NB./B
ACBD
\= Expect no match
A\nB
ACB\n
/A\NB./Bs
ACBD
ACB\n
\= Expect no match
A\nB
/A\NB/newline=crlf
A\nB
A\rB
\= Expect no match
A\r\nB
/\R+b/B
/\R+\n/B
/\R+\d/B
/\d*\R/B
/\s*\R/B
\x20\x0a
\x20\x0d
\x20\x0d\x0a
/\S*\R/B
a\x0a
/X\h*\R/B
X\x20\x0a
/X\H*\R/B
X\x0d\x0a
/X\H+\R/B
X\x0d\x0a
/X\H++\R/B
\= Expect no match
X\x0d\x0a
/(?<=abc)def/
abc\=ph
/abc$/
abc
abc\=ps
abc\=ph
/abc$/m
abc
abc\n
abc\=ph
abc\n\=ph
abc\=ps
abc\n\=ps
/abc\z/
abc
abc\=ps
abc\=ph
/abc\Z/
abc
abc\=ps
abc\=ph
/abc\b/
abc
abc\=ps
abc\=ph
/abc\B/
abc\=ps
abc\=ph
\= Expect no match
abc
/.+/
\= Bad offsets
abc\=offset=4
abc\=offset=-4
\= Valid data
abc\=offset=0
abc\=offset=1
abc\=offset=2
\= Expect no match
abc\=offset=3
/^\cģ/
/(?P<abn>(?P=abn)xxx)/B
/(a\1z)/B
/(?P<abn>(?P=abn)(?<badstufxxx)/B
/(?P<abn>(?P=axn)xxx)/B
/(?P<abn>(?P=axn)xxx)(?<axn>yy)/B
# These tests are here because Perl gets the first one wrong.
/(\R*)(.)/s
\r\n
\r\r\n\n\r
\r\r\n\n\r\n
/(\R)*(.)/s
\r\n
\r\r\n\n\r
\r\r\n\n\r\n
/((?>\r\n|\n|\x0b|\f|\r|\x85)*)(.)/s
\r\n
\r\r\n\n\r
\r\r\n\n\r\n
# -------------
/^abc$/B
/^abc$/Bm
/^(a)*+(\w)/
aaaaX
\= Expect no match
aaaa
/^(?:a)*+(\w)/
aaaaX
\= Expect no match
aaaa
/(a)++1234/IB
/([abc])++1234/I
/(?<=(abc)+)X/
/(^ab)/I
/(^ab)++/I
/(^ab|^)+/I
/(^ab|^)++/I
/(?:^ab)/I
/(?:^ab)++/I
/(?:^ab|^)+/I
/(?:^ab|^)++/I
/(.*ab)/I
/(.*ab)++/I
/(.*ab|.*)+/I
/(.*ab|.*)++/I
/(?:.*ab)/I
/(?:.*ab)++/I
/(?:.*ab|.*)+/I
/(?:.*ab|.*)++/I
/(?=a)[bcd]/I
/((?=a))[bcd]/I
/((?=a))+[bcd]/I
/((?=a))++[bcd]/I
/(?=a+)[bcd]/Ii
/(?=a+?)[bcd]/Ii
/(?=a++)[bcd]/Ii
/(?=a{3})[bcd]/Ii
/(abc)\1+/
# Perl doesn't get these right IMO (the 3rd is PCRE2-specific)
/(?1)(?:(b(*ACCEPT))){0}/
b
/(?1)(?:(b(*ACCEPT))){0}c/
bc
\= Expect no match
b
/(?1)(?:((*ACCEPT))){0}c/
c
c\=notempty
/^.*?(?(?=a)a|b(*THEN)c)/
\= Expect no match
ba
/^.*?(?(?=a)a|bc)/
ba
/^.*?(?(?=a)a(*THEN)b|c)/
\= Expect no match
ac
/^.*?(?(?=a)a(*THEN)b)c/
\= Expect no match
ac
/^.*?(a(*THEN)b)c/
\= Expect no match
aabc
/^.*? (?1) c (?(DEFINE)(a(*THEN)b))/x
aabc
/^.*?(a(*THEN)b|z)c/
aabc
/^.*?(z|a(*THEN)b)c/
aabc
# These are here because they are not Perl-compatible; the studying means the
# mark is not seen.
/(*MARK:A)(*SKIP:B)(C|X)/mark
C
\= Expect no match
D
/(*:A)A+(*SKIP:A)(B|Z)/mark
\= Expect no match
AAAC
# ----------------------------
"(?=a*(*ACCEPT)b)c"
c
c\=notempty
/(?1)c(?(DEFINE)((*ACCEPT)b))/
c
c\=notempty
/(?>(*ACCEPT)b)c/
c
\= Expect no match
c\=notempty
/(?:(?>(a)))+a%/allaftertext
%aa%
/(a)b|ac/allaftertext
ac\=ovector=1
/(a)(b)x|abc/allaftertext
abc\=ovector=2
/(a)bc|(a)(b)\2/
abc\=ovector=1
abc\=ovector=2
aba\=ovector=1
aba\=ovector=2
aba\=ovector=3
aba\=ovector=4
/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/I
/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/I
/(a(?2)|b)(b(?1)|a)(?1)(?2)/I
/(abc)(?1)/I
/(?:(foo)|(bar)|(baz))X/allcaptures
bazfooX
foobazbarX
barfooX
bazX
foobarbazX
bazfooX\=ovector=0
bazfooX\=ovector=1
bazfooX\=ovector=2
bazfooX\=ovector=3
/(?=abc){3}abc/B
/(?=abc)+abc/B
/(?=abc)++abc/B
/(?=abc){0}xyz/B
/(?=(a))?./B
/(?=(a))??./B
/^(?=(a)){0}b(?1)/B
/(?(DEFINE)(a))?b(?1)/B
/^(?=(?1))?[az]([abc])d/B
/^(?!a){0}\w+/B
/(?<=(abc))?xyz/B
/[:a[:abc]b:]/B
/^(a(*:A)(d|e(*:B))z|aeq)/auto_callout
adz
aez
aeqwerty
/.(*F)/
\= Expect no match
abc\=ph
/\btype\b\W*?\btext\b\W*?\bjavascript\b/I
/\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|<input\b.*?\btype\b\W*?\bimage\b|\bonkeyup\b\W*?\=/I
/a(*SKIP)c|b(*ACCEPT)|/I,aftertext
a
/a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/I
ax
'a*(*ACCEPT)b'aftertext
abc\=notempty_atstart
bbb\=notempty_atstart
\= Expect no match
\=notempty_atstart
/(*ACCEPT)a/I,aftertext
bax
/z(*ACCEPT)a/I,aftertext
baxzbx
/^(?>a+)(?>(z+))\w/B
aaaazzzzb
\= Expect no match
aazz
/(.)(\1|a(?2))/
bab
/\1|(.)(?R)\1/
cbbbc
/(.)((?(1)c|a)|a(?2))/
\= Expect no match
baa
/(?P<abn>(?P=abn)xxx)/B
/(a\1z)/B
/^a\x41z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
aAz
\= Expect no match
ax41z
/^a[m\x41]z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
aAz
/^a\x1z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
ax1z
/^a\u0041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
aAz
\= Expect no match
au0041z
/^a[m\u0041]z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
aAz
/^a\u041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
au041z
\= Expect no match
aAz
/^a\U0041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
aU0041z
\= Expect no match
aAz
/^\u{7a}/alt_bsux
u{7a}
\= Expect no match
zoo
/^\u{7a}/extra_alt_bsux
zoo
/\u{}/extra_alt_bsux
u{}
/\u{Q12}/extra_alt_bsux
--u{Q12}--
/\u{ 12}/extra_alt_bsux
--u{ 12}--
/\u{{3}}/extra_alt_bsux
--u{{{}--
/(?(?=c)c|d)++Y/B
/(?(?=c)c|d)*+Y/B
/a[\NB]c/
aNc
/a[B-\Nc]/
/a[B\Nc]/
/(a)(?2){0,1999}?(b)/
/(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/
# This test, with something more complicated than individual letters, causes
# different behaviour in Perl. Perhaps it disables some optimization; no tag is
# passed back for the failures, whereas in PCRE2 there is a tag.
/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/x,mark
AABC
XXYZ
\= Expect no match
XAQQ
XAQQXZZ
AXQQQ
AXXQQQ
# Perl doesn't give marks for these, though it does if the alternatives are
# replaced by single letters.
/(b|q)(*:m)f|a(*:n)w/mark
aw
\= Expect no match
abc
/(q|b)(*:m)f|a(*:n)w/mark
aw
\= Expect no match
abc
# After a partial match, the behaviour is as for a failure.
/^a(*:X)bcde/mark
abc\=ps
# These are here because Perl doesn't return a mark, except for the first.
/(?=(*:x))(q|)/aftertext,mark
abc
/(?=(*:x))((*:y)q|)/aftertext,mark
abc
/(?=(*:x))(?:(*:y)q|)/aftertext,mark
abc
/(?=(*:x))(?>(*:y)q|)/aftertext,mark
abc
/(?=a(*:x))(?!a(*:y)c)/aftertext,mark
ab
/(?=a(*:x))(?=a(*:y)c|)/aftertext,mark
ab
/(..)\1/
ab\=ps
aba\=ps
abab\=ps
/(..)\1/i
ab\=ps
abA\=ps
aBAb\=ps
/(..)\1{2,}/
ab\=ps
aba\=ps
abab\=ps
ababa\=ps
ababab\=ps
ababab\=ph
abababa\=ps
abababa\=ph
/(..)\1{2,}/i
ab\=ps
aBa\=ps
aBAb\=ps
AbaBA\=ps
abABAb\=ps
aBAbaB\=ph
abABabA\=ps
abaBABa\=ph
/(..)\1{2,}?x/i
ab\=ps
abA\=ps
aBAb\=ps
abaBA\=ps
abAbaB\=ps
abaBabA\=ps
abAbABaBx\=ps
/^(..)\1/
aba\=ps
/^(..)\1{2,3}x/
aba\=ps
ababa\=ps
ababa\=ph
abababx
ababababx
/^(..)\1{2,3}?x/
aba\=ps
ababa\=ps
ababa\=ph
abababx
ababababx
/^(..)(\1{2,3})ab/
abababab
/^\R/
\r\=ps
\r\=ph
/^\R{2,3}x/
\r\=ps
\r\=ph
\r\r\=ps
\r\r\=ph
\r\r\r\=ps
\r\r\r\=ph
\r\rx
\r\r\rx
/^\R{2,3}?x/
\r\=ps
\r\=ph
\r\r\=ps
\r\r\=ph
\r\r\r\=ps
\r\r\r\=ph
\r\rx
\r\r\rx
/^\R?x/
\r\=ps
\r\=ph
x
\rx
/^\R+x/
\r\=ps
\r\=ph
\r\n\=ps
\r\n\=ph
\rx
/^a$/newline=crlf
a\r\=ps
a\r\=ph
/^a$/m,newline=crlf
a\r\=ps
a\r\=ph
/^(a$|a\r)/newline=crlf
a\r\=ps
a\r\=ph
/^(a$|a\r)/m,newline=crlf
a\r\=ps
a\r\=ph
/./newline=crlf
\r\=ps
\r\=ph
/.{2,3}/newline=crlf
\r\=ps
\r\=ph
\r\r\=ps
\r\r\=ph
\r\r\r\=ps
\r\r\r\=ph
/.{2,3}?/newline=crlf
\r\=ps
\r\=ph
\r\r\=ps
\r\r\=ph
\r\r\r\=ps
\r\r\r\=ph
"AB(C(D))(E(F))?(?(?=\2)(?=\4))"
ABCDGHI\=ovector=01
# These are all run as real matches in test 1; here we are just checking the
# settings of the anchored and startline bits.
/(?>.*?a)(?<=ba)/I
/(?:.*?a)(?<=ba)/I
/.*?a(*PRUNE)b/I
/.*?a(*PRUNE)b/Is
/^a(*PRUNE)b/Is
/.*?a(*SKIP)b/I
/(?>.*?a)b/Is
/(?>.*?a)b/I
/(?>^a)b/Is
/(?>.*?)(?<=(abcd)|(wxyz))/I
/(?>.*)(?<=(abcd)|(wxyz))/I
"(?>.*)foo"I
"(?>.*?)foo"I
/(?>^abc)/Im
/(?>.*abc)/Im
/(?:.*abc)/Im
/(?:(a)+(?C1)bb|aa(?C2)b)/
aab\=callout_capture
/(?:(a)++(?C1)bb|aa(?C2)b)/
aab\=callout_capture
/(?:(?>(a))(?C1)bb|aa(?C2)b)/
aab\=callout_capture
/(?:(?1)(?C1)x|ab(?C2))((a)){0}/
aab\=callout_capture
/(?1)(?C1)((a)(?C2)){0}/
aab\=callout_capture
/(?:(a)+(?C1)bb|aa(?C2)b)++/
aab\=callout_capture
aab\=callout_capture,ovector=1
/(ab)x|ab/
ab\=ovector=0
ab\=ovector=1
/(?<=123)(*MARK:xx)abc/mark
xxxx123a\=ph
xxxx123a\=ps
/123\Kabc/startchar
xxxx123a\=ph
xxxx123a\=ps
/^(?(?=a)aa|bb)/auto_callout
bb
/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/
bb
# Perl seems to have a bug with this one.
/aaaaa(*COMMIT)(*PRUNE)b|a+c/
aaaaaac
# Here are some that Perl treats differently because of the way it handles
# backtracking verbs.
/(?!a(*COMMIT)b)ac|ad/
ac
ad
/^(?!a(*THEN)b|ac)../
ad
\= Expect no match
ac
/^(?=a(*THEN)b|ac)/
ac
/\A.*?(?:a|b(*THEN)c)/
ba
/\A.*?(?:a|b(*THEN)c)++/
ba
/\A.*?(?:a|b(*THEN)c|d)/
ba
/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/
aac
/\A.*?(a|b(*THEN)c)/
ba
/^(A(*THEN)B|A(*THEN)D)/
AD
/(?!b(*THEN)a)bn|bnn/
bnn
/(?(?=b(*SKIP)a)bn|bnn)/
bnn
/(?=b(*THEN)a|)bn|bnn/
bnn
# This test causes a segfault with Perl 5.18.0
/^(?=(a)){0}b(?1)/
backgammon
/(?|(?<n>f)|(?<n>b))/I,dupnames
/(?<a>abc)(?<a>z)\k<a>()/IB,dupnames
/a*[bcd]/B
/[bcd]*a/B
# A complete set of tests for auto-possessification of character types, but
# omitting \C because it might be disabled (it has its own tests).
/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/Bx
/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/Bx
/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/Bx
/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/Bx
/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/Bx
/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/Bx
/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/Bx
/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/Bx
/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/Bx
/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/Bx
/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/Bx
/ a+\D a+\d a+\S a+\s a+\W a+\w a+. a+\R a+\H a+\h a+\V a+\v a+\Z a+\z a+$/Bx
/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/Bx
/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/Bx
/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/Bsx
/ \D+$ \d+$ \S+$ \s+$ \W+$ \w+$ \R+$ \H+$ \h+$ \V+$ \v+$ a+$ \n+$ .+$ .+$/Bmx
/(?=a+)a(a+)++a/B
/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/B
/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/B
/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/B
/[ab]*/B
aaaa
/[ab]*?/B
aaaa
/[ab]?/B
aaaa
/[ab]??/B
aaaa
/[ab]+/B
aaaa
/[ab]+?/B
aaaa
/[ab]{2,3}/B
aaaa
/[ab]{2,3}?/B
aaaa
/[ab]{2,}/B
aaaa
/[ab]{2,}?/B
aaaa
/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/B
/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/B
/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/B
/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/B
/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/B
/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/B
/[a-c]*d/IB
/[a-c]+d/IB
/[a-c]?d/IB
/[a-c]{4,6}d/IB
/[a-c]{0,6}d/IB
# End of special auto-possessive tests
/^A\o{1239}B/
A\123B
/^A\oB/
/^A\x{zz}B/
/^A\x{12Z/
/^A\x{/
/[ab]++/B,no_auto_possess
/[^ab]*+/B,no_auto_possess
/a{4}+/B,no_auto_possess
/a{4}+/Bi,no_auto_possess
/[a-[:digit:]]+/
/[A-[:digit:]]+/
/[a-[.xxx.]]+/
/[a-[=xxx=]]+/
/[a-[!xxx!]]+/
/[A-[!xxx!]]+/
A]]]
/[a-\d]+/
/(?<0abc>xx)/
/(?&1abc)xx(?<1abc>y)/
/(?<ab-cd>xx)/
/(?'0abc'xx)/
/(?P<0abc>xx)/
/\k<5ghj>/
/\k'5ghj'/
/\k{2fgh}/
/(?P=8yuki)/
/\g{4df}/
/(?&1abc)xx(?<1abc>y)/
/(?P>1abc)xx(?<1abc>y)/
/\g'3gh'/
/\g<5fg>/
/(?(<4gh>)abc)/
/(?('4gh')abc)/
/(?(4gh)abc)/
/(?(R&6yh)abc)/
/(((a\2)|(a*)\g<-1>))*a?/B
# Test the ugly "start or end of word" compatibility syntax.
/[[:<:]]red[[:>:]]/B
little red riding hood
a /red/ thing
red is a colour
put it all on red
\= Expect no match
no reduction
Alfred Winifred
/[a[:<:]] should give error/
/(?=ab\K)/aftertext,allow_lookaround_bsk
abcd\=startchar
/abcd/newline=lf,firstline
\= Expect no match
xx\nxabcd
# Test stack guard external calls.
/(((a)))/stackguard=1
/(((a)))/stackguard=2
/(((a)))/stackguard=3
/(((((a)))))/
# End stack guard tests
/^\w+(?>\s*)(?<=\w)/B
/\othing/
/\o{}/
/\o{whatever}/
/\xthing/
/\x{}/
/\x{whatever}/
/A\8B/
/A\9B/
# This one is here because Perl fails to match "12" for this pattern when the $
# is present.
/^(?(?=abc)\w{3}:|\d\d)$/
abc:
12
\= Expect no match
123
xyz
# Perl gets this one wrong, giving "a" as the after text for ca and failing to
# match for cd.
/(?(?=ab)ab)/aftertext
abxxx
ca
cd
# This should test both paths for processing OP_RECURSE.
/(?(R)a+|(?R)b)/
aaaabcde
aaaabcde\=ovector=100
/a*?b*?/
ab
/(*NOTEMPTY)a*?b*?/
ab
ba
cb
/(*NOTEMPTY_ATSTART)a*?b*?/aftertext
ab
cdab
/(?(VERSION>=10.0)yes|no)/I
yesno
/(?(VERSION>=10.04)yes|no)/
yesno
/(?(VERSION=8)yes){3}/BI,aftertext
yesno
/(?(VERSION=8)yes|no){3}/I
yesnononoyes
\= Expect no match
yesno
/(?:(?<VERSION>abc)|xyz)(?(VERSION)yes|no)/I
abcyes
xyzno
\= Expect no match
abcno
xyzyes
/(?(VERSION<10)yes|no)/
/(?(VERSION>10)yes|no)/
/(?(VERSION>=10.0.0)yes|no)/
/(?(VERSION=10.101)yes|no)/
/abcd/I
/abcd/I,no_start_optimize
/(|ab)*?d/I
abd
xyd
/(|ab)*?d/I,no_start_optimize
abd
xyd
/\k<A>*(?<A>aa)(?<A>bb)/match_unset_backref,dupnames
aabb
/(((((a)))))/parens_nest_limit=2
/abc/replace=XYZ
123123
123abc123
123abc123abc123
123123\=zero_terminate
123abc123\=zero_terminate
123abc123abc123\=zero_terminate
/abc/g,replace=XYZ
123abc123
123abc123abc123
/abc/replace=X$$Z
123abc123
/abc/g,replace=X$$Z
123abc123abc123
/a(b)c(d)e/replace=X$1Y${2}Z
"abcde"
/a(b)c(d)e/replace=X$1Y${2}Z,global
"abcde-abcde"
/a(?<ONE>b)c(?<TWO>d)e/replace=X$ONE+${TWO}Z
"abcde"
/a(?<ONE>b)c(?<TWO>d)e/g,replace=X$ONE+${TWO}Z
"abcde-abcde-"
/abc/replace=a$++
123abc
/abc/replace=a$bad
123abc
/abc/replace=a${A234567890123456789_123456789012}z
123abc
/abc/replace=a${A23456789012345678901234567890123}z
123abc
/abc/replace=a${bcd
123abc
/abc/replace=a${b+d}z
123abc
/abc/replace=[10]XYZ
123abc123
/abc/replace=[9]XYZ
123abc123
/abc/replace=xyz
1abc2\=partial_hard
/abc/replace=xyz
123abc456
123abc456\=replace=pqr
123abc456abc789
123abc456abc789\=g
/(?<=abc)(|def)/g,replace=<$0>
123abcxyzabcdef789abcpqr
/./replace=$0
a
/(.)(.)/replace=$2+$1
abc
/(?<A>.)(?<B>.)/replace=$B+$A
abc
/(.)(.)/g,replace=$2$1
abcdefgh
/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=${*MARK}
apple lemon blackberry
apple strudel
fruitless
/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/replace=${*MARK} sauce,
apple lemon blackberry
/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=<$*MARK>
apple lemon blackberry
apple strudel
fruitless
/(*:pear)apple/g,replace=${*MARKING}
apple lemon blackberry
/(*:pear)apple/g,replace=${*MARK-time
apple lemon blackberry
/(*:pear)apple/g,replace=${*mark}
apple lemon blackberry
/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=<$*MARKET>
apple lemon blackberry
/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=[22]${*MARK}
apple lemon blackberry
apple lemon blackberry\=substitute_overflow_length
/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=[23]${*MARK}
apple lemon blackberry
/abc/
123abc123\=replace=[9]XYZ
123abc123\=substitute_overflow_length,replace=[9]XYZ
123abc123\=substitute_overflow_length,replace=[6]XYZ
123abc123\=substitute_overflow_length,replace=[1]XYZ
123abc123\=substitute_overflow_length,replace=[0]XYZ
/a(b)c/
123abc123\=replace=[9]x$1z
123abc123\=substitute_overflow_length,replace=[9]x$1z
123abc123\=substitute_overflow_length,replace=[6]x$1z
123abc123\=substitute_overflow_length,replace=[1]x$1z
123abc123\=substitute_overflow_length,replace=[0]x$1z
"((?=(?(?=(?(?=(?(?=()))))))))"
a
"(?(?=)==)(((((((((?=)))))))))"
\= Expect no match
a
/(a)(b)|(c)/
XcX\=ovector=2,get=1,get=2,get=3,get=4,getall
/x(?=ab\K)/allow_lookaround_bsk
xab\=get=0
xab\=copy=0
xab\=getall
/(?<A>a)|(?<A>b)/dupnames
a\=ovector=1,copy=A,get=A,get=2
a\=ovector=2,copy=A,get=A,get=2
b\=ovector=2,copy=A,get=A,get=2
/a(b)c(d)/
abc\=ph,copy=0,copy=1,getall
/^abc/info
/^abc/info,no_dotstar_anchor
/.*\d/info,auto_callout
\= Expect no match
aaa
/.*\d/info,no_dotstar_anchor,auto_callout
\= Expect no match
aaa
/.*\d/dotall,info
/.*\d/dotall,no_dotstar_anchor,info
/(*NO_DOTSTAR_ANCHOR)(?s).*\d/info
'^(?:(a)|b)(?(1)A|B)'
aA123\=ovector=1
aA123\=ovector=2
'^(?:(?<AA>a)|b)(?(<AA>)A|B)'
aA123\=ovector=1
aA123\=ovector=2
'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'dupnames
aA123\=ovector=1
aA123\=ovector=2
aA123\=ovector=3
'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\k{AA}'dupnames
aa123\=ovector=1
aa123\=ovector=2
aa123\=ovector=3
/(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/
/(?<N>(?J)(?<N>))(?-J)\k<N>/
# Quantifiers are not allowed on condition assertions, but are otherwise
# OK in conditions.
/(?(?=0)?)+/
/(?(?=0)(?=00)?00765)/
00765
/(?(?=0)(?=00)?00765|(?!3).56)/
00765
456
\= Expect no match
356
'^(a)*+(\w)'
g
g\=ovector=1
'^(?:a)*+(\w)'
g
g\=ovector=1
# These two pattern showeds up compile-time bugs
"((?2){0,1999}())?"
/((?+1)(\1))/B
# Callouts with string arguments
/a(?C"/
/a(?C"a/
/a(?C"a"/
/a(?C"a"bcde(?C"b")xyz/
/a(?C"a)b""c")/B
/ab(?C" any text with spaces ")cde/B
abcde
12abcde
/^a(b)c(?C1)def/
abcdef
/^a(b)c(?C"AB")def/
abcdef
/^a(b)c(?C1)def/
abcdef\=callout_capture
/^a(b)c(?C{AB})def/B
abcdef\=callout_capture
/(?C`a``b`)(?C'a''b')(?C"a""b")(?C^a^^b^)(?C%a%%b%)(?C#a##b#)(?C$a$$b$)(?C{a}}b})/B,callout_info
/(?:a(?C`code`)){3}/B
/^(?(?C25)(?=abc)abcd|xyz)/B,callout_info
abcdefg
xyz123
/^(?(?C$abc$)(?=abc)abcd|xyz)/B
abcdefg
xyz123
/^ab(?C'first')cd(?C"second")ef/
abcdefg
/(?:a(?C`code`)){3}X/
aaaXY
# Binary zero in callout string
# a ( ? C ' x z ' ) b
/ 61 28 3f 43 27 78 00 7a 27 29 62/hex,callout_info
abcdefgh
/(?(?!)^)/
/(?(?!)a|b)/
bbb
\= Expect no match
aaa
# JIT gives a different error message for the infinite recursion
"(*NO_JIT)((?2)+)((?1)){"
abcd{
# Perl fails to diagnose the absence of an assertion
"(?(?<E>.*!.*)?)"
"X((?2)()*+){2}+"B
"X((?2)()*+){2}"B
/(?<=\bABQ(3(?-7)))/
/(?<=\bABQ(3(?+7)))/
";(?<=()((?3))((?2)))"
# Perl loops on this (PCRE2 used to!)
/(?<=\Ka)/g,aftertext,allow_lookaround_bsk
aaaaa
/(?<=\Ka)/altglobal,aftertext,allow_lookaround_bsk
aaaaa
/((?2){73}(?2))((?1))/info
/abc/
\= Expect no match
\[9x!xxx(]{9999}
/(abc)*/
\[abc]{5}
/^/gm
\n\n\n
/^/gm,alt_circumflex
\n\n\n
/((((((((x))))))))\81/
xx1
/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\80/
xx
/\80/
/A\8B\9C/
A8B9C
/(?x:((?'a')) # comment (with parentheses) and | vertical
(?-x:#not a comment (?'b')) # this is a comment ()
(?'c')) # not a comment (?'d')/info
/(?|(?'a')(2)(?'b')|(?'a')(?'a')(3))/I,dupnames
A23B
B32A
# These are some patterns that used to cause buffer overflows or other errors
# while compiling.
/.((?2)(?R)|\1|$)()/B
/.((?3)(?R)()(?2)|\1|$)()/B
/(\9*+(?2);\3++()2|)++{/
/\V\x85\9*+((?2)\3++()2)*:2/
/(((?(R)){0,2}) (?'x'((?'R')((?'R')))))/dupnames
/(((?(X)){0,2}) (?'x'((?'X')((?'X')))))/dupnames
/(((?(R)){0,2}) (?'x'((?'X')((?'R')))))/
"(?J)(?'d'(?'d'\g{d}))"
"(?=!((?2)(?))({8(?<=(?1){29}8bbbb\x16\xd\xc6^($(\xa9H4){4}h}?1)B))\x15')"
/A(?'')Z/
"(?J:(?|(?'R')(\k'R')|((?'R'))))"
/(?<=|(\,\$(?73591620449005828816)\xa8.{7}){6}\x09)/
/^(?:(?(1)x|)+)+$()/B
/[[:>:]](?<)/
/((?x)(*:0))#(?'/
/(?C$[$)(?<]/
/(?C$)$)(?<]/
/(?(R))*+/B
abcd
/((?x)(?#))#(?'/
/((?x)(?#))#(?'abc')/I
/[[:\\](?<[::]/
/[[:\\](?'abc')[a:]/I
"[[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[:::::::::::::::::[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[[[:::E[[[:[:[[:[:::[[:::E[[[:[:[[:'[:::::E[[[:[::::::[[[:[[[[[[[::E[[[:[::::::[[[:[[[[[[[[:[[::[::::[[:::::::[[:[[[[[[[:[[::[:[[:[~"
/()(?(R)0)*+/B
/(?R-:(?</
/(?R-:(?<)/
/(?(?C{\Q})(?!(?'/
/(?(?C{\Q})(?!(?'abc')))/I
/(?1){3918}(((((0(\k'R'))))(?J)(?'R'(?'R'\3){99})))/I
/(?|(aaa)|(b))\g{1}/I
/(?|(aaa)|(b))(?1)/I
/(?|(aaa)|(b))/I
/(?|(?'a'aaa)|(?'a'b))\k'a'/I
/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/I,dupnames
/ab{3cd/
ab{3cd
/ab{3,cd/
ab{3,cd
/ab{3,4a}cd/
ab{3,4a}cd
/{4,5a}bc/
{4,5a}bc
/\x0{ab}/
\0{ab}
/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/
ababababbbabZXXXX
/.*?a(*PRUNE)b/
aab
/.*?a(*PRUNE)b/s
aab
/^a(*PRUNE)b/s
\= Expect no match
aab
/.*?a(*SKIP)b/
aab
/(?(8000000000/
/((?(R8000000000)))/
/0(?0)|(1)(*THEN)(*SKIP:0)(*FAIL)/
\= Expect no match
01
/(?(1)()\983040\2)/
/(*LIMIT_MATCH=)abc/
/(*CRLF)(*LIMIT_MATCH=)abc/
/(?:ab)?(?:ab)(?:ab)/
abab
ababab
\= Expect no match
aba
/((*MARK:A))++a(*SKIP:B)b/
\= Expect no match
aacb
/(*MARK:a\zb)z/alt_verbnames
/(*:ab\t(d\)c)xxx/
/(*:ab\t(d\)c)xxx/alt_verbnames,mark
cxxxz
/(*:A\Qxx)x\EB)x/alt_verbnames,mark
x
/(*:A\ExxxB)x/alt_verbnames,mark
x
/(*: A \ and #comment
\ B)x/x,alt_verbnames,mark
x
/(*: A \ and #comment
\ B)x/alt_verbnames,mark
x
/(*: A \ and #comment
\ B)x/x,mark
x
/(*: A \ and #comment
\ B)x/mark
x
/(*:A
B)x/alt_verbnames,mark
x
/(*:abc\Qpqr)/alt_verbnames
/abc/use_offset_limit
1234abcde\=offset_limit=100
1234abcde\=offset_limit=9
1234abcde\=offset_limit=4
1234abcde\=offset_limit=4,offset=4
\= Expect no match
1234abcde\=offset_limit=4,offset=5
1234abcde\=offset_limit=3
/(?<=abc)/use_offset_limit
1234abc\=offset_limit=7
\= Expect no match
1234abc\=offset_limit=6
/A/g,replace=-,use_offset_limit
XAXAXAXAXA\=offset_limit=4
/abc/
\= Expect error
1234abcde\=offset_limit=4
/^\w/m,use_offset_limit
\n..\naa\=offset_limit=3
\n..\naa\=offset_limit=4
/abcd/null_context
abcd\=null_context
\= Expect error - not allowed together
abcd\=null_context,find_limits
abcd\=allusedtext,startchar
/abcd/replace=w\rx\x82y\o{333}z(\Q12\$34$$\x34\E5$$),substitute_extended
abcd
/abcd/replace=w\rx\x82y\o{333}z(\Q12\$34$$\x34\E5$$),substitute_extended,substitute_literal
>>abcd<<
/abcd/g,replace=\$1$2\,substitute_literal
XabcdYabcdZ
/a(bc)(DE)/replace=a\u$1\U$1\E$1\l$2\L$2\Eab\Uab\LYZ\EDone,substitute_extended
abcDE
/abcd/replace=xy\kz,substitute_extended
abcd
/a(?:(b)|(c))/substitute_extended,replace=X${1:+1:-1}X${2:+2:-2}
ab
ac
ab\=replace=${1:+$1\:$1:$2}
ac\=replace=${1:+$1\:$1:$2}
>>ac<<\=replace=${1:+$1\:$1:$2},substitute_literal
/a(?:(b)|(c))/substitute_extended,replace=X${1:-1:-1}X${2:-2:-2}
ab
ac
/(a)/substitute_extended,replace=>${1:+\Q$1:{}$$\E+\U$1}<
a
/X(b)Y/substitute_extended
XbY\=replace=x${1:+$1\U$1}y
XbY\=replace=\Ux${1:+$1$1}y
/a/substitute_extended,replace=${*MARK:+a:b}
a
/(abcd)/replace=${1:+xy\kz},substitute_extended
abcd
/(abcd)/
abcd\=replace=${1:+xy\kz},substitute_extended
/abcd/substitute_extended,replace=>$1<
abcd
/abcd/substitute_extended,replace=>xxx${xyz}<<<
abcd
/(?J)(?:(?<A>a)|(?<A>b))/replace=<$A>
[a]
[b]
\= Expect error
(a)\=ovector=1
/(a)|(b)/replace=<$1>
\= Expect error
b
/(aa)(BB)/substitute_extended,replace=\U$1\L$2\E$1..\U$1\l$2$1
aaBB
/abcd/replace=wxyz,substitute_matched
abcd
pqrs
/abcd/g
>abcd1234abcd5678<\=replace=wxyz,substitute_matched
/^(o(\1{72}{\"{\\{00000059079}\d*){74}}){19}/I
/((p(?'K/
/((p(?'K/no_auto_capture
/abc/replace=A$3123456789Z
abc
/(?<!a{65535}a{5})x/I
/(?<!a{65535})x/I
/(?=a\K)/replace=z,allow_lookaround_bsk
BaCaD
/(?<=\K.)/g,replace=-,allow_lookaround_bsk
ab
/(?'abcdefghijklmnopqrstuvwxyzABCDEFGabcdefghijklmnopqrstuvwxyzABCDEabcdefghijklmnopqrstuvwxyzABCDEabcdefghijklmnopqrstuvwxyzABCDEFGH'toolong)/
/(?'abcdefghijklmnopqrstuvwxyzABCDEFGabcdefghijklmnopqrstuvwxyzABCDEabcdefghijklmnopqrstuvwxyzABCDEabcdefghijklmnopqrstuvwxyzABCDEFG'justright)/
# These two use zero-termination
/abcd/max_pattern_length=3
/abc/max_pattern_length=3
# These two, being hex, pass the length
/abcdefab/hex,max_pattern_length=3
/abcdef/hex,max_pattern_length=3
# Test compiled length limit
/(abcdefg){10}/max_pattern_compiled_length=100
# These patterns used to take a long time to compile
"(.*)
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))"xI
"(?<=a()
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
a)"xI
"(?|()|())(.*)
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))"xI
"(?|()|())(?<=a()
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
a)"xI
# Test the use of malloc for caching group information when there are more
# groups than fit into the on-stack workspace.
/\[()]{1024}/I,expand
# Test minlength capped at 65535
/(A{65000})\1{65000}/I
# Test group scans when numbers are not unique
/(?|()+|(a)+)/BI
/(?|(a)+|()+)/BI
/(?|()|(a))/BI
/(?|(a)|())/BI
# Test CRLF handling in empty string substitutions
/^$/gm,newline=anycrlf,replace=-
X\r\n\r\nY
/^$/gm,newline=crlf,replace=-
X\r\n\r\nY
/^$/gm,newline=any,replace=-
X\r\n\r\nY
"(*ANYCRLF)(?m)^(.*[^0-9\r\n].*|)$"g,replace=NaN
15\r\nfoo\r\n20\r\nbar\r\nbaz\r\n\r\n20
/a[[:punct:]b]/bincode
/a[b[:punct:]]/bincode
/L(?#(|++<!(2)?/B
/L(?#(|++<!(2)?/B,no_auto_possess
/L(?#(|++<!(2)?/B,auto_callout
/L(?#(|++<!(2)?/B,no_auto_possess,auto_callout
/(A*)\E+/B,auto_callout
/()\Q\E*]/B,auto_callout
a[bc]d
/\x8a+f|;T?(*:;.'?`(\xeap ){![^()!y*''C*(?';]{1;(\x08)/B,alt_verbnames,dupnames,extended
# Tests for NULL characters in comments and verb "names" and callouts
# /A#B\x00C\x0aZ/
/41 23 42 00 43 0a 5a/Bx,hex
# /A+#B\x00C\x0a+/
/41 2b 23 42 00 43 0a 2b/Bx,hex
# /A(*:B\x00W#X\00Y\x0aC)Z/
/41 28 2a 3a 42 00 57 23 58 00 59 0a 43 29 5a/Bx,hex,alt_verbnames
# /A(*:B\x00W#X\00Y\x0aC)Z/
/41 28 2a 3a 42 00 57 23 58 00 59 0a 43 29 5a/Bx,hex
# /A(?C{X\x00Y})B/
/41 28 3f 43 7b 58 00 59 7d 29 42/B,hex
# /A(?#X\x00Y)B/
/41 28 3f 23 7b 00 7d 29 42/B,hex
# Tests for leading comment in extended patterns
/ (?-x):?/extended
/ (?-x):?/extended
/0b 28 3f 2d 78 29 3a/hex,extended
/#comment
(?-x):?/extended
/(8(*:6^\x09x\xa6l\)6!|\xd0:[^:|)\x09d\Z\d{85*m(?'(?<1!)*\W[*\xff]!!h\w]*\xbe;/alt_bsux,alt_verbnames,allow_empty_class,dollar_endonly,extended,multiline,never_utf,no_dotstar_anchor,no_start_optimize
/a|(b)c/replace=>$1<,substitute_unset_empty
cat
xbcom
/a|(b)c/
cat\=replace=>$1<
cat\=replace=>$1<,substitute_unset_empty
xbcom\=replace=>$1<,substitute_unset_empty
/a|(b)c/substitute_extended
cat\=replace=>${2:-xx}<
cat\=replace=>${2:-xx}<,substitute_unknown_unset
cat\=replace=>${X:-xx}<,substitute_unknown_unset
/a|(?'X'b)c/replace=>$X<,substitute_unset_empty
cat
xbcom
/a|(?'X'b)c/replace=>$Y<,substitute_unset_empty
cat
cat\=substitute_unknown_unset
cat\=substitute_unknown_unset,-substitute_unset_empty
/a|(b)c/replace=>$2<,substitute_unset_empty
cat
cat\=substitute_unknown_unset
cat\=substitute_unknown_unset,-substitute_unset_empty
/()()()/use_offset_limit
\=ovector=11000000000
\=callout_fail=11000000000
\=callout_fail=1:11000000000
\=callout_data=11000000000
\=callout_data=-11000000000
\=offset_limit=1100000000000000000000
\=copy=11000000000
/(*MARK:A\x00b)/mark
abc
/(*MARK:A\x00b)/mark,alt_verbnames
abc
/"(*MARK:A" 00 "b)"/mark,hex
abc
/"(*MARK:A" 00 "b)"/mark,hex,alt_verbnames
abc
/efg/hex
/eff/hex
/effg/hex
/(?J)(?'a'))(?'a')/
/(?<=((?C)0))/
9010
\= Expect no match
abc
/aaa/
\[abc]{10000000000000000000000000000}
\[a]{3}
/\[AB]{6000000000000000000000}/expand
# Hex uses pattern length, not zero-terminated. This tests for overrunning
# the given length of a pattern.
/'(*U'/hex
/'(*'/hex
/'('/hex
//hex
# These tests are here because Perl never allows a back reference in a
# lookbehind. PCRE2 supports some limited cases.
/([ab])...(?<=\1)z/
a11az
b11bz
\= Expect no match
b11az
/(?|([ab]))...(?<=\1)z/
/([ab])(\1)...(?<=\2)z/
aa11az
/(a\2)(b\1)(?<=\2)/
/(?<A>[ab])...(?<=\k'A')z/
a11az
b11bz
\= Expect no match
b11az
/(?<A>[ab])...(?<=\k'A')(?<A>)z/dupnames
# Perl does not support \g+n
/((\g+1X)?([ab]))+/
aaXbbXa
/ab(?C1)c/auto_callout
abc
/'ab(?C1)c'/hex,auto_callout
abc
# Perl accepts these, but gives a warning. We can't warn, so give an error.
/[a-[:digit:]]+/
a-a9-a
/[A-[:digit:]]+/
A-A9-A
/[a-\d]+/
a-a9-a
/(?<RA>abc)(?(R)xyz)/B
/(?<R>abc)(?(R)xyz)/B
/(?=.*[A-Z])/I
/()(?<=(?0))/
/(?<!|!(?<!))/
/(?<!|!|!||||||(?<!)||(?<!)!|!||(?<!)!|!(?<!)!|!|!|!||||!!|<!)!|!||||!|/
/{2,2{2,2/use_length
/.>*?\g'0/use_length
/.>*?\g'0/
/{„Í„ÍÍ„Í{'{22{2{{2{'{22{{22{2{'{22{2{{2{{222{{2{'{22{2{22{2{'{22{2{{2{'{22{2{22{2{'{'{22{2{22{2{'{22{2{{2{'{22{2{22{2{'{222{2Ä„Í„ÍÍ„Í{'{22{2{{2{'{22{{11{2{'{22{2{{2{{'{22{2{{2{'{22{{22{1{'{22{2{{2{{222{{2{'{22{2{22{2{'{/auto_callout
//
\=get=i00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\=get=i2345678901234567890123456789012,get=i1245678901234567890123456789012
"(?(?C))"
/(?(?(?(?(?(?))))))/
/(?<=(?1))((?s))/anchored
/(*:ab)*/
%(*:(:(svvvvvvvvvv:]*[ Z!*;[]*[^[]*!^[+.+{{2,7}' _\\\\\\\\\\\\\)?.:.. *w////\\\Q\\\\\\\\\\\\\\\T\\\\\+/?/////'+\\\EEE?/////'+/*+/[^K]?]//(w)%never_backslash_c,alt_verbnames,auto_callout
/./newline=crlf
\=ph
/(\x0e00\000000\xc)/replace=\P,substitute_extended
\x0e00\000000\xc
//replace=0
\=offset=7
/(?<=\G.)/g,replace=+
abc
".+\QX\E+"B,no_auto_possess
".+\QX\E+"B,auto_callout,no_auto_possess
# This one is here because Perl gives an 'unmatched )' error which goes away
# if one of the \) sequences is removed - which is weird. PCRE finds it too
# complicated to find a minimum matching length.
"()X|((((((((()))))))((((())))))\2())((((((\2\2)))\2)(\22((((\2\2)2))\2)))(2\ZZZ)+:)Z^|91ZiZZnter(ZZ |91Z(ZZ ZZ(\r2Z( or#(\Z2(Z\Z(\2\2)2))\2Z)Z(\22Z((\Z2(Z\Z(\2\2)2))\2Z+:)Z|91Z(ZZ ZZ(\r2Z( or#(\Z2(Z\Z((Z*(\2(Z\':))\0)i|||||||||||||||loZ\2\2)2))\2Z)Z(\22Z((\Z2(Z\Z(\2\2)2))\2Z)))int \)\0nte!rnal errpr\2\\21r(2\ZZZ)+:)Z!|91Z(ZZ ZZ(\r2Z( or#(\Z2(Z\Z(\2\2)2))\2Z)Z(\22Z((\Z2(Z\Z(\2\2)2))\2Z)))int \)\0(2\ZZZ)+:)Z^|91ZiZZnter(ZZ |91Z(ZZ ZZ(\r2Z( or#(\Z2(Z\Z(\2\2)2))\2Z)Z(\22Z((\Z2(Z\Z(\2\2)2))\2Z)))int \)\0(2\ZZZ)+:)Z^)))int \)\0(2\ZZZ)+:)Z^|91ZiZZnter(ZZernZal ZZ(\r2Z( or#(\Z2(Z\Z(\2\2)2))\2Z)Z(\22Z((\Z2(Z\Z(\2\2)2))\2Z)))int \))\ZZ(\r2Z( or#(\Z2(Z\Z(\2\2)2))\2Z)Z(\22Z((\Z2(Z\Z(\2\2)))\2))))((((((\2\2))))))"I
# This checks that new code for handling groups that may match an empty string
# works on a very large number of alternatives. This pattern used to provoke a
# complaint that it was too complicated.
/(?:\[A|B|C|D|E|F|G|H|I|J|]{200}Z)/expand
# This one used to compile rubbish instead of a compile error, and then
# behave unpredictably at match time.
/.+(?(?C'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'))?!XXXX.=X/
.+(?(?C'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'))?!XXXX.=X
/[:[:alnum:]-[[a:lnum:]+/
/((?(?C'')\QX\E(?!((?(?C'')(?!X=X));=)r*X=X));=)/
/((?(?C'')\Q\E(?!((?(?C'')(?!X=X));=)r*X=X));=)/
/abcd/auto_callout
abcd\=callout_error=255:2
/()(\g+65534)/
/()(\g+65533)/
/Á\x00\x00\x00š(\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\2*\x00k\d+\x00‎\x00\x00\x00\x00\x00\2*\x00\x00\1*.){36}int^\x00\x00ÿÿ\x00š(\1{50779}?)J\w2/I
/(a)(b)\2\1\1\1\1/I
/(?<a>a)(?<b>b)\g{b}\g{a}\g{a}\g{a}\g{a}(?<a>xx)(?<b>zz)/I,dupnames
//
\=ovector=7777777777
# This is here because Perl matches, even though a COMMIT is encountered
# outside of the recursion.
/(?1)(A(*COMMIT)|B)D/
BAXBAD
"(?1){2}(a)"B
"(?1){2,4}(a)"B
# This test differs from Perl for the first subject. Perl ends up with
# $1 set to 'B'; PCRE2 has it unset (which I think is right).
/^(?:
(?:A| (?:B|B(*ACCEPT)) (?<=(.)) D)
(Z)
)+$/x
AZB
AZBDZ
# The first of these, when run by Perl, gives the mark 'aa', which is wrong.
'(?>a(*:aa))b|ac' mark
ac
'(?:a(*:aa))b|ac' mark
ac
/(R?){65}/
(R?){65}
/\[(a)]{60}/expand
aaaa
/(?<!\1((?U)1((?U))))(*F)/never_backslash_c,alt_bsux,anchored,extended
/\g{3/
/(a(?C1)(b)(c)d)+/
abcdabcd\=callout_capture
# Perl matches this one, but PCRE does not because (*ACCEPT) clears out any
# pending backtracks in the recursion.
/^ (?(DEFINE) (..(*ACCEPT)|...) ) (?1)$/x
\= Expect no match
abc
# Perl gives no match for this one
/(a(*MARK:m)(*ACCEPT)){0}(?1)/mark
abc
/abc/endanchored
xyzabc
\= Expect no match
xyzabcdef
\= Expect error
xyzabc\=ph
/abc/
xyzabc\=endanchored
\= Expect no match
xyzabcdef\=endanchored
\= Expect error
xyzabc\=ps,endanchored
/abc(*ACCEPT)d/endanchored
xyzabc
\= Expect no match
xyzabcdef
/abc|bcd/endanchored
xyzabcd
\= Expect no match
xyzabcdef
/a(*ACCEPT)x|aa/endanchored
aaa
# Check auto-anchoring when there is a group that is never obeyed at
# the start of a branch.
/(?(DEFINE)(a))^bc/I
/(a){0}.*bc/sI
# This should be anchored, as the condition is always false and there is
# no alternative branch.
/(?(VERSION>=999)yes)^bc/I
# This should not be anchored.
/(?(VERSION>=999)yes|no)^bc/I
/(*LIMIT_HEAP=0)xxx/I
/\d{0,3}(*:abc)(?C1)xxx/callout_info
# ----------------------------------------------------------------------
# These are a whole pile of tests that touch lines of code that are not
# used by any other tests (at least when these were created).
/^a+?x/i,no_start_optimize,no_auto_possess
\= Expect no match
aaa
/^[^a]{3,}?x/i,no_start_optimize,no_auto_possess
\= Expect no match
bbb
cc
/^X\S/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\W/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\H/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\h/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\V/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\v/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\h/no_start_optimize,no_auto_possess
\= Expect no match
XY
/^X\V/no_start_optimize,no_auto_possess
\= Expect no match
X\n
/^X\v/no_start_optimize,no_auto_possess
\= Expect no match
XX
/^X.+?/s,no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\R+?/no_start_optimize,no_auto_possess
\= Expect no match
XX
/^X\H+?/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\h+?/no_start_optimize,no_auto_possess
\= Expect no match
X
/^X\V+?/no_start_optimize,no_auto_possess
\= Expect no match
X
X\n
/^X\D+?/no_start_optimize,no_auto_possess
\= Expect no match
X
X9
/^X\S+?/no_start_optimize,no_auto_possess
\= Expect no match
X
X\n
/^X\W+?/no_start_optimize,no_auto_possess
\= Expect no match
X
XX
/^X.+?Z/no_start_optimize,no_auto_possess
\= Expect no match
XY\n
/(*CRLF)^X.+?Z/no_start_optimize,no_auto_possess
\= Expect no match
XY\r\=ps
/^X\R+?Z/no_start_optimize,no_auto_possess
\= Expect no match
X\nX
X\n\r\n
X\n\rY
X\n\nY
X\n\x{0c}Y
/(*BSR_ANYCRLF)^X\R+?Z/no_start_optimize,no_auto_possess
\= Expect no match
X\nX
X\n\r\n
X\n\rY
X\n\nY
X\n\x{0c}Y
/^X\H+?Z/no_start_optimize,no_auto_possess
\= Expect no match
XY\t
XYY
/^X\h+?Z/no_start_optimize,no_auto_possess
\= Expect no match
X\t\t
X\tY
/^X\V+?Z/no_start_optimize,no_auto_possess
\= Expect no match
XY\n
XYY
/^X\v+?Z/no_start_optimize,no_auto_possess
\= Expect no match
X\n\n
X\nY
/^X\D+?Z/no_start_optimize,no_auto_possess
\= Expect no match
XY9
XYY
/^X\d+?Z/no_start_optimize,no_auto_possess
\= Expect no match
X99
X9Y
/^X\S+?Z/no_start_optimize,no_auto_possess
\= Expect no match
XY\n
XYY
/^X\s+?Z/no_start_optimize,no_auto_possess
\= Expect no match
X\n\n
X\nY
/^X\W+?Z/no_start_optimize,no_auto_possess
\= Expect no match
X.A
X++
/^X\w+?Z/no_start_optimize,no_auto_possess
\= Expect no match
Xa.
Xaa
/^X.{1,3}Z/s,no_start_optimize,no_auto_possess
\= Expect no match
Xa.bd
/^X\h+Z/no_start_optimize,no_auto_possess
\= Expect no match
X\t\t
X\tY
/^X\V+Z/no_start_optimize,no_auto_possess
\= Expect no match
XY\n
XYY
/^(X(*THEN)Y|AB){0}(?1)/
ABX
\= Expect no match
XAB
/^(?!A(?C1)B)C/
ABC\=callout_error=1,no_jit
/^(?!A(?C1)B)C/no_start_optimize
ABC\=callout_error=1
/^(?(?!A(?C1)B)C)/
ABC\=callout_error=1
# ----------------------------------------------------------------------
/[a b c]/BxxI
/[a b c]/BxxxI
/[a b c]/B,extended_more
/[ a b c ]/B,extended_more
/[a b](?xx: [ 12 ] (?-xx:[ 34 ]) )y z/B
# Unsetting /x also unsets /xx
/[a b](?xx: [ 12 ] (?-x:[ 34 ]) )y z/B
/(a)(?-n:(b))(c)/nB
# ----------------------------------------------------------------------
# These test the dangerous PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL option.
/\j\x{z}\o{82}\L\uabcd\u\U\g{\g/B,\bad_escape_is_literal
/\N{\c/IB,bad_escape_is_literal
/[\j\x{z}\o\gAb\g]/B,bad_escape_is_literal
/[Q-\N]/B,bad_escape_is_literal
/[\s-_]/bad_escape_is_literal
/[_-\s]/bad_escape_is_literal
/[\B\R\X]/B
/[\B\R\X]/B,bad_escape_is_literal
/[A-\BP-\RV-\X]/B
/[A-\BP-\RV-\X]/B,bad_escape_is_literal
# ----------------------------------------------------------------------
/a\b(c/literal
a\\b(c
/a\b(c/literal,caseless
a\\b(c
a\\B(c
/a\b(c/literal,firstline
XYYa\\b(c
\= Expect no match
X\na\\b(c
/a\b?c/literal,use_offset_limit
XXXXa\\b?c\=offset_limit=4
\= Expect no match
XXXXa\\b?c\=offset_limit=3
/a\b(c/literal,anchored,endanchored
a\\b(c
\= Expect no match
Xa\\b(c
a\\b(cX
Xa\\b(cX
//literal,extended
/a\b(c/literal,auto_callout,no_start_optimize
XXXXa\\b(c
/a\b(c/literal,auto_callout
XXXXa\\b(c
/(*CR)abc/literal
(*CR)abc
/cat|dog/I,match_word
the cat sat
\= Expect no match
caterpillar
snowcat
syndicate
/(cat)|dog/I,match_line,literal
(cat)|dog
\= Expect no match
the cat sat
caterpillar
snowcat
syndicate
/a whole line/match_line,multiline
Rhubarb \na whole line\n custard
\= Expect no match
Not a whole line
# Perl gets this wrong, failing to capture 'b' in group 1.
/^(b+|a){1,2}?bc/
bbc
# And again here, for the "babc" subject string.
/^(b*|ba){1,2}?bc/
babc
bbabc
bababc
\= Expect no match
bababbc
babababc
/[[:digit:]-a]/
/[[:digit:]-[:print:]]/
/[\d-a]/
/[\H-z]/
/[\d-[:print:]]/
# Perl gets the second of these wrong, giving no match.
"(?<=(a))\1?b"I
ab
aaab
"(?=(a))\1?b"I
ab
aaab
# JIT does not support callout_extra
/(*NO_JIT)(a+)b/auto_callout,no_start_optimize,no_auto_possess
\= Expect no match
aac\=callout_extra
/(*NO_JIT)a+(?C'XXX')b/no_start_optimize,no_auto_possess
\= Expect no match
aac\=callout_extra
/\n/firstline
xyz\nabc
/\nabc/firstline
xyz\nabc
/\x{0a}abc/firstline,newline=crlf
\= Expect no match
xyz\r\nabc
/[abc]/firstline
\= Expect no match
\na
# These tests are matched in test 1 as they are Perl compatible. Here we are
# looking at what does and does not get auto-possessified.
/(?(DEFINE)(?<optional_a>a?))^(?&optional_a)a$/B
/(?(DEFINE)(?<optional_a>a?)X)^(?&optional_a)a$/B
/^(a?)b(?1)a/B
/^(a?)+b(?1)a/B
/^(a?)++b(?1)a/B
/^(a?)+b/B
/(?=a+)a(a+)++b/B
/(?<=(?=.){4,5}x)/B
# Perl behaves differently with these when optimization is turned off
/a(*PRUNE:X)bc|qq/mark,no_start_optimize
\= Expect no match
axy
/a(*THEN:X)bc|qq/mark,no_start_optimize
\= Expect no match
axy
/(?^x-i)AB/
/(?^-i)AB/
/(?x-i-i)/
/(?(?=^))b/I
abc
/(?(?=^)|)b/I
abc
/(?(?=^)|^)b/I
bbc
\= Expect no match
abc
/(?(1)^|^())/I
/(?(1)^())b/I
/(?(1)^())+b/I,aftertext
abc
/(?(1)^()|^)+b/I,aftertext
bbc
\= Expect no match
abc
/(?(1)^()|^)*b/I,aftertext
bbc
abc
xbc
/(?(1)^())+b/I,aftertext
abc
/(?(1)^a()|^a)+b/I,aftertext
abc
\= Expect no match
bbc
/(?(1)^|^(a))+b/I,aftertext
abc
\= Expect no match
bbc
/(?(1)^a()|^a)*b/I,aftertext
abc
bbc
xbc
/a(b)c|xyz/g,allvector,replace=<$0>
abcdefabcpqr\=ovector=4
abxyz\=ovector=4
abcdefxyz\=ovector=4
/a(b)c|xyz/allvector
abcdef\=ovector=4
abxyz\=ovector=4
/a(b)c|xyz/g,replace=<$0>,substitute_callout
abcdefabcpqr
abxyzpqrabcxyz
12abc34xyz99abc55\=substitute_stop=2
12abc34xyz99abc55\=substitute_skip=1
12abc34xyz99abc55\=substitute_skip=2
/a(b)c|xyz/g,replace=<$0>
abcdefabcpqr
abxyzpqrabcxyz
12abc34xyz\=substitute_stop=2
12abc34xyz\=substitute_skip=1
/a(b)c|xyz/replace=<$0>
abcdefabcpqr
12abc34xyz\=substitute_skip=1
12abc34xyz\=substitute_stop=1
/abc\rdef/
abc\ndef
/abc\rdef\x{0d}xyz/escaped_cr_is_lf
abc\ndef\rxyz
\= Expect no match
abc\ndef\nxyz
/(?(*ACCEPT)xxx)/
/(?(*atomic:xx)xxx)/
/(?(*script_run:xxx)zzz)/
/foobar/
the foobar thing\=copy_matched_subject
the foobar thing\=copy_matched_subject,zero_terminate
/foobar/g
the foobar thing foobar again\=copy_matched_subject
/(*:XX)^abc/I
/(*COMMIT:XX)^abc/I
/(*ACCEPT:XX)^abc/I
/abc/replace=xyz
abc\=null_context
/abc/replace=xyz,substitute_callout
abc
\= Expect error message
abc\=null_context
/\[()]{65535}()/expand
/\[()]{65535}(?<A>)/expand
/a(?:(*ACCEPT))??bc/
abc
axy
/a(*ACCEPT)??bc/
abc
axy
/a(*ACCEPT:XX)??bc/mark
abc
axy
/(*:\)?/
/(*:\Q \E){5}/alt_verbnames
/(?=abc)/I
/(?|(X)|(XY))\1abc/I
/(?|(a)|(bcde))(c)\2/I
/(?|(a)|(bcde))(c)\1/I
/(?|(?'A'a)|(?'A'bcde))(?'B'c)\k'B'(?'A')/I,dupnames
/(?|(?'A'a)|(?'A'bcde))(?'B'c)\k'A'(?'A')/I,dupnames
/((a|)+)+Z/I
/((?=a))[abcd]/I
/A(?:(*ACCEPT))?B/info
/(A(*ACCEPT)??B)C/
ABC
AXY
/(?<=(?<=a)b)c.*/I
abc\=ph
\= Expect no match
xbc\=ph
/(?<=ab)c.*/I
abc\=ph
\= Expect no match
xbc\=ph
/(?<=a(?<=a|a)c)/I
/(?<=a(?<=a|ba)c)/I
/(?<=(?<=a)b)(?<!abcd)/I
/(?<=(?<=a)b)(?<!abcd)(?<=(?<=a)bcde)/I
# Addition overflow
/( {32742} {42})(?<!\1{65481})/
# Multiplication overflow
/(X{65535})(?<=\1{32770})/
# ---- Non-atomic assertion tests ----
# Expect error: not allowed as a condition
/(?(*napla:xx)bc)/
/\A(*pla:.*\b(\w++))(?>.*?\b\1\b){3}/
word1 word3 word1 word2 word3 word2 word2 word1 word3 word4
/\A(*napla:.*\b(\w++))(?>.*?\b\1\b){3}/
word1 word3 word1 word2 word3 word2 word2 word1 word3 word4
/\A(?*.*\b(\w++))(?>.*?\b\1\b){3}/
word1 word3 word1 word2 word3 word2 word2 word1 word3 word4
/(*plb:(.)..|(.)...)(\1|\2)/
abcdb\=offset=4
abcda\=offset=4
/(*naplb:(.)..|(.)...)(\1|\2)/
abcdb\=offset=4
abcda\=offset=4
/(?<*(.)..|(.)...)(\1|\2)/
abcdb\=offset=4
abcda\=offset=4
/(*non_atomic_positive_lookahead:ab)/B
/(*non_atomic_positive_lookbehind:ab)/B
/(*pla:ab+)/B
/(*napla:ab+)/B
/(*napla:)+/
/(*naplb:)+/
/(*napla:^x|^y)/I
/(*napla:abc|abd)/I
/(*napla:a|(.)(*ACCEPT)zz)\1../
abcd
/(*napla:a(*ACCEPT)zz|(.))\1../
abcd
/(*napla:a|(*COMMIT)(.))\1\1/
aabc
\= Expect no match
abbc
/(*napla:a|(.))\1\1/
aabc
abbc
/(*naplb:ab?c|PQ).../g
abcdefgacxyzPQR123
# ----
# Expect error (recursion => not fixed length)
/(\2)((?=(?<=\1)))/
/c*+(?<=[bc])/
abc\=ph
ab\=ph
abc\=ps
ab\=ps
/c++(?<=[bc])/
abc\=ph
ab\=ph
/(?<=(?=.(?<=x)))/
abx
ab\=ph
bxyz
xyz
/\z/
abc\=ph
abc\=ps
/\Z/
abc\=ph
abc\=ps
abc\n\=ph
abc\n\=ps
/(?![ab]).*/
ab\=ph
/c*+/
ab\=ph,offset=2
/\A\s*(a|(?:[^`]{28500}){4})/I
a
/\A\s*((?:[^`]{28500}){4})/I
/\A\s*((?:[^`]{28500}){4}|a)/I
a
/(?<A>a)(?(<A>)b)((?<=b).*)/B
/(?(1)b)((?<=b).*)/B
/(?(R1)b)((?<=b).*)/B
/(?(DEFINE)b)((?<=b).*)/B
/(?(VERSION=10.3)b)((?<=b).*)/B
/[aA]b[cC]/IB
/[cc]abcd/I
/[Cc]abcd/I
/[c]abcd/I
/(?:c|C)abcd/I
/(a)?a/I
manm
/^(?|(\*)(*napla:\S*_(\2?+.+))|(\w)(?=\S*_(\2?+\1)))+_\2$/
*abc_12345abc
/^(?|(\*)(*napla:\S*_(\3?+.+))|(\w)(?=\S*_((\2?+\1))))+_\2$/
*abc_12345abc
/^((\1+)(?C)|\d)+133X$/
111133X\=callout_capture
/abc/replace=xyz,substitute_replacement_only
123abc456
/a(?<ONE>b)c(?<TWO>d)e/g,replace=X$ONE+${TWO}Z,substitute_replacement_only
"abcde-abcde-"
/a(b)c|xyz/g,replace=<$0>,substitute_callout,substitute_replacement_only
abcdefabcpqr
abxyzpqrabcxyz
12abc34xyz99abc55\=substitute_stop=2
12abc34xyz99abc55\=substitute_skip=1
12abc34xyz99abc55\=substitute_skip=2
/a(..)d/replace=>$1<,substitute_matched
xyzabcdxyzabcdxyz
xyzabcdxyzabcdxyz\=ovector=2
\= Expect error
xyzabcdxyzabcdxyz\=ovector=1
/a(..)d/g,replace=>$1<,substitute_matched
xyzabcdxyzabcdxyz
xyzabcdxyzabcdxyz\=ovector=2
\= Expect error
xyzabcdxyzabcdxyz\=ovector=1
xyzabcdxyzabcdxyz\=ovector=1,substitute_unset_empty
/55|a(..)d/g,replace=>$1<,substitute_matched
xyz55abcdxyzabcdxyz\=ovector=2,substitute_unset_empty
\= Expect error
xyz55abcdxyzabcdxyz\=ovector=2
/55|a(..)d/replace=>$1<,substitute_matched
xyz55abcdxyzabcdxyz\=ovector=2,substitute_unset_empty
/55|a(..)d/replace=>$1<
xyz55abcdxyzabcdxyz\=ovector=2,substitute_unset_empty
/55|a(..)d/g,replace=>$1<
xyz55abcdxyzabcdxyz\=ovector=2,substitute_unset_empty
/abc/replace=,caseless
XabcY
XABCY
/abc/replace=[4],caseless
XabcY
XABCY
/abc/replace=*,caseless
XabcY
XABCY
XabcY\=replace=
# Expect non-fixed-length error
"(?<=X(?(DEFINE)(.*))(?1))."
/\sxxx\s/tables=1
\= Expect no match
AB\x{85}xxx\x{a0}XYZ
/\sxxx\s/tables=2
AB\x{85}xxx\x{a0}XYZ
/^\w+/tables=2
École
/^\w+/tables=3
École
#loadtables ./testbtables
/^\w+/tables=3
École
/"(*MARK:>" 00 "<).."/hex,mark,no_start_optimize
AB
A\=ph
\= Expect no match
A
/"(*MARK:>" 00 "<).(?C1)."/hex,mark,no_start_optimize
AB
/(?(VERSION=0.0/
# Perl has made \K in lookarounds an error. PCRE2 now rejects as well, unless
# explicitly authorized.
/(?=a\Kb)ab/
/(?=a\Kb)ab/allow_lookaround_bsk
ab
/(?!a\Kb)ac/
/(?!a\Kb)ac/allow_lookaround_bsk
ac
/^abc(?<=b\Kc)d/
/^abc(?<=b\Kc)d/allow_lookaround_bsk
abcd
/^abc(?<!b\Kq)d/
/^abc(?<!b\Kq)d/,allow_lookaround_bsk
abcd
# ---------
# Tests for zero-length NULL to be treated as an empty string.
//
\=null_subject
\= Expect error
abc\=null_subject
//replace=[20]
abc\=null_replacement
\=null_subject
\=null_replacement
/X*/g,replace=xy
\= Expect error
>X<\=null_replacement
/X+/replace=[20]
>XX<\=null_replacement
# ---------
/[Aa]{2}/BI
aabcd
/A{2}/iBI
aabcd
/[Aa]{2,3}/BI
aabcd
--
\[X]{-10}
# Check imposition of maximum by match_data_create().
/abcd/
abcd\=ovector=65536
# Use recurse to test \K and Mark in atomic scope.
/(?>this line\s*((?R)|)\K)/
this line this line this line
/(?>this line\s*((?R)|)(*MARK:A))/
this line this line this line
# Check use of NULL pattern with zero length.
//null_pattern,use_length
abc
//null_pattern
/bad null pattern/null_pattern,use_length
/bad null pattern/null_pattern
# -------- Variable length lookbehinds --------
/12345(?<=\d{1,256})X/
/(?<=(\d{1,256}))X/max_varlookbehind=256
12345XYZ
/12345(?<=a?bc)X/max_varlookbehind=0
/12345(?<=abc)X/max_varlookbehind=0
/(?<!( {65054}){9,44965})/
/(?(?<!|(|a)))/
aaaa\=get=0
/(?(?<!|a?))/
aaaa\=get=0
# --------
/(?<=(()()()()()()()()()()()()()(()()()()(())()()()()(()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()(())()()()()(()()()()()()(()()()()()()()()()()()()()()()()()()()()()(())()()()()(()()()()()()()()()()()()()(()()()()()()()()()()()()()(()())))))))))/
/(?<!( {65054}){0,44965})/auto_callout
/A+{,3}/
/(\g{+1}Z|(A))+/
BAAZCD
ZAAAZAZAZAACD
# This doesn't work in Perl (though I think it used to)
/^(?=.*(?=(([A-Z]).*(?(1)\1)))(?!.+\2)){26}/i
The quick brown fox jumps over the lazy dog.
Jackdaws love my big sphinx of quartz.
Pack my box with five dozen liquor jugs.
\= Expect no match
The quick brown fox jumps over the lazy cat.
Hackdaws love my big sphinx of quartz.
Pack my fox with five dozen liquor jugs.
# These are different to Perl because of the different capturing in repeating
# groups.
/((foo)|(bar))*/
foobar
/(?:(f)(o)(o)|(b)(a)(r))*/
foobar
/((Z)+|A)*/
ZABCDEFG
/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/g,dupnames
bbbaaabaabb
# --------
/
/anchored, firstline
\x0a
/
/anchored,firstline,no_start_optimize
\x0a
/
/firstline
\x0a
abc\x0adef
# This test is currently broken in the interpreter
# /|a(?0)/endanchored
# aaaa
/A +/extended
/(*ACCEPT)+/B,auto_callout
/a\z/
a
a\=noteol
# This matches a character that only exists once in the subject, sort of like a
# hypothetical "(.)(?<!\1.+)(?!.*\1)". That has unlimited variable length
# lookbehind, so is invalid. This pattern doesn't work in Perl 5.38.0.
/\G(?:(?=(\1.|)(.))){1,13}?(?!.*\2.*\2)\1\K\2/g
aaabcccdeee
/|(?0)./endanchored
abcd
/|a(?0)/endanchored
aaaa
/(?:|(?0).)(?(R)|\z)/
abcd
/a?(?=b(*COMMIT)c|)d/I
bd
/(?=b(*COMMIT)c|)d/I
bd
/a?(?=b(*COMMIT)c|)d/I,no_start_optimize
bd
/(?=b(*COMMIT)c|)d/I,no_start_optimize
bd
/a?(?=bc|)d/I,auto_callout
bd
/a?(?=bc|)\bd/I
bd
/(?0)/
abc\=disable_recurseloop_check,match_limit=100
/(a(?1)z||(?1)++)$/
abcd\=disable_recurseloop_check
/(((?<=123?456456|ABC)))(?<=\2)../
ABCDEFG
12345645678910
# This test is crashing Perl 5.38.2.
/[^\S\W]{6}/
.abc def..
# End of testinput2