blob: 93b21c19b4226d95e82ab773fd920250513df7a7 [file] [log] [blame]
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001# This set of tests is for features that are compatible with all versions of
2# Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and
Elliott Hughes2dbd7d22020-06-03 14:32:37 -07003# 32-bit PCRE libraries, and also using the perltest.sh script.
Elliott Hughes3435c422020-12-04 13:18:28 -08004
5# WARNING: Use only / as the pattern delimiter. Although pcre2test supports
6# a number of delimiters, all those other than / give problems with the
7# perltest.sh script.
Nick Kralevichf73ff172014-09-27 12:41:49 -07008
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01009#forbid_utf
10#newline_default lf any anycrlf
11#perltest
Nick Kralevichf73ff172014-09-27 12:41:49 -070012
13/the quick brown fox/
14 the quick brown fox
Nick Kralevichf73ff172014-09-27 12:41:49 -070015 What do you know about the quick brown fox?
Janis Danisevskis112c9cc2016-03-31 13:35:25 +010016\= Expect no match
17 The quick brown FOX
Nick Kralevichf73ff172014-09-27 12:41:49 -070018 What do you know about THE QUICK BROWN FOX?
19
20/The quick brown fox/i
21 the quick brown fox
22 The quick brown FOX
23 What do you know about the quick brown fox?
24 What do you know about THE QUICK BROWN FOX?
25
26/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
27 abcd\t\n\r\f\a\e9;\$\\?caxyz
28
29/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
30 abxyzpqrrrabbxyyyypqAzz
31 abxyzpqrrrabbxyyyypqAzz
32 aabxyzpqrrrabbxyyyypqAzz
33 aaabxyzpqrrrabbxyyyypqAzz
34 aaaabxyzpqrrrabbxyyyypqAzz
35 abcxyzpqrrrabbxyyyypqAzz
36 aabcxyzpqrrrabbxyyyypqAzz
37 aaabcxyzpqrrrabbxyyyypAzz
38 aaabcxyzpqrrrabbxyyyypqAzz
39 aaabcxyzpqrrrabbxyyyypqqAzz
40 aaabcxyzpqrrrabbxyyyypqqqAzz
41 aaabcxyzpqrrrabbxyyyypqqqqAzz
42 aaabcxyzpqrrrabbxyyyypqqqqqAzz
43 aaabcxyzpqrrrabbxyyyypqqqqqqAzz
44 aaaabcxyzpqrrrabbxyyyypqAzz
45 abxyzzpqrrrabbxyyyypqAzz
46 aabxyzzzpqrrrabbxyyyypqAzz
47 aaabxyzzzzpqrrrabbxyyyypqAzz
48 aaaabxyzzzzpqrrrabbxyyyypqAzz
49 abcxyzzpqrrrabbxyyyypqAzz
50 aabcxyzzzpqrrrabbxyyyypqAzz
51 aaabcxyzzzzpqrrrabbxyyyypqAzz
52 aaaabcxyzzzzpqrrrabbxyyyypqAzz
53 aaaabcxyzzzzpqrrrabbbxyyyypqAzz
54 aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
55 aaabcxyzpqrrrabbxyyyypABzz
56 aaabcxyzpqrrrabbxyyyypABBzz
57 >>>aaabxyzpqrrrabbxyyyypqAzz
58 >aaaabxyzpqrrrabbxyyyypqAzz
59 >>>>abcxyzpqrrrabbxyyyypqAzz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +010060\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -070061 abxyzpqrrabbxyyyypqAzz
62 abxyzpqrrrrabbxyyyypqAzz
63 abxyzpqrrrabxyyyypqAzz
64 aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
65 aaaabcxyzzzzpqrrrabbbxyyypqAzz
66 aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
67
68/^(abc){1,2}zz/
69 abczz
70 abcabczz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +010071\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -070072 zz
73 abcabcabczz
74 >>abczz
75
76/^(b+?|a){1,2}?c/
77 bc
78 bbc
79 bbbc
80 bac
81 bbac
82 aac
83 abbbbbbbbbbbc
84 bbbbbbbbbbbac
Janis Danisevskis112c9cc2016-03-31 13:35:25 +010085\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -070086 aaac
87 abbbbbbbbbbbac
88
89/^(b+|a){1,2}c/
90 bc
91 bbc
92 bbbc
93 bac
94 bbac
95 aac
96 abbbbbbbbbbbc
97 bbbbbbbbbbbac
Janis Danisevskis112c9cc2016-03-31 13:35:25 +010098\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -070099 aaac
100 abbbbbbbbbbbac
101
Nick Kralevichf73ff172014-09-27 12:41:49 -0700102/^(ba|b*){1,2}?bc/
103 babc
104 bbabc
105 bababc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100106\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700107 bababbc
108 babababc
109
110/^\ca\cA\c[;\c:/
111 \x01\x01\e;z
112
113/^[ab\]cde]/
114 athing
115 bthing
116 ]thing
117 cthing
118 dthing
119 ething
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100120\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700121 fthing
122 [thing
123 \\thing
124
125/^[]cde]/
126 ]thing
127 cthing
128 dthing
129 ething
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100130\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700131 athing
132 fthing
133
134/^[^ab\]cde]/
135 fthing
136 [thing
137 \\thing
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100138\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700139 athing
140 bthing
141 ]thing
142 cthing
143 dthing
144 ething
145
146/^[^]cde]/
147 athing
148 fthing
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100149\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700150 ]thing
151 cthing
152 dthing
153 ething
154
155/^\/
156 
157
158/^ÿ/
159 ÿ
160
161/^[0-9]+$/
162 0
163 1
164 2
165 3
166 4
167 5
168 6
169 7
170 8
171 9
172 10
173 100
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100174\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700175 abc
176
177/^.*nter/
178 enter
179 inter
180 uponter
181
182/^xxx[0-9]+$/
183 xxx0
184 xxx1234
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100185\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700186 xxx
187
188/^.+[0-9][0-9][0-9]$/
189 x123
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100190 x1234
Nick Kralevichf73ff172014-09-27 12:41:49 -0700191 xx123
192 123456
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100193\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700194 123
Nick Kralevichf73ff172014-09-27 12:41:49 -0700195
196/^.+?[0-9][0-9][0-9]$/
197 x123
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100198 x1234
Nick Kralevichf73ff172014-09-27 12:41:49 -0700199 xx123
200 123456
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100201\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700202 123
Nick Kralevichf73ff172014-09-27 12:41:49 -0700203
204/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
205 abc!pqr=apquxz.ixr.zzz.ac.uk
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100206\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700207 !pqr=apquxz.ixr.zzz.ac.uk
208 abc!=apquxz.ixr.zzz.ac.uk
209 abc!pqr=apquxz:ixr.zzz.ac.uk
210 abc!pqr=apquxz.ixr.zzz.ac.ukk
211
212/:/
213 Well, we need a colon: somewhere
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100214\= Expect no match
215 Fail without a colon
Nick Kralevichf73ff172014-09-27 12:41:49 -0700216
217/([\da-f:]+)$/i
218 0abc
219 abc
220 fed
221 E
222 ::
223 5f03:12C0::932e
224 fed def
225 Any old stuff
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100226\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700227 0zzz
228 gzzz
229 fed\x20
230 Any old rubbish
231
232/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
233 .1.2.3
234 A.12.123.0
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100235\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700236 .1.2.3333
237 1.2.3
238 1234.2.3
239
240/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
241 1 IN SOA non-sp1 non-sp2(
242 1 IN SOA non-sp1 non-sp2 (
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100243\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700244 1IN SOA non-sp1 non-sp2(
245
246/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
247 a.
248 Z.
249 2.
250 ab-c.pq-r.
251 sxk.zzz.ac.uk.
252 x-.y-.
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100253\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700254 -abc.peq.
255
256/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
257 *.a
258 *.b0-a
259 *.c3-b.c
260 *.c-a.b-c
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100261\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700262 *.0
263 *.a-
264 *.a-b.c-
265 *.c-a.0-c
266
267/^(?=ab(de))(abd)(e)/
268 abde
269
270/^(?!(ab)de|x)(abd)(f)/
271 abdf
272
273/^(?=(ab(cd)))(ab)/
274 abcd
275
276/^[\da-f](\.[\da-f])*$/i
277 a.b.c.d
278 A.B.C.D
279 a.b.c.1.2.3.C
280
281/^\".*\"\s*(;.*)?$/
282 \"1234\"
283 \"abcd\" ;
284 \"\" ; rhubarb
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100285\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700286 \"1234\" : things
287
288/^$/
289 \
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100290\= Expect no match
291 A non-empty line
Nick Kralevichf73ff172014-09-27 12:41:49 -0700292
293/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
294 ab c
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100295\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700296 abc
297 ab cde
298
299/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
300 ab c
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100301\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700302 abc
303 ab cde
304
305/^ a\ b[c ]d $/x
306 a bcd
307 a b d
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100308\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700309 abcd
310 ab d
311
312/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
313 abcdefhijklm
314
315/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
316 abcdefhijklm
317
318/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
319 a+ Z0+\x08\n\x1d\x12
320
321/^[.^$|()*+?{,}]+/
322 .^\$(*+)|{?,?}
323
324/^a*\w/
325 z
326 az
327 aaaz
328 a
329 aa
330 aaaa
331 a+
332 aa+
333
334/^a*?\w/
335 z
336 az
337 aaaz
338 a
339 aa
340 aaaa
341 a+
342 aa+
343
344/^a+\w/
345 az
346 aaaz
347 aa
348 aaaa
349 aa+
350
351/^a+?\w/
352 az
353 aaaz
354 aa
355 aaaa
356 aa+
357
358/^\d{8}\w{2,}/
359 1234567890
360 12345678ab
361 12345678__
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100362\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700363 1234567
364
365/^[aeiou\d]{4,5}$/
366 uoie
367 1234
368 12345
369 aaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100370\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700371 123456
372
373/^[aeiou\d]{4,5}?/
374 uoie
375 1234
376 12345
377 aaaaa
378 123456
379
380/\A(abc|def)=(\1){2,3}\Z/
381 abc=abcabc
382 def=defdefdef
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100383\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700384 abc=defdef
385
386/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
387 abcdefghijkcda2
388 abcdefghijkkkkcda2
389
390/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
391 cataract cataract23
392 catatonic catatonic23
393 caterpillar caterpillar23
394
395
396/^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]/
397 From abcd Mon Sep 01 12:33:02 1997
398
399/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
400 From abcd Mon Sep 01 12:33:02 1997
401 From abcd Mon Sep 1 12:33:02 1997
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100402\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700403 From abcd Sep 01 12:33:02 1997
404
405/^12.34/s
406 12\n34
407 12\r34
408
409/\w+(?=\t)/
410 the quick brown\t fox
411
412/foo(?!bar)(.*)/
413 foobar is foolish see?
414
415/(?:(?!foo)...|^.{0,2})bar(.*)/
416 foobar crowbar etc
417 barrel
418 2barrel
419 A barrel
420
421/^(\D*)(?=\d)(?!123)/
422 abc456
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100423\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700424 abc123
425
426/^1234(?# test newlines
427 inside)/
428 1234
429
430/^1234 #comment in extended re
431 /x
432 1234
433
434/#rhubarb
435 abcd/x
436 abcd
437
438/^abcd#rhubarb/x
439 abcd
440
441/^(a)\1{2,3}(.)/
442 aaab
443 aaaab
444 aaaaab
445 aaaaaab
446
447/(?!^)abc/
448 the abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100449\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700450 abc
451
452/(?=^)abc/
453 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100454\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700455 the abc
456
457/^[ab]{1,3}(ab*|b)/
458 aabbbbb
459
460/^[ab]{1,3}?(ab*|b)/
461 aabbbbb
462
463/^[ab]{1,3}?(ab*?|b)/
464 aabbbbb
465
466/^[ab]{1,3}(ab*?|b)/
467 aabbbbb
468
469/ (?: [\040\t] | \(
470(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
471\) )* # optional leading comment
472(?: (?:
473[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
474(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
475|
476" (?: # opening quote...
477[^\\\x80-\xff\n\015"] # Anything except backslash and quote
478| # or
479\\ [^\x80-\xff] # Escaped something (something != CR)
480)* " # closing quote
481) # initial word
482(?: (?: [\040\t] | \(
483(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
484\) )* \. (?: [\040\t] | \(
485(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
486\) )* (?:
487[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
488(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
489|
490" (?: # opening quote...
491[^\\\x80-\xff\n\015"] # Anything except backslash and quote
492| # or
493\\ [^\x80-\xff] # Escaped something (something != CR)
494)* " # closing quote
495) )* # further okay, if led by a period
496(?: [\040\t] | \(
497(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
498\) )* @ (?: [\040\t] | \(
499(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
500\) )* (?:
501[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
502(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
503| \[ # [
504(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
505\] # ]
506) # initial subdomain
507(?: #
508(?: [\040\t] | \(
509(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
510\) )* \. # if led by a period...
511(?: [\040\t] | \(
512(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
513\) )* (?:
514[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
515(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
516| \[ # [
517(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
518\] # ]
519) # ...further okay
520)*
521# address
522| # or
523(?:
524[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
525(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
526|
527" (?: # opening quote...
528[^\\\x80-\xff\n\015"] # Anything except backslash and quote
529| # or
530\\ [^\x80-\xff] # Escaped something (something != CR)
531)* " # closing quote
532) # one word, optionally followed by....
533(?:
534[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or...
535\(
536(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
537\) | # comments, or...
538
539" (?: # opening quote...
540[^\\\x80-\xff\n\015"] # Anything except backslash and quote
541| # or
542\\ [^\x80-\xff] # Escaped something (something != CR)
543)* " # closing quote
544# quoted strings
545)*
546< (?: [\040\t] | \(
547(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
548\) )* # leading <
549(?: @ (?: [\040\t] | \(
550(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
551\) )* (?:
552[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
553(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
554| \[ # [
555(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
556\] # ]
557) # initial subdomain
558(?: #
559(?: [\040\t] | \(
560(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
561\) )* \. # if led by a period...
562(?: [\040\t] | \(
563(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
564\) )* (?:
565[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
566(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
567| \[ # [
568(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
569\] # ]
570) # ...further okay
571)*
572
573(?: (?: [\040\t] | \(
574(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
575\) )* , (?: [\040\t] | \(
576(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
577\) )* @ (?: [\040\t] | \(
578(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
579\) )* (?:
580[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
581(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
582| \[ # [
583(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
584\] # ]
585) # initial subdomain
586(?: #
587(?: [\040\t] | \(
588(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
589\) )* \. # if led by a period...
590(?: [\040\t] | \(
591(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
592\) )* (?:
593[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
594(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
595| \[ # [
596(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
597\] # ]
598) # ...further okay
599)*
600)* # further okay, if led by comma
601: # closing colon
602(?: [\040\t] | \(
603(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
604\) )* )? # optional route
605(?:
606[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
607(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
608|
609" (?: # opening quote...
610[^\\\x80-\xff\n\015"] # Anything except backslash and quote
611| # or
612\\ [^\x80-\xff] # Escaped something (something != CR)
613)* " # closing quote
614) # initial word
615(?: (?: [\040\t] | \(
616(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
617\) )* \. (?: [\040\t] | \(
618(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
619\) )* (?:
620[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
621(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
622|
623" (?: # opening quote...
624[^\\\x80-\xff\n\015"] # Anything except backslash and quote
625| # or
626\\ [^\x80-\xff] # Escaped something (something != CR)
627)* " # closing quote
628) )* # further okay, if led by a period
629(?: [\040\t] | \(
630(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
631\) )* @ (?: [\040\t] | \(
632(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
633\) )* (?:
634[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
635(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
636| \[ # [
637(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
638\] # ]
639) # initial subdomain
640(?: #
641(?: [\040\t] | \(
642(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
643\) )* \. # if led by a period...
644(?: [\040\t] | \(
645(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
646\) )* (?:
647[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
648(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
649| \[ # [
650(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
651\] # ]
652) # ...further okay
653)*
654# address spec
655(?: [\040\t] | \(
656(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
657\) )* > # trailing >
658# name and address
659) (?: [\040\t] | \(
660(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
661\) )* # optional trailing comment
662/x
663 Alan Other <user\@dom.ain>
664 <user\@dom.ain>
665 user\@dom.ain
666 \"A. Other\" <user.1234\@dom.ain> (a comment)
667 A. Other <user.1234\@dom.ain> (a comment)
668 \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
669 A missing angle <user\@some.where
Janis Danisevskis112c9cc2016-03-31 13:35:25 +0100670\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -0700671 The quick brown fox
672
673/[\040\t]* # Nab whitespace.
674(?:
675\( # (
676[^\\\x80-\xff\n\015()] * # normal*
677(?: # (
678(?: \\ [^\x80-\xff] |
679\( # (
680[^\\\x80-\xff\n\015()] * # normal*
681(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
682\) # )
683) # special
684[^\\\x80-\xff\n\015()] * # normal*
685)* # )*
686\) # )
687[\040\t]* )* # If comment found, allow more spaces.
688# optional leading comment
689(?:
690(?:
691[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
692(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
693# Atom
694| # or
695" # "
696[^\\\x80-\xff\n\015"] * # normal
697(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
698" # "
699# Quoted string
700)
701[\040\t]* # Nab whitespace.
702(?:
703\( # (
704[^\\\x80-\xff\n\015()] * # normal*
705(?: # (
706(?: \\ [^\x80-\xff] |
707\( # (
708[^\\\x80-\xff\n\015()] * # normal*
709(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
710\) # )
711) # special
712[^\\\x80-\xff\n\015()] * # normal*
713)* # )*
714\) # )
715[\040\t]* )* # If comment found, allow more spaces.
716(?:
717\.
718[\040\t]* # Nab whitespace.
719(?:
720\( # (
721[^\\\x80-\xff\n\015()] * # normal*
722(?: # (
723(?: \\ [^\x80-\xff] |
724\( # (
725[^\\\x80-\xff\n\015()] * # normal*
726(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
727\) # )
728) # special
729[^\\\x80-\xff\n\015()] * # normal*
730)* # )*
731\) # )
732[\040\t]* )* # If comment found, allow more spaces.
733(?:
734[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
735(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
736# Atom
737| # or
738" # "
739[^\\\x80-\xff\n\015"] * # normal
740(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
741" # "
742# Quoted string
743)
744[\040\t]* # Nab whitespace.
745(?:
746\( # (
747[^\\\x80-\xff\n\015()] * # normal*
748(?: # (
749(?: \\ [^\x80-\xff] |
750\( # (
751[^\\\x80-\xff\n\015()] * # normal*
752(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
753\) # )
754) # special
755[^\\\x80-\xff\n\015()] * # normal*
756)* # )*
757\) # )
758[\040\t]* )* # If comment found, allow more spaces.
759# additional words
760)*
761@
762[\040\t]* # Nab whitespace.
763(?:
764\( # (
765[^\\\x80-\xff\n\015()] * # normal*
766(?: # (
767(?: \\ [^\x80-\xff] |
768\( # (
769[^\\\x80-\xff\n\015()] * # normal*
770(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
771\) # )
772) # special
773[^\\\x80-\xff\n\015()] * # normal*
774)* # )*
775\) # )
776[\040\t]* )* # If comment found, allow more spaces.
777(?:
778[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
779(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
780|
781\[ # [
782(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
783\] # ]
784)
785[\040\t]* # Nab whitespace.
786(?:
787\( # (
788[^\\\x80-\xff\n\015()] * # normal*
789(?: # (
790(?: \\ [^\x80-\xff] |
791\( # (
792[^\\\x80-\xff\n\015()] * # normal*
793(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
794\) # )
795) # special
796[^\\\x80-\xff\n\015()] * # normal*
797)* # )*
798\) # )
799[\040\t]* )* # If comment found, allow more spaces.
800# optional trailing comments
801(?:
802\.
803[\040\t]* # Nab whitespace.
804(?:
805\( # (
806[^\\\x80-\xff\n\015()] * # normal*
807(?: # (
808(?: \\ [^\x80-\xff] |
809\( # (
810[^\\\x80-\xff\n\015()] * # normal*
811(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
812\) # )
813) # special
814[^\\\x80-\xff\n\015()] * # normal*
815)* # )*
816\) # )
817[\040\t]* )* # If comment found, allow more spaces.
818(?:
819[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
820(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
821|
822\[ # [
823(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
824\] # ]
825)
826[\040\t]* # Nab whitespace.
827(?:
828\( # (
829[^\\\x80-\xff\n\015()] * # normal*
830(?: # (
831(?: \\ [^\x80-\xff] |
832\( # (
833[^\\\x80-\xff\n\015()] * # normal*
834(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
835\) # )
836) # special
837[^\\\x80-\xff\n\015()] * # normal*
838)* # )*
839\) # )
840[\040\t]* )* # If comment found, allow more spaces.
841# optional trailing comments
842)*
843# address
844| # or
845(?:
846[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
847(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
848# Atom
849| # or
850" # "
851[^\\\x80-\xff\n\015"] * # normal
852(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
853" # "
854# Quoted string
855)
856# leading word
857[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces
858(?:
859(?:
860\( # (
861[^\\\x80-\xff\n\015()] * # normal*
862(?: # (
863(?: \\ [^\x80-\xff] |
864\( # (
865[^\\\x80-\xff\n\015()] * # normal*
866(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
867\) # )
868) # special
869[^\\\x80-\xff\n\015()] * # normal*
870)* # )*
871\) # )
872|
873" # "
874[^\\\x80-\xff\n\015"] * # normal
875(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
876" # "
877) # "special" comment or quoted string
878[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal"
879)*
880<
881[\040\t]* # Nab whitespace.
882(?:
883\( # (
884[^\\\x80-\xff\n\015()] * # normal*
885(?: # (
886(?: \\ [^\x80-\xff] |
887\( # (
888[^\\\x80-\xff\n\015()] * # normal*
889(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
890\) # )
891) # special
892[^\\\x80-\xff\n\015()] * # normal*
893)* # )*
894\) # )
895[\040\t]* )* # If comment found, allow more spaces.
896# <
897(?:
898@
899[\040\t]* # Nab whitespace.
900(?:
901\( # (
902[^\\\x80-\xff\n\015()] * # normal*
903(?: # (
904(?: \\ [^\x80-\xff] |
905\( # (
906[^\\\x80-\xff\n\015()] * # normal*
907(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
908\) # )
909) # special
910[^\\\x80-\xff\n\015()] * # normal*
911)* # )*
912\) # )
913[\040\t]* )* # If comment found, allow more spaces.
914(?:
915[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
916(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
917|
918\[ # [
919(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
920\] # ]
921)
922[\040\t]* # Nab whitespace.
923(?:
924\( # (
925[^\\\x80-\xff\n\015()] * # normal*
926(?: # (
927(?: \\ [^\x80-\xff] |
928\( # (
929[^\\\x80-\xff\n\015()] * # normal*
930(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
931\) # )
932) # special
933[^\\\x80-\xff\n\015()] * # normal*
934)* # )*
935\) # )
936[\040\t]* )* # If comment found, allow more spaces.
937# optional trailing comments
938(?:
939\.
940[\040\t]* # Nab whitespace.
941(?:
942\( # (
943[^\\\x80-\xff\n\015()] * # normal*
944(?: # (
945(?: \\ [^\x80-\xff] |
946\( # (
947[^\\\x80-\xff\n\015()] * # normal*
948(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
949\) # )
950) # special
951[^\\\x80-\xff\n\015()] * # normal*
952)* # )*
953\) # )
954[\040\t]* )* # If comment found, allow more spaces.
955(?:
956[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
957(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
958|
959\[ # [
960(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
961\] # ]
962)
963[\040\t]* # Nab whitespace.
964(?:
965\( # (
966[^\\\x80-\xff\n\015()] * # normal*
967(?: # (
968(?: \\ [^\x80-\xff] |
969\( # (
970[^\\\x80-\xff\n\015()] * # normal*
971(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
972\) # )
973) # special
974[^\\\x80-\xff\n\015()] * # normal*
975)* # )*
976\) # )
977[\040\t]* )* # If comment found, allow more spaces.
978# optional trailing comments
979)*
980(?: ,
981[\040\t]* # Nab whitespace.
982(?:
983\( # (
984[^\\\x80-\xff\n\015()] * # normal*
985(?: # (
986(?: \\ [^\x80-\xff] |
987\( # (
988[^\\\x80-\xff\n\015()] * # normal*
989(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
990\) # )
991) # special
992[^\\\x80-\xff\n\015()] * # normal*
993)* # )*
994\) # )
995[\040\t]* )* # If comment found, allow more spaces.
996@
997[\040\t]* # Nab whitespace.
998(?:
999\( # (
1000[^\\\x80-\xff\n\015()] * # normal*
1001(?: # (
1002(?: \\ [^\x80-\xff] |
1003\( # (
1004[^\\\x80-\xff\n\015()] * # normal*
1005(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1006\) # )
1007) # special
1008[^\\\x80-\xff\n\015()] * # normal*
1009)* # )*
1010\) # )
1011[\040\t]* )* # If comment found, allow more spaces.
1012(?:
1013[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
1014(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1015|
1016\[ # [
1017(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
1018\] # ]
1019)
1020[\040\t]* # Nab whitespace.
1021(?:
1022\( # (
1023[^\\\x80-\xff\n\015()] * # normal*
1024(?: # (
1025(?: \\ [^\x80-\xff] |
1026\( # (
1027[^\\\x80-\xff\n\015()] * # normal*
1028(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1029\) # )
1030) # special
1031[^\\\x80-\xff\n\015()] * # normal*
1032)* # )*
1033\) # )
1034[\040\t]* )* # If comment found, allow more spaces.
1035# optional trailing comments
1036(?:
1037\.
1038[\040\t]* # Nab whitespace.
1039(?:
1040\( # (
1041[^\\\x80-\xff\n\015()] * # normal*
1042(?: # (
1043(?: \\ [^\x80-\xff] |
1044\( # (
1045[^\\\x80-\xff\n\015()] * # normal*
1046(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1047\) # )
1048) # special
1049[^\\\x80-\xff\n\015()] * # normal*
1050)* # )*
1051\) # )
1052[\040\t]* )* # If comment found, allow more spaces.
1053(?:
1054[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
1055(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1056|
1057\[ # [
1058(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
1059\] # ]
1060)
1061[\040\t]* # Nab whitespace.
1062(?:
1063\( # (
1064[^\\\x80-\xff\n\015()] * # normal*
1065(?: # (
1066(?: \\ [^\x80-\xff] |
1067\( # (
1068[^\\\x80-\xff\n\015()] * # normal*
1069(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1070\) # )
1071) # special
1072[^\\\x80-\xff\n\015()] * # normal*
1073)* # )*
1074\) # )
1075[\040\t]* )* # If comment found, allow more spaces.
1076# optional trailing comments
1077)*
1078)* # additional domains
1079:
1080[\040\t]* # Nab whitespace.
1081(?:
1082\( # (
1083[^\\\x80-\xff\n\015()] * # normal*
1084(?: # (
1085(?: \\ [^\x80-\xff] |
1086\( # (
1087[^\\\x80-\xff\n\015()] * # normal*
1088(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1089\) # )
1090) # special
1091[^\\\x80-\xff\n\015()] * # normal*
1092)* # )*
1093\) # )
1094[\040\t]* )* # If comment found, allow more spaces.
1095# optional trailing comments
1096)? # optional route
1097(?:
1098[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
1099(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1100# Atom
1101| # or
1102" # "
1103[^\\\x80-\xff\n\015"] * # normal
1104(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
1105" # "
1106# Quoted string
1107)
1108[\040\t]* # Nab whitespace.
1109(?:
1110\( # (
1111[^\\\x80-\xff\n\015()] * # normal*
1112(?: # (
1113(?: \\ [^\x80-\xff] |
1114\( # (
1115[^\\\x80-\xff\n\015()] * # normal*
1116(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1117\) # )
1118) # special
1119[^\\\x80-\xff\n\015()] * # normal*
1120)* # )*
1121\) # )
1122[\040\t]* )* # If comment found, allow more spaces.
1123(?:
1124\.
1125[\040\t]* # Nab whitespace.
1126(?:
1127\( # (
1128[^\\\x80-\xff\n\015()] * # normal*
1129(?: # (
1130(?: \\ [^\x80-\xff] |
1131\( # (
1132[^\\\x80-\xff\n\015()] * # normal*
1133(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1134\) # )
1135) # special
1136[^\\\x80-\xff\n\015()] * # normal*
1137)* # )*
1138\) # )
1139[\040\t]* )* # If comment found, allow more spaces.
1140(?:
1141[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
1142(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1143# Atom
1144| # or
1145" # "
1146[^\\\x80-\xff\n\015"] * # normal
1147(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
1148" # "
1149# Quoted string
1150)
1151[\040\t]* # Nab whitespace.
1152(?:
1153\( # (
1154[^\\\x80-\xff\n\015()] * # normal*
1155(?: # (
1156(?: \\ [^\x80-\xff] |
1157\( # (
1158[^\\\x80-\xff\n\015()] * # normal*
1159(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1160\) # )
1161) # special
1162[^\\\x80-\xff\n\015()] * # normal*
1163)* # )*
1164\) # )
1165[\040\t]* )* # If comment found, allow more spaces.
1166# additional words
1167)*
1168@
1169[\040\t]* # Nab whitespace.
1170(?:
1171\( # (
1172[^\\\x80-\xff\n\015()] * # normal*
1173(?: # (
1174(?: \\ [^\x80-\xff] |
1175\( # (
1176[^\\\x80-\xff\n\015()] * # normal*
1177(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1178\) # )
1179) # special
1180[^\\\x80-\xff\n\015()] * # normal*
1181)* # )*
1182\) # )
1183[\040\t]* )* # If comment found, allow more spaces.
1184(?:
1185[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
1186(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1187|
1188\[ # [
1189(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
1190\] # ]
1191)
1192[\040\t]* # Nab whitespace.
1193(?:
1194\( # (
1195[^\\\x80-\xff\n\015()] * # normal*
1196(?: # (
1197(?: \\ [^\x80-\xff] |
1198\( # (
1199[^\\\x80-\xff\n\015()] * # normal*
1200(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1201\) # )
1202) # special
1203[^\\\x80-\xff\n\015()] * # normal*
1204)* # )*
1205\) # )
1206[\040\t]* )* # If comment found, allow more spaces.
1207# optional trailing comments
1208(?:
1209\.
1210[\040\t]* # Nab whitespace.
1211(?:
1212\( # (
1213[^\\\x80-\xff\n\015()] * # normal*
1214(?: # (
1215(?: \\ [^\x80-\xff] |
1216\( # (
1217[^\\\x80-\xff\n\015()] * # normal*
1218(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1219\) # )
1220) # special
1221[^\\\x80-\xff\n\015()] * # normal*
1222)* # )*
1223\) # )
1224[\040\t]* )* # If comment found, allow more spaces.
1225(?:
1226[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
1227(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
1228|
1229\[ # [
1230(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
1231\] # ]
1232)
1233[\040\t]* # Nab whitespace.
1234(?:
1235\( # (
1236[^\\\x80-\xff\n\015()] * # normal*
1237(?: # (
1238(?: \\ [^\x80-\xff] |
1239\( # (
1240[^\\\x80-\xff\n\015()] * # normal*
1241(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
1242\) # )
1243) # special
1244[^\\\x80-\xff\n\015()] * # normal*
1245)* # )*
1246\) # )
1247[\040\t]* )* # If comment found, allow more spaces.
1248# optional trailing comments
1249)*
1250# address spec
1251> # >
1252# name and address
1253)
1254/x
1255 Alan Other <user\@dom.ain>
1256 <user\@dom.ain>
1257 user\@dom.ain
1258 \"A. Other\" <user.1234\@dom.ain> (a comment)
1259 A. Other <user.1234\@dom.ain> (a comment)
1260 \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
1261 A missing angle <user\@some.where
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001262\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001263 The quick brown fox
1264
1265/abc\0def\00pqr\000xyz\0000AB/
1266 abc\0def\00pqr\000xyz\0000AB
1267 abc456 abc\0def\00pqr\000xyz\0000ABCDE
1268
1269/abc\x0def\x00pqr\x000xyz\x0000AB/
1270 abc\x0def\x00pqr\x000xyz\x0000AB
1271 abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
1272
1273/^[\000-\037]/
1274 \0A
1275 \01B
1276 \037C
1277
1278/\0*/
1279 \0\0\0\0
1280
1281/A\x0{2,3}Z/
1282 The A\x0\x0Z
1283 An A\0\x0\0Z
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001284\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001285 A\0Z
1286 A\0\x0\0\x0Z
1287
1288/^(cow|)\1(bell)/
1289 cowcowbell
1290 bell
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001291\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001292 cowbell
1293
1294/^\s/
1295 \040abc
1296 \x0cabc
1297 \nabc
1298 \rabc
1299 \tabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001300\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001301 abc
1302
1303/^a b
1304 c/x
1305 abc
1306
1307/^(a|)\1*b/
1308 ab
1309 aaaab
1310 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001311\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001312 acb
1313
1314/^(a|)\1+b/
1315 aab
1316 aaaab
1317 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001318\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001319 ab
1320
1321/^(a|)\1?b/
1322 ab
1323 aab
1324 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001325\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001326 acb
1327
1328/^(a|)\1{2}b/
1329 aaab
1330 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001331\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001332 ab
1333 aab
1334 aaaab
1335
1336/^(a|)\1{2,3}b/
1337 aaab
1338 aaaab
1339 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001340\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001341 ab
1342 aab
1343 aaaaab
1344
1345/ab{1,3}bc/
1346 abbbbc
1347 abbbc
1348 abbc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001349\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001350 abc
1351 abbbbbc
1352
1353/([^.]*)\.([^:]*):[T ]+(.*)/
1354 track1.title:TBlah blah blah
1355
1356/([^.]*)\.([^:]*):[T ]+(.*)/i
1357 track1.title:TBlah blah blah
1358
1359/([^.]*)\.([^:]*):[t ]+(.*)/i
1360 track1.title:TBlah blah blah
1361
1362/^[W-c]+$/
1363 WXY_^abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001364\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001365 wxy
1366
1367/^[W-c]+$/i
1368 WXY_^abc
1369 wxy_^ABC
1370
1371/^[\x3f-\x5F]+$/i
1372 WXY_^abc
1373 wxy_^ABC
1374
1375/^abc$/m
1376 abc
1377 qqq\nabc
1378 abc\nzzz
1379 qqq\nabc\nzzz
1380
1381/^abc$/
1382 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001383\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001384 qqq\nabc
1385 abc\nzzz
1386 qqq\nabc\nzzz
1387
1388/\Aabc\Z/m
1389 abc
1390 abc\n
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001391\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001392 qqq\nabc
1393 abc\nzzz
1394 qqq\nabc\nzzz
1395
1396/\A(.)*\Z/s
1397 abc\ndef
1398
1399/\A(.)*\Z/m
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001400\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001401 abc\ndef
1402
1403/(?:b)|(?::+)/
1404 b::c
1405 c::b
1406
1407/[-az]+/
1408 az-
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001409\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001410 b
1411
1412/[az-]+/
1413 za-
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001414\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001415 b
1416
1417/[a\-z]+/
1418 a-z
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001419\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001420 b
1421
1422/[a-z]+/
1423 abcdxyz
1424
1425/[\d-]+/
1426 12-34
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001427\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001428 aaa
1429
Nick Kralevichf73ff172014-09-27 12:41:49 -07001430/\x5c/
1431 \\
1432
1433/\x20Z/
1434 the Zoo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001435\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001436 Zulu
1437
1438/(abc)\1/i
1439 abcabc
1440 ABCabc
1441 abcABC
1442
Nick Kralevichf73ff172014-09-27 12:41:49 -07001443/abc$/
1444 abc
1445 abc\n
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001446\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001447 abc\ndef
1448
1449/(abc)\123/
1450 abc\x53
1451
1452/(abc)\223/
1453 abc\x93
1454
1455/(abc)\323/
1456 abc\xd3
1457
1458/(abc)\100/
1459 abc\x40
1460 abc\100
1461
1462/(abc)\1000/
1463 abc\x400
1464 abc\x40\x30
1465 abc\1000
1466 abc\100\x30
1467 abc\100\060
1468 abc\100\60
1469
Nick Kralevichf73ff172014-09-27 12:41:49 -07001470/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/
1471 ABCDEFGHIHI
1472
1473/^[A\8B\9C]+$/
1474 A8B9C
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001475\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001476 A8B9C\x00
1477
1478/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
1479 abcdefghijkllS
1480
1481/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
1482 abcdefghijk\12S
1483
Nick Kralevichf73ff172014-09-27 12:41:49 -07001484/a{0}bc/
1485 bc
1486
1487/(a|(bc)){0,0}?xyz/
1488 xyz
1489
1490/abc[\10]de/
1491 abc\010de
1492
1493/abc[\1]de/
1494 abc\1de
1495
1496/(abc)[\1]de/
1497 abc\1de
1498
1499/(?s)a.b/
1500 a\nb
1501
1502/^([^a])([^\b])([^c]*)([^d]{3,4})/
1503 baNOTccccd
1504 baNOTcccd
1505 baNOTccd
1506 bacccd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001507\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001508 anything
1509 b\bc
1510 baccd
1511
1512/[^a]/
1513 Abc
1514
1515/[^a]/i
1516 Abc
1517
1518/[^a]+/
1519 AAAaAbc
1520
1521/[^a]+/i
1522 AAAaAbc
1523
1524/[^a]+/
1525 bbb\nccc
1526
1527/[^k]$/
1528 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001529\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001530 abk
1531
1532/[^k]{2,3}$/
1533 abc
1534 kbc
1535 kabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001536\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001537 abk
1538 akb
1539 akk
1540
1541/^\d{8,}\@.+[^k]$/
1542 12345678\@a.b.c.d
1543 123456789\@x.y.z
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001544\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001545 12345678\@x.y.uk
1546 1234567\@a.b.c.d
1547
1548/(a)\1{8,}/
1549 aaaaaaaaa
1550 aaaaaaaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001551\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001552 aaaaaaa
1553
1554/[^a]/
1555 aaaabcd
1556 aaAabcd
1557
1558/[^a]/i
1559 aaaabcd
1560 aaAabcd
1561
1562/[^az]/
1563 aaaabcd
1564 aaAabcd
1565
1566/[^az]/i
1567 aaaabcd
1568 aaAabcd
1569
1570/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
1571 \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
1572
1573/P[^*]TAIRE[^*]{1,6}?LL/
1574 xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
1575
1576/P[^*]TAIRE[^*]{1,}?LL/
1577 xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
1578
1579/(\.\d\d[1-9]?)\d+/
1580 1.230003938
1581 1.875000282
1582 1.235
1583
1584/(\.\d\d((?=0)|\d(?=\d)))/
1585 1.230003938
1586 1.875000282
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001587\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001588 1.235
1589
1590/a(?)b/
1591 ab
1592
1593/\b(foo)\s+(\w+)/i
1594 Food is on the foo table
1595
1596/foo(.*)bar/
1597 The food is under the bar in the barn.
1598
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001599/foo(.*?)bar/
Nick Kralevichf73ff172014-09-27 12:41:49 -07001600 The food is under the bar in the barn.
1601
1602/(.*)(\d*)/
1603 I have 2 numbers: 53147
1604
1605/(.*)(\d+)/
1606 I have 2 numbers: 53147
1607
1608/(.*?)(\d*)/
1609 I have 2 numbers: 53147
1610
1611/(.*?)(\d+)/
1612 I have 2 numbers: 53147
1613
1614/(.*)(\d+)$/
1615 I have 2 numbers: 53147
1616
1617/(.*?)(\d+)$/
1618 I have 2 numbers: 53147
1619
1620/(.*)\b(\d+)$/
1621 I have 2 numbers: 53147
1622
1623/(.*\D)(\d+)$/
1624 I have 2 numbers: 53147
1625
1626/^\D*(?!123)/
1627 ABC123
1628
1629/^(\D*)(?=\d)(?!123)/
1630 ABC445
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001631\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001632 ABC123
1633
1634/^[W-]46]/
1635 W46]789
1636 -46]789
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001637\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001638 Wall
1639 Zebra
1640 42
1641 [abcd]
1642 ]abcd[
1643
1644/^[W-\]46]/
1645 W46]789
1646 Wall
1647 Zebra
1648 Xylophone
1649 42
1650 [abcd]
1651 ]abcd[
1652 \\backslash
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001653\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001654 -46]789
1655 well
1656
1657/\d\d\/\d\d\/\d\d\d\d/
1658 01/01/2000
1659
1660/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001661 word cat dog elephant mussel cow horse canary baboon snake shark otherword
1662\= Expect no match
1663 word cat dog elephant mussel cow horse canary baboon snake shark
Nick Kralevichf73ff172014-09-27 12:41:49 -07001664
1665/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001666\= Expect no match
1667 word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
Nick Kralevichf73ff172014-09-27 12:41:49 -07001668
1669/^(a){0,0}/
1670 bcd
1671 abc
1672 aab
1673
1674/^(a){0,1}/
1675 bcd
1676 abc
1677 aab
1678
1679/^(a){0,2}/
1680 bcd
1681 abc
1682 aab
1683
1684/^(a){0,3}/
1685 bcd
1686 abc
1687 aab
1688 aaa
1689
1690/^(a){0,}/
1691 bcd
1692 abc
1693 aab
1694 aaa
1695 aaaaaaaa
1696
1697/^(a){1,1}/
Nick Kralevichf73ff172014-09-27 12:41:49 -07001698 abc
1699 aab
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001700\= Expect no match
1701 bcd
Nick Kralevichf73ff172014-09-27 12:41:49 -07001702
1703/^(a){1,2}/
Nick Kralevichf73ff172014-09-27 12:41:49 -07001704 abc
1705 aab
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001706\= Expect no match
1707 bcd
Nick Kralevichf73ff172014-09-27 12:41:49 -07001708
1709/^(a){1,3}/
Nick Kralevichf73ff172014-09-27 12:41:49 -07001710 abc
1711 aab
1712 aaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001713\= Expect no match
1714 bcd
Nick Kralevichf73ff172014-09-27 12:41:49 -07001715
1716/^(a){1,}/
Nick Kralevichf73ff172014-09-27 12:41:49 -07001717 abc
1718 aab
1719 aaa
1720 aaaaaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001721\= Expect no match
1722 bcd
Nick Kralevichf73ff172014-09-27 12:41:49 -07001723
1724/.*\.gif/
1725 borfle\nbib.gif\nno
1726
1727/.{0,}\.gif/
1728 borfle\nbib.gif\nno
1729
1730/.*\.gif/m
1731 borfle\nbib.gif\nno
1732
1733/.*\.gif/s
1734 borfle\nbib.gif\nno
1735
1736/.*\.gif/ms
1737 borfle\nbib.gif\nno
1738
1739/.*$/
1740 borfle\nbib.gif\nno
1741
1742/.*$/m
1743 borfle\nbib.gif\nno
1744
1745/.*$/s
1746 borfle\nbib.gif\nno
1747
1748/.*$/ms
1749 borfle\nbib.gif\nno
1750
1751/.*$/
1752 borfle\nbib.gif\nno\n
1753
1754/.*$/m
1755 borfle\nbib.gif\nno\n
1756
1757/.*$/s
1758 borfle\nbib.gif\nno\n
1759
1760/.*$/ms
1761 borfle\nbib.gif\nno\n
1762
1763/(.*X|^B)/
1764 abcde\n1234Xyz
1765 BarFoo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001766\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001767 abcde\nBar
1768
1769/(.*X|^B)/m
1770 abcde\n1234Xyz
1771 BarFoo
1772 abcde\nBar
1773
1774/(.*X|^B)/s
1775 abcde\n1234Xyz
1776 BarFoo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001777\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001778 abcde\nBar
1779
1780/(.*X|^B)/ms
1781 abcde\n1234Xyz
1782 BarFoo
1783 abcde\nBar
1784
1785/(?s)(.*X|^B)/
1786 abcde\n1234Xyz
1787 BarFoo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001788\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001789 abcde\nBar
1790
1791/(?s:.*X|^B)/
1792 abcde\n1234Xyz
1793 BarFoo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001794\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001795 abcde\nBar
1796
1797/^.*B/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001798\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001799 abc\nB
1800
1801/(?s)^.*B/
1802 abc\nB
1803
1804/(?m)^.*B/
1805 abc\nB
1806
1807/(?ms)^.*B/
1808 abc\nB
1809
1810/(?ms)^B/
1811 abc\nB
1812
1813/(?s)B$/
1814 B\n
1815
1816/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
1817 123456654321
1818
1819/^\d\d\d\d\d\d\d\d\d\d\d\d/
1820 123456654321
1821
1822/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
1823 123456654321
1824
1825/^[abc]{12}/
1826 abcabcabcabc
1827
1828/^[a-c]{12}/
1829 abcabcabcabc
1830
1831/^(a|b|c){12}/
1832 abcabcabcabc
1833
1834/^[abcdefghijklmnopqrstuvwxy0123456789]/
1835 n
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001836\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001837 z
1838
1839/abcde{0,0}/
1840 abcd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001841\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001842 abce
1843
1844/ab[cd]{0,0}e/
1845 abe
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001846\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001847 abcde
1848
1849/ab(c){0,0}d/
1850 abd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001851\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001852 abcd
1853
1854/a(b*)/
1855 a
1856 ab
1857 abbbb
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001858\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001859 bbbbb
1860
1861/ab\d{0}e/
1862 abe
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001863\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001864 ab1e
1865
1866/"([^\\"]+|\\.)*"/
1867 the \"quick\" brown fox
1868 \"the \\\"quick\\\" brown fox\"
1869
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001870/.*?/g,aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07001871 abc
1872
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001873/\b/g,aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07001874 abc
1875
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001876/\b/g,aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07001877 abc
1878
1879//g
1880 abc
1881
1882/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
1883 <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
1884
1885/a[^a]b/
1886 acb
1887 a\nb
1888
1889/a.b/
1890 acb
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001891\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001892 a\nb
1893
1894/a[^a]b/s
1895 acb
1896 a\nb
1897
1898/a.b/s
1899 acb
1900 a\nb
1901
1902/^(b+?|a){1,2}?c/
1903 bac
1904 bbac
1905 bbbac
1906 bbbbac
1907 bbbbbac
1908
1909/^(b+|a){1,2}?c/
1910 bac
1911 bbac
1912 bbbac
1913 bbbbac
1914 bbbbbac
1915
1916/(?!\A)x/m
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001917 a\bx\n
1918 a\nx\n
1919\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001920 x\nb\n
Nick Kralevichf73ff172014-09-27 12:41:49 -07001921
Nick Kralevichf73ff172014-09-27 12:41:49 -07001922/(A|B)*?CD/
1923 CD
1924
1925/(A|B)*CD/
1926 CD
1927
1928/(AB)*?\1/
1929 ABABAB
1930
1931/(AB)*\1/
1932 ABABAB
1933
1934/(?<!bar)foo/
1935 foo
1936 catfood
1937 arfootle
1938 rfoosh
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001939\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001940 barfoo
1941 towbarfoo
1942
1943/\w{3}(?<!bar)foo/
1944 catfood
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001945\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001946 foo
1947 barfoo
1948 towbarfoo
1949
1950/(?<=(foo)a)bar/
1951 fooabar
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001952\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001953 bar
1954 foobbar
1955
1956/\Aabc\z/m
1957 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001958\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001959 abc\n
1960 qqq\nabc
1961 abc\nzzz
1962 qqq\nabc\nzzz
1963
Elliott Hughes3435c422020-12-04 13:18:28 -08001964/(?>.*\/)foo/
Nick Kralevichf73ff172014-09-27 12:41:49 -07001965 /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001966\= Expect no match
1967 /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
Nick Kralevichf73ff172014-09-27 12:41:49 -07001968
1969/(?>(\.\d\d[1-9]?))\d+/
1970 1.230003938
1971 1.875000282
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001972\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001973 1.235
1974
1975/^((?>\w+)|(?>\s+))*$/
1976 now is the time for all good men to come to the aid of the party
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001977\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001978 this is not a line with only words and spaces!
1979
1980/(\d+)(\w)/
1981 12345a
1982 12345+
1983
1984/((?>\d+))(\w)/
1985 12345a
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01001986\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07001987 12345+
1988
1989/(?>a+)b/
1990 aaab
1991
1992/((?>a+)b)/
1993 aaab
1994
1995/(?>(a+))b/
1996 aaab
1997
1998/(?>b)+/
1999 aaabbbccc
2000
2001/(?>a+|b+|c+)*c/
2002 aaabbbbccccd
2003
2004/((?>[^()]+)|\([^()]*\))+/
2005 ((abc(ade)ufh()()x
2006
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002007/\(((?>[^()]+)|\([^()]+\))+\)/
Nick Kralevichf73ff172014-09-27 12:41:49 -07002008 (abc)
2009 (abc(def)xyz)
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002010\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002011 ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2012
2013/a(?-i)b/i
2014 ab
2015 Ab
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002016\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002017 aB
2018 AB
2019
2020/(a (?x)b c)d e/
2021 a bcd e
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002022\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002023 a b cd e
2024 abcd e
2025 a bcde
2026
2027/(a b(?x)c d (?-x)e f)/
2028 a bcde f
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002029\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002030 abcdef
2031
2032/(a(?i)b)c/
2033 abc
2034 aBc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002035\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002036 abC
2037 aBC
2038 Abc
2039 ABc
2040 ABC
2041 AbC
2042
2043/a(?i:b)c/
2044 abc
2045 aBc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002046\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002047 ABC
2048 abC
2049 aBC
2050
2051/a(?i:b)*c/
2052 aBc
2053 aBBc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002054\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002055 aBC
2056 aBBC
2057
2058/a(?=b(?i)c)\w\wd/
2059 abcd
2060 abCd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002061\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002062 aBCd
2063 abcD
2064
2065/(?s-i:more.*than).*million/i
2066 more than million
2067 more than MILLION
2068 more \n than Million
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002069\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002070 MORE THAN MILLION
2071 more \n than \n million
2072
2073/(?:(?s-i)more.*than).*million/i
2074 more than million
2075 more than MILLION
2076 more \n than Million
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002077\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002078 MORE THAN MILLION
2079 more \n than \n million
2080
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002081/(?>a(?i)b+)+c/
Nick Kralevichf73ff172014-09-27 12:41:49 -07002082 abc
2083 aBbc
2084 aBBc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002085\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002086 Abc
2087 abAb
2088 abbC
2089
2090/(?=a(?i)b)\w\wc/
2091 abc
2092 aBc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002093\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002094 Ab
2095 abC
2096 aBC
2097
2098/(?<=a(?i)b)(\w\w)c/
2099 abxxc
2100 aBxxc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002101\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002102 Abxxc
2103 ABxxc
2104 abxxC
2105
2106/(?:(a)|b)(?(1)A|B)/
2107 aA
2108 bB
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002109\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002110 aB
2111 bA
2112
2113/^(a)?(?(1)a|b)+$/
2114 aa
2115 b
2116 bb
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002117\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002118 ab
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002119
2120# Perl gets this next one wrong if the pattern ends with $; in that case it
2121# fails to match "12".
Nick Kralevichf73ff172014-09-27 12:41:49 -07002122
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002123/^(?(?=abc)\w{3}:|\d\d)/
Nick Kralevichf73ff172014-09-27 12:41:49 -07002124 abc:
2125 12
Nick Kralevichf73ff172014-09-27 12:41:49 -07002126 123
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002127\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002128 xyz
2129
2130/^(?(?!abc)\d\d|\w{3}:)$/
2131 abc:
2132 12
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002133\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002134 123
2135 xyz
2136
2137/(?(?<=foo)bar|cat)/
2138 foobar
2139 cat
2140 fcat
2141 focat
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002142\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002143 foocat
2144
2145/(?(?<!foo)cat|bar)/
2146 foobar
2147 cat
2148 fcat
2149 focat
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002150\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002151 foocat
2152
2153/( \( )? [^()]+ (?(1) \) |) /x
2154 abcd
2155 (abcd)
2156 the quick (abcd) fox
2157 (abcd
2158
2159/( \( )? [^()]+ (?(1) \) ) /x
2160 abcd
2161 (abcd)
2162 the quick (abcd) fox
2163 (abcd
2164
2165/^(?(2)a|(1)(2))+$/
2166 12
2167 12a
2168 12aa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002169\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002170 1234
2171
2172/((?i)blah)\s+\1/
2173 blah blah
2174 BLAH BLAH
2175 Blah Blah
2176 blaH blaH
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002177\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002178 blah BLAH
2179 Blah blah
2180 blaH blah
2181
2182/((?i)blah)\s+(?i:\1)/
2183 blah blah
2184 BLAH BLAH
2185 Blah Blah
2186 blaH blaH
2187 blah BLAH
2188 Blah blah
2189 blaH blah
2190
Elliott Hughes653c2102019-01-09 15:41:36 -08002191/((?i)blah)\s+(?m)A(?i:\1)/
2192 blah ABLAH
2193\= Expect no match
2194 blah aBLAH
2195
Nick Kralevichf73ff172014-09-27 12:41:49 -07002196/(?>a*)*/
2197 a
2198 aa
2199 aaaa
2200
2201/(abc|)+/
2202 abc
2203 abcabc
2204 abcabcabc
2205 xyz
2206
2207/([a]*)*/
2208 a
2209 aaaaa
2210
2211/([ab]*)*/
2212 a
2213 b
2214 ababab
2215 aaaabcde
2216 bbbb
2217
2218/([^a]*)*/
2219 b
2220 bbbb
2221 aaa
2222
2223/([^ab]*)*/
2224 cccc
2225 abab
2226
2227/([a]*?)*/
2228 a
2229 aaaa
2230
2231/([ab]*?)*/
2232 a
2233 b
2234 abab
2235 baba
2236
2237/([^a]*?)*/
2238 b
2239 bbbb
2240 aaa
2241
2242/([^ab]*?)*/
2243 c
2244 cccc
2245 baba
2246
2247/(?>a*)*/
2248 a
2249 aaabcde
2250
2251/((?>a*))*/
2252 aaaaa
2253 aabbaa
2254
2255/((?>a*?))*/
2256 aaaaa
2257 aabbaa
2258
2259/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x
2260 12-sep-98
2261 12-09-98
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002262\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002263 sep-12-98
2264
2265/(?<=(foo))bar\1/
2266 foobarfoo
2267 foobarfootling
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002268\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002269 foobar
2270 barfoo
2271
2272/(?i:saturday|sunday)/
2273 saturday
2274 sunday
2275 Saturday
2276 Sunday
2277 SATURDAY
2278 SUNDAY
2279 SunDay
2280
2281/(a(?i)bc|BB)x/
2282 abcx
2283 aBCx
2284 bbx
2285 BBx
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002286\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002287 abcX
2288 aBCX
2289 bbX
2290 BBX
2291
2292/^([ab](?i)[cd]|[ef])/
2293 ac
2294 aC
2295 bD
2296 elephant
2297 Europe
2298 frog
2299 France
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002300\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002301 Africa
2302
2303/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
2304 ab
2305 aBd
2306 xy
2307 xY
2308 zebra
2309 Zambesi
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002310\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002311 aCD
2312 XY
2313
2314/(?<=foo\n)^bar/m
2315 foo\nbar
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002316\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002317 bar
2318 baz\nbar
2319
2320/(?<=(?<!foo)bar)baz/
2321 barbaz
2322 barbarbaz
2323 koobarbaz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002324\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002325 baz
2326 foobarbaz
2327
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002328# The cases of aaaa and aaaaaa are missed out below because Perl does things
2329# differently. We know that odd, and maybe incorrect, things happen with
2330# recursive references in Perl, as far as 5.11.3 - see some stuff in test #2.
Nick Kralevichf73ff172014-09-27 12:41:49 -07002331
2332/^(a\1?){4}$/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002333 aaaaa
2334 aaaaaaa
2335 aaaaaaaaaa
2336\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002337 a
2338 aa
2339 aaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07002340 aaaaaaaa
2341 aaaaaaaaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07002342 aaaaaaaaaaa
2343 aaaaaaaaaaaa
2344 aaaaaaaaaaaaa
2345 aaaaaaaaaaaaaa
2346 aaaaaaaaaaaaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002347 aaaaaaaaaaaaaaaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07002348
2349/^(a\1?)(a\1?)(a\2?)(a\3?)$/
Nick Kralevichf73ff172014-09-27 12:41:49 -07002350 aaaa
2351 aaaaa
2352 aaaaaa
2353 aaaaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002354 aaaaaaaaaa
2355\= Expect no match
2356 a
2357 aa
2358 aaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07002359 aaaaaaaa
2360 aaaaaaaaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07002361 aaaaaaaaaaa
2362 aaaaaaaaaaaa
2363 aaaaaaaaaaaaa
2364 aaaaaaaaaaaaaa
2365 aaaaaaaaaaaaaaa
2366 aaaaaaaaaaaaaaaa
2367
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002368# The following tests are taken from the Perl 5.005 test suite; some of them
2369# are compatible with 5.004, but I'd rather not have to sort them out.
Nick Kralevichf73ff172014-09-27 12:41:49 -07002370
2371/abc/
2372 abc
2373 xabcy
2374 ababc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002375\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002376 xbc
2377 axc
2378 abx
2379
2380/ab*c/
2381 abc
2382
2383/ab*bc/
2384 abc
2385 abbc
2386 abbbbc
2387
2388/.{1}/
2389 abbbbc
2390
2391/.{3,4}/
2392 abbbbc
2393
2394/ab{0,}bc/
2395 abbbbc
2396
2397/ab+bc/
2398 abbc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002399\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002400 abc
2401 abq
2402
2403/ab{1,}bc/
2404
2405/ab+bc/
2406 abbbbc
2407
2408/ab{1,}bc/
2409 abbbbc
2410
2411/ab{1,3}bc/
2412 abbbbc
2413
2414/ab{3,4}bc/
2415 abbbbc
2416
2417/ab{4,5}bc/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002418\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002419 abq
2420 abbbbc
2421
2422/ab?bc/
2423 abbc
2424 abc
2425
2426/ab{0,1}bc/
2427 abc
2428
2429/ab?bc/
2430
2431/ab?c/
2432 abc
2433
2434/ab{0,1}c/
2435 abc
2436
2437/^abc$/
2438 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002439\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002440 abbbbc
2441 abcc
2442
2443/^abc/
2444 abcc
2445
2446/^abc$/
2447
2448/abc$/
2449 aabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002450\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002451 aabcd
2452
2453/^/
2454 abc
2455
2456/$/
2457 abc
2458
2459/a.c/
2460 abc
2461 axc
2462
2463/a.*c/
2464 axyzc
2465
2466/a[bc]d/
2467 abd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002468\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002469 axyzd
2470 abc
2471
2472/a[b-d]e/
2473 ace
2474
2475/a[b-d]/
2476 aac
2477
2478/a[-b]/
2479 a-
2480
2481/a[b-]/
2482 a-
2483
2484/a]/
2485 a]
2486
2487/a[]]b/
2488 a]b
2489
2490/a[^bc]d/
2491 aed
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002492\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002493 abd
2494 abd
2495
2496/a[^-b]c/
2497 adc
2498
2499/a[^]b]c/
2500 adc
Nick Kralevichf73ff172014-09-27 12:41:49 -07002501 a-c
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002502\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002503 a]c
2504
2505/\ba\b/
2506 a-
2507 -a
2508 -a-
2509
2510/\by\b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002511\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002512 xy
2513 yz
2514 xyz
2515
2516/\Ba\B/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002517\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002518 a-
2519 -a
2520 -a-
2521
2522/\By\b/
2523 xy
2524
2525/\by\B/
2526 yz
2527
2528/\By\B/
2529 xyz
2530
2531/\w/
2532 a
2533
2534/\W/
2535 -
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002536\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002537 a
2538
2539/a\sb/
2540 a b
2541
2542/a\Sb/
2543 a-b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002544\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002545 a b
2546
2547/\d/
2548 1
2549
2550/\D/
2551 -
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002552\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002553 1
2554
2555/[\w]/
2556 a
2557
2558/[\W]/
2559 -
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002560\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002561 a
2562
2563/a[\s]b/
2564 a b
2565
2566/a[\S]b/
2567 a-b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002568\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002569 a b
2570
2571/[\d]/
2572 1
2573
2574/[\D]/
2575 -
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002576\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002577 1
2578
2579/ab|cd/
2580 abc
2581 abcd
2582
2583/()ef/
2584 def
2585
2586/$b/
2587
2588/a\(b/
2589 a(b
2590
2591/a\(*b/
2592 ab
2593 a((b
2594
2595/a\\b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002596 a\\b
Nick Kralevichf73ff172014-09-27 12:41:49 -07002597
2598/((a))/
2599 abc
2600
2601/(a)b(c)/
2602 abc
2603
2604/a+b+c/
2605 aabbabc
2606
2607/a{1,}b{1,}c/
2608 aabbabc
2609
2610/a.+?c/
2611 abcabc
2612
2613/(a+|b)*/
2614 ab
2615
2616/(a+|b){0,}/
2617 ab
2618
2619/(a+|b)+/
2620 ab
2621
2622/(a+|b){1,}/
2623 ab
2624
2625/(a+|b)?/
2626 ab
2627
2628/(a+|b){0,1}/
2629 ab
2630
2631/[^ab]*/
2632 cde
2633
2634/abc/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002635\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002636 b
Nick Kralevichf73ff172014-09-27 12:41:49 -07002637
2638/a*/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002639 \
Nick Kralevichf73ff172014-09-27 12:41:49 -07002640
2641/([abc])*d/
2642 abbbcd
2643
2644/([abc])*bcd/
2645 abcd
2646
2647/a|b|c|d|e/
2648 e
2649
2650/(a|b|c|d|e)f/
2651 ef
2652
2653/abcd*efg/
2654 abcdefg
2655
2656/ab*/
2657 xabyabbbz
2658 xayabbbz
2659
2660/(ab|cd)e/
2661 abcde
2662
2663/[abhgefdc]ij/
2664 hij
2665
2666/^(ab|cd)e/
2667
2668/(abc|)ef/
2669 abcdef
2670
2671/(a|b)c*d/
2672 abcd
2673
2674/(ab|ab*)bc/
2675 abc
2676
2677/a([bc]*)c*/
2678 abc
2679
2680/a([bc]*)(c*d)/
2681 abcd
2682
2683/a([bc]+)(c*d)/
2684 abcd
2685
2686/a([bc]*)(c+d)/
2687 abcd
2688
2689/a[bcd]*dcdcde/
2690 adcdcde
2691
2692/a[bcd]+dcdcde/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002693\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002694 abcde
2695 adcdcde
2696
2697/(ab|a)b*c/
2698 abc
2699
2700/((a)(b)c)(d)/
2701 abcd
2702
2703/[a-zA-Z_][a-zA-Z0-9_]*/
2704 alpha
2705
2706/^a(bc+|b[eh])g|.h$/
2707 abh
2708
2709/(bc+d$|ef*g.|h?i(j|k))/
2710 effgz
2711 ij
2712 reffgz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002713\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002714 effg
2715 bcdd
2716
2717/((((((((((a))))))))))/
2718 a
2719
2720/((((((((((a))))))))))\10/
2721 aa
2722
2723/(((((((((a)))))))))/
2724 a
2725
2726/multiple words of text/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002727\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002728 aa
2729 uh-uh
2730
2731/multiple words/
2732 multiple words, yeah
2733
2734/(.*)c(.*)/
2735 abcde
2736
2737/\((.*), (.*)\)/
2738 (a, b)
2739
2740/[k]/
2741
2742/abcd/
2743 abcd
2744
2745/a(bc)d/
2746 abcd
2747
2748/a[-]?c/
2749 ac
2750
2751/(abc)\1/
2752 abcabc
2753
2754/([a-c]*)\1/
2755 abcabc
2756
2757/(a)|\1/
2758 a
Nick Kralevichf73ff172014-09-27 12:41:49 -07002759 ab
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002760\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002761 x
2762
2763/(([a-c])b*?\2)*/
2764 ababbbcbc
2765
2766/(([a-c])b*?\2){3}/
2767 ababbbcbc
2768
2769/((\3|b)\2(a)x)+/
2770 aaaxabaxbaaxbbax
2771
2772/((\3|b)\2(a)){2,}/
2773 bbaababbabaaaaabbaaaabba
2774
2775/abc/i
2776 ABC
2777 XABCY
2778 ABABC
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002779\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002780 aaxabxbaxbbx
2781 XBC
2782 AXC
2783 ABX
2784
2785/ab*c/i
2786 ABC
2787
2788/ab*bc/i
2789 ABC
2790 ABBC
2791
2792/ab*?bc/i
2793 ABBBBC
2794
2795/ab{0,}?bc/i
2796 ABBBBC
2797
2798/ab+?bc/i
2799 ABBC
2800
2801/ab+bc/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002802\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002803 ABC
2804 ABQ
2805
2806/ab{1,}bc/i
2807
2808/ab+bc/i
2809 ABBBBC
2810
2811/ab{1,}?bc/i
2812 ABBBBC
2813
2814/ab{1,3}?bc/i
2815 ABBBBC
2816
2817/ab{3,4}?bc/i
2818 ABBBBC
2819
2820/ab{4,5}?bc/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002821\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002822 ABQ
2823 ABBBBC
2824
2825/ab??bc/i
2826 ABBC
2827 ABC
2828
2829/ab{0,1}?bc/i
2830 ABC
2831
2832/ab??bc/i
2833
2834/ab??c/i
2835 ABC
2836
2837/ab{0,1}?c/i
2838 ABC
2839
2840/^abc$/i
2841 ABC
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002842\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002843 ABBBBC
2844 ABCC
2845
2846/^abc/i
2847 ABCC
2848
2849/^abc$/i
2850
2851/abc$/i
2852 AABC
2853
2854/^/i
2855 ABC
2856
2857/$/i
2858 ABC
2859
2860/a.c/i
2861 ABC
2862 AXC
2863
2864/a.*?c/i
2865 AXYZC
2866
2867/a.*c/i
Nick Kralevichf73ff172014-09-27 12:41:49 -07002868 AABC
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002869\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002870 AXYZD
2871
2872/a[bc]d/i
2873 ABD
2874
2875/a[b-d]e/i
2876 ACE
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002877\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002878 ABC
2879 ABD
2880
2881/a[b-d]/i
2882 AAC
2883
2884/a[-b]/i
2885 A-
2886
2887/a[b-]/i
2888 A-
2889
2890/a]/i
2891 A]
2892
2893/a[]]b/i
2894 A]B
2895
2896/a[^bc]d/i
2897 AED
2898
2899/a[^-b]c/i
2900 ADC
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002901\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002902 ABD
2903 A-C
2904
2905/a[^]b]c/i
2906 ADC
2907
2908/ab|cd/i
2909 ABC
2910 ABCD
2911
2912/()ef/i
2913 DEF
2914
2915/$b/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002916\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07002917 A]C
2918 B
2919
2920/a\(b/i
2921 A(B
2922
2923/a\(*b/i
2924 AB
2925 A((B
2926
2927/a\\b/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01002928 A\\b
2929 a\\B
Nick Kralevichf73ff172014-09-27 12:41:49 -07002930
2931/((a))/i
2932 ABC
2933
2934/(a)b(c)/i
2935 ABC
2936
2937/a+b+c/i
2938 AABBABC
2939
2940/a{1,}b{1,}c/i
2941 AABBABC
2942
2943/a.+?c/i
2944 ABCABC
2945
2946/a.*?c/i
2947 ABCABC
2948
2949/a.{0,5}?c/i
2950 ABCABC
2951
2952/(a+|b)*/i
2953 AB
2954
2955/(a+|b){0,}/i
2956 AB
2957
2958/(a+|b)+/i
2959 AB
2960
2961/(a+|b){1,}/i
2962 AB
2963
2964/(a+|b)?/i
2965 AB
2966
2967/(a+|b){0,1}/i
2968 AB
2969
2970/(a+|b){0,1}?/i
2971 AB
2972
2973/[^ab]*/i
2974 CDE
2975
Nick Kralevichf73ff172014-09-27 12:41:49 -07002976/([abc])*d/i
2977 ABBBCD
2978
2979/([abc])*bcd/i
2980 ABCD
2981
2982/a|b|c|d|e/i
2983 E
2984
2985/(a|b|c|d|e)f/i
2986 EF
2987
2988/abcd*efg/i
2989 ABCDEFG
2990
2991/ab*/i
2992 XABYABBBZ
2993 XAYABBBZ
2994
2995/(ab|cd)e/i
2996 ABCDE
2997
2998/[abhgefdc]ij/i
2999 HIJ
3000
3001/^(ab|cd)e/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003002\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003003 ABCDE
3004
3005/(abc|)ef/i
3006 ABCDEF
3007
3008/(a|b)c*d/i
3009 ABCD
3010
3011/(ab|ab*)bc/i
3012 ABC
3013
3014/a([bc]*)c*/i
3015 ABC
3016
3017/a([bc]*)(c*d)/i
3018 ABCD
3019
3020/a([bc]+)(c*d)/i
3021 ABCD
3022
3023/a([bc]*)(c+d)/i
3024 ABCD
3025
3026/a[bcd]*dcdcde/i
3027 ADCDCDE
3028
3029/a[bcd]+dcdcde/i
3030
3031/(ab|a)b*c/i
3032 ABC
3033
3034/((a)(b)c)(d)/i
3035 ABCD
3036
3037/[a-zA-Z_][a-zA-Z0-9_]*/i
3038 ALPHA
3039
3040/^a(bc+|b[eh])g|.h$/i
3041 ABH
3042
3043/(bc+d$|ef*g.|h?i(j|k))/i
3044 EFFGZ
3045 IJ
3046 REFFGZ
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003047\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003048 ADCDCDE
3049 EFFG
3050 BCDD
3051
3052/((((((((((a))))))))))/i
3053 A
3054
3055/((((((((((a))))))))))\10/i
3056 AA
3057
3058/(((((((((a)))))))))/i
3059 A
3060
3061/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
3062 A
3063
3064/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
3065 C
3066
3067/multiple words of text/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003068\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003069 AA
3070 UH-UH
3071
3072/multiple words/i
3073 MULTIPLE WORDS, YEAH
3074
3075/(.*)c(.*)/i
3076 ABCDE
3077
3078/\((.*), (.*)\)/i
3079 (A, B)
3080
3081/[k]/i
3082
3083/abcd/i
3084 ABCD
3085
3086/a(bc)d/i
3087 ABCD
3088
3089/a[-]?c/i
3090 AC
3091
3092/(abc)\1/i
3093 ABCABC
3094
3095/([a-c]*)\1/i
3096 ABCABC
3097
3098/a(?!b)./
3099 abad
3100
3101/a(?=d)./
3102 abad
3103
3104/a(?=c|d)./
3105 abad
3106
3107/a(?:b|c|d)(.)/
3108 ace
3109
3110/a(?:b|c|d)*(.)/
3111 ace
3112
3113/a(?:b|c|d)+?(.)/
3114 ace
3115 acdbcdbe
3116
3117/a(?:b|c|d)+(.)/
3118 acdbcdbe
3119
3120/a(?:b|c|d){2}(.)/
3121 acdbcdbe
3122
3123/a(?:b|c|d){4,5}(.)/
3124 acdbcdbe
3125
3126/a(?:b|c|d){4,5}?(.)/
3127 acdbcdbe
3128
3129/((foo)|(bar))*/
3130 foobar
3131
3132/a(?:b|c|d){6,7}(.)/
3133 acdbcdbe
3134
3135/a(?:b|c|d){6,7}?(.)/
3136 acdbcdbe
3137
3138/a(?:b|c|d){5,6}(.)/
3139 acdbcdbe
3140
3141/a(?:b|c|d){5,6}?(.)/
3142 acdbcdbe
3143
3144/a(?:b|c|d){5,7}(.)/
3145 acdbcdbe
3146
3147/a(?:b|c|d){5,7}?(.)/
3148 acdbcdbe
3149
3150/a(?:b|(c|e){1,2}?|d)+?(.)/
3151 ace
3152
3153/^(.+)?B/
3154 AB
3155
3156/^([^a-z])|(\^)$/
3157 .
3158
3159/^[<>]&/
3160 <&OUT
3161
3162/^(a\1?){4}$/
3163 aaaaaaaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003164\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003165 AB
3166 aaaaaaaaa
3167 aaaaaaaaaaa
3168
3169/^(a(?(1)\1)){4}$/
3170 aaaaaaaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003171\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003172 aaaaaaaaa
3173 aaaaaaaaaaa
3174
3175/(?:(f)(o)(o)|(b)(a)(r))*/
3176 foobar
3177
3178/(?<=a)b/
3179 ab
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003180\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003181 cb
3182 b
3183
3184/(?<!c)b/
3185 ab
3186 b
3187 b
3188
3189/(?:..)*a/
3190 aba
3191
3192/(?:..)*?a/
3193 aba
3194
3195/^(?:b|a(?=(.)))*\1/
3196 abc
3197
3198/^(){3,5}/
3199 abc
3200
3201/^(a+)*ax/
3202 aax
3203
3204/^((a|b)+)*ax/
3205 aax
3206
3207/^((a|bc)+)*ax/
3208 aax
3209
3210/(a|x)*ab/
3211 cab
3212
3213/(a)*ab/
3214 cab
3215
3216/(?:(?i)a)b/
3217 ab
3218
3219/((?i)a)b/
3220 ab
3221
3222/(?:(?i)a)b/
3223 Ab
3224
3225/((?i)a)b/
3226 Ab
3227
3228/(?:(?i)a)b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003229\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003230 cb
3231 aB
3232
3233/((?i)a)b/
3234
3235/(?i:a)b/
3236 ab
3237
3238/((?i:a))b/
3239 ab
3240
3241/(?i:a)b/
3242 Ab
3243
3244/((?i:a))b/
3245 Ab
3246
3247/(?i:a)b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003248\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003249 aB
3250 aB
3251
3252/((?i:a))b/
3253
3254/(?:(?-i)a)b/i
3255 ab
3256
3257/((?-i)a)b/i
3258 ab
3259
3260/(?:(?-i)a)b/i
3261 aB
3262
3263/((?-i)a)b/i
3264 aB
3265
3266/(?:(?-i)a)b/i
Nick Kralevichf73ff172014-09-27 12:41:49 -07003267 aB
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003268\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003269 Ab
3270 AB
3271
Nick Kralevichf73ff172014-09-27 12:41:49 -07003272/(?-i:a)b/i
3273 ab
3274
3275/((?-i:a))b/i
3276 ab
3277
3278/(?-i:a)b/i
3279 aB
3280
3281/((?-i:a))b/i
3282 aB
3283
3284/(?-i:a)b/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003285\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003286 AB
3287 Ab
3288
3289/((?-i:a))b/i
3290
3291/(?-i:a)b/i
3292 aB
3293
3294/((?-i:a))b/i
3295 aB
3296
3297/(?-i:a)b/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003298\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003299 Ab
3300 AB
3301
3302/((?-i:a))b/i
3303
3304/((?-i:a.))b/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003305\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003306 AB
3307 a\nB
3308
3309/((?s-i:a.))b/i
3310 a\nB
3311
3312/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
3313 cabbbb
3314
3315/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
3316 caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
3317
3318/(ab)\d\1/i
3319 Ab4ab
3320 ab4Ab
3321
3322/foo\w*\d{4}baz/
3323 foobar1234baz
3324
3325/x(~~)*(?:(?:F)?)?/
3326 x~~
3327
3328/^a(?#xxx){3}c/
3329 aaac
3330
3331/^a (?#xxx) (?#yyy) {3}c/x
3332 aaac
3333
3334/(?<![cd])b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003335\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003336 B\nB
3337 dbcb
3338
3339/(?<![cd])[ab]/
3340 dbaacb
3341
3342/(?<!(c|d))b/
3343
3344/(?<!(c|d))[ab]/
3345 dbaacb
3346
3347/(?<!cd)[ab]/
3348 cdaccb
3349
3350/^(?:a?b?)*$/
3351 \
3352 a
3353 ab
3354 aaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003355\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003356 dbcb
3357 a--
3358 aa--
3359
3360/((?s)^a(.))((?m)^b$)/
3361 a\nb\nc\n
3362
3363/((?m)^b$)/
3364 a\nb\nc\n
3365
3366/(?m)^b/
3367 a\nb\n
3368
3369/(?m)^(b)/
3370 a\nb\n
3371
3372/((?m)^b)/
3373 a\nb\n
3374
3375/\n((?m)^b)/
3376 a\nb\n
3377
3378/((?s).)c(?!.)/
3379 a\nb\nc\n
3380 a\nb\nc\n
3381
3382/((?s)b.)c(?!.)/
3383 a\nb\nc\n
3384 a\nb\nc\n
3385
3386/^b/
3387
3388/()^b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003389\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003390 a\nb\nc\n
3391 a\nb\nc\n
3392
3393/((?m)^b)/
3394 a\nb\nc\n
3395
3396/(x)?(?(1)a|b)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003397\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003398 a
3399 a
3400
3401/(x)?(?(1)b|a)/
3402 a
3403
3404/()?(?(1)b|a)/
3405 a
3406
3407/()(?(1)b|a)/
3408
3409/()?(?(1)a|b)/
3410 a
3411
3412/^(\()?blah(?(1)(\)))$/
3413 (blah)
3414 blah
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003415\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003416 a
3417 blah)
3418 (blah
3419
3420/^(\(+)?blah(?(1)(\)))$/
3421 (blah)
3422 blah
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003423\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003424 blah)
3425 (blah
3426
3427/(?(?!a)a|b)/
3428
3429/(?(?!a)b|a)/
3430 a
3431
3432/(?(?=a)b|a)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003433\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003434 a
3435 a
3436
3437/(?(?=a)a|b)/
3438 a
3439
3440/(?=(a+?))(\1ab)/
3441 aaab
3442
3443/^(?=(a+?))\1ab/
3444
3445/(\w+:)+/
3446 one:
3447
3448/$(?<=^(a))/
3449 a
3450
3451/(?=(a+?))(\1ab)/
3452 aaab
3453
3454/^(?=(a+?))\1ab/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003455\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003456 aaab
3457 aaab
3458
3459/([\w:]+::)?(\w+)$/
3460 abcd
3461 xy:z:::abcd
3462
3463/^[^bcd]*(c+)/
3464 aexycd
3465
3466/(a*)b+/
3467 caab
3468
3469/([\w:]+::)?(\w+)$/
3470 abcd
3471 xy:z:::abcd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003472\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003473 abcd:
3474 abcd:
3475
3476/^[^bcd]*(c+)/
3477 aexycd
3478
3479/(>a+)ab/
3480
3481/(?>a+)b/
3482 aaab
3483
3484/([[:]+)/
3485 a:[b]:
3486
3487/([[=]+)/
3488 a=[b]=
3489
3490/([[.]+)/
3491 a.[b].
3492
3493/((?>a+)b)/
3494 aaab
3495
3496/(?>(a+))b/
3497 aaab
3498
3499/((?>[^()]+)|\([^()]*\))+/
3500 ((abc(ade)ufh()()x
3501
3502/a\Z/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003503\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003504 aaab
3505 a\nb\n
3506
3507/b\Z/
3508 a\nb\n
3509
3510/b\z/
3511
3512/b\Z/
3513 a\nb
3514
3515/b\z/
3516 a\nb
Nick Kralevichf73ff172014-09-27 12:41:49 -07003517
3518/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
3519 a
3520 abc
3521 a-b
3522 0-9
3523 a.b
3524 5.6.7
3525 the.quick.brown.fox
3526 a100.b200.300c
3527 12-ab.1245
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003528\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003529 \
3530 .a
3531 -a
3532 a-
3533 a.
3534 a_b
3535 a.-
3536 a..
3537 ab..bc
3538 the.quick.brown.fox-
3539 the.quick.brown.fox.
3540 the.quick.brown.fox_
3541 the.quick.brown.fox+
3542
3543/(?>.*)(?<=(abcd|wxyz))/
3544 alphabetabcd
3545 endingwxyz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003546\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003547 a rather long string that doesn't end with one of them
3548
3549/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
3550 word cat dog elephant mussel cow horse canary baboon snake shark otherword
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003551\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003552 word cat dog elephant mussel cow horse canary baboon snake shark
3553
3554/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003555\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003556 word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
3557
3558/(?<=\d{3}(?!999))foo/
3559 999foo
3560 123999foo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003561\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003562 123abcfoo
3563
3564/(?<=(?!...999)\d{3})foo/
3565 999foo
3566 123999foo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003567\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003568 123abcfoo
3569
3570/(?<=\d{3}(?!999)...)foo/
3571 123abcfoo
3572 123456foo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003573\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003574 123999foo
3575
3576/(?<=\d{3}...)(?<!999)foo/
3577 123abcfoo
3578 123456foo
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003579\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003580 123999foo
3581
3582/<a[\s]+href[\s]*=[\s]* # find <a href=
3583 ([\"\'])? # find single or double quote
3584 (?(1) (.*?)\1 | ([^\s]+)) # if quote found, match up to next matching
3585 # quote, otherwise match up to next space
3586/isx
3587 <a href=abcd xyz
3588 <a href=\"abcd xyz pqr\" cats
3589 <a href=\'abcd xyz pqr\' cats
3590
3591/<a\s+href\s*=\s* # find <a href=
3592 (["'])? # find single or double quote
3593 (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
3594 # quote, otherwise match up to next space
3595/isx
3596 <a href=abcd xyz
3597 <a href=\"abcd xyz pqr\" cats
3598 <a href = \'abcd xyz pqr\' cats
3599
3600/<a\s+href(?>\s*)=(?>\s*) # find <a href=
3601 (["'])? # find single or double quote
3602 (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
3603 # quote, otherwise match up to next space
3604/isx
3605 <a href=abcd xyz
3606 <a href=\"abcd xyz pqr\" cats
3607 <a href = \'abcd xyz pqr\' cats
3608
3609/((Z)+|A)*/
3610 ZABCDEFG
3611
3612/(Z()|A)*/
3613 ZABCDEFG
3614
3615/(Z(())|A)*/
3616 ZABCDEFG
3617
3618/((?>Z)+|A)*/
3619 ZABCDEFG
3620
3621/((?>)+|A)*/
3622 ZABCDEFG
3623
3624/a*/g
3625 abbab
3626
Nick Kralevichf73ff172014-09-27 12:41:49 -07003627/[[:space:]]+/
3628 > \x09\x0a\x0c\x0d\x0b<
3629
3630/[[:blank:]]+/
3631 > \x09\x0a\x0c\x0d\x0b<
3632
3633/[\s]+/
3634 > \x09\x0a\x0c\x0d\x0b<
3635
3636/\s+/
3637 > \x09\x0a\x0c\x0d\x0b<
3638
3639/a b/x
3640 ab
3641
3642/(?!\A)x/m
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003643 a\nxb\n
Nick Kralevichf73ff172014-09-27 12:41:49 -07003644
3645/(?!^)x/m
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003646\= Expect no match
3647 a\nxb\n
Nick Kralevichf73ff172014-09-27 12:41:49 -07003648
3649/abc\Qabc\Eabc/
3650 abcabcabc
3651
3652/abc\Q(*+|\Eabc/
3653 abc(*+|abc
3654
3655/ abc\Q abc\Eabc/x
3656 abc abcabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003657\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003658 abcabcabc
3659
3660/abc#comment
3661 \Q#not comment
3662 literal\E/x
3663 abc#not comment\n literal
3664
3665/abc#comment
3666 \Q#not comment
3667 literal/x
3668 abc#not comment\n literal
3669
3670/abc#comment
3671 \Q#not comment
3672 literal\E #more comment
3673 /x
3674 abc#not comment\n literal
3675
3676/abc#comment
3677 \Q#not comment
3678 literal\E #more comment/x
3679 abc#not comment\n literal
3680
3681/\Qabc\$xyz\E/
3682 abc\\\$xyz
3683
3684/\Qabc\E\$\Qxyz\E/
3685 abc\$xyz
3686
3687/\Gabc/
3688 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003689\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003690 xyzabc
3691
3692/\Gabc./g
3693 abc1abc2xyzabc3
3694
3695/abc./g
3696 abc1abc2xyzabc3
3697
3698/a(?x: b c )d/
3699 XabcdY
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003700\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003701 Xa b c d Y
3702
3703/((?x)x y z | a b c)/
3704 XabcY
3705 AxyzB
3706
3707/(?i)AB(?-i)C/
3708 XabCY
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003709\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003710 XabcY
3711
3712/((?i)AB(?-i)C|D)E/
3713 abCE
3714 DE
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003715\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003716 abcE
3717 abCe
3718 dE
3719 De
3720
3721/(.*)\d+\1/
3722 abc123abc
3723 abc123bc
3724
3725/(.*)\d+\1/s
3726 abc123abc
3727 abc123bc
3728
3729/((.*))\d+\1/
3730 abc123abc
3731 abc123bc
3732
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003733# This tests for an IPv6 address in the form where it can have up to
3734# eight components, one and only one of which is empty. This must be
3735# an internal component.
Nick Kralevichf73ff172014-09-27 12:41:49 -07003736
3737/^(?!:) # colon disallowed at start
3738 (?: # start of item
3739 (?: [0-9a-f]{1,4} | # 1-4 hex digits or
3740 (?(1)0 | () ) ) # if null previously matched, fail; else null
3741 : # followed by colon
3742 ){1,7} # end item; 1-7 of them required
3743 [0-9a-f]{1,4} $ # final hex number at end of string
3744 (?(1)|.) # check that there was an empty component
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003745 /ix
Nick Kralevichf73ff172014-09-27 12:41:49 -07003746 a123::a123
3747 a123:b342::abcd
3748 a123:b342::324e:abcd
3749 a123:ddde:b342::324e:abcd
3750 a123:ddde:b342::324e:dcba:abcd
3751 a123:ddde:9999:b342::324e:dcba:abcd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003752\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003753 1:2:3:4:5:6:7:8
3754 a123:bce:ddde:9999:b342::324e:dcba:abcd
3755 a123::9999:b342::324e:dcba:abcd
3756 abcde:2:3:4:5:6:7:8
3757 ::1
3758 abcd:fee0:123::
3759 :1
3760 1:
3761
3762/[z\Qa-d]\E]/
3763 z
3764 a
3765 -
3766 d
3767 ]
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003768\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003769 b
3770
Nick Kralevichf73ff172014-09-27 12:41:49 -07003771/(a+)*b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003772\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003773 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
3774
3775/(?i)reg(?:ul(?:[aä]|ae)r|ex)/
3776 REGular
3777 regulaer
3778 Regex
3779 regulär
3780
3781/Åæåä[à-ÿÀ-ß]+/
3782 Åæåäà
3783 Åæåäÿ
3784 ÅæåäÀ
3785 Åæåäß
3786
3787/(?<=Z)X./
3788 \x84XAZXB
3789
3790/ab cd (?x) de fg/
3791 ab cd defg
3792
3793/ab cd(?x) de fg/
3794 ab cddefg
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003795\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003796 abcddefg
3797
3798/(?<![^f]oo)(bar)/
3799 foobarX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003800\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003801 boobarX
3802
3803/(?<![^f])X/
3804 offX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003805\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003806 onyX
3807
3808/(?<=[^f])X/
3809 onyX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003810\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003811 offX
3812
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003813/^/gm
Nick Kralevichf73ff172014-09-27 12:41:49 -07003814 a\nb\nc\n
3815 \
3816
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003817/(?<=C\n)^/gm
Nick Kralevichf73ff172014-09-27 12:41:49 -07003818 A\nC\nC\n
3819
3820/(?:(?(1)a|b)(X))+/
3821 bXaX
3822
3823/(?:(?(1)\1a|b)(X|Y))+/
3824 bXXaYYaY
3825 bXYaXXaX
3826
3827/()()()()()()()()()(?:(?(10)\10a|b)(X|Y))+/
3828 bXXaYYaY
3829
3830/[[,abc,]+]/
3831 abc]
3832 a,b]
3833 [a,b,c]
3834
3835/(?-x: )/x
3836 A\x20B
3837
Elliott Hughes3435c422020-12-04 13:18:28 -08003838/(?x)(?-x: \s*#\s*)/
Nick Kralevichf73ff172014-09-27 12:41:49 -07003839 A # B
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003840\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003841 #
Elliott Hughes3435c422020-12-04 13:18:28 -08003842 A s#s B
Nick Kralevichf73ff172014-09-27 12:41:49 -07003843
Elliott Hughes3435c422020-12-04 13:18:28 -08003844/(?x-is)(?:(?-ixs) \s*#\s*) include/
Nick Kralevichf73ff172014-09-27 12:41:49 -07003845 A #include
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003846\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003847 A#include
3848 A #Include
3849
3850/a*b*\w/
3851 aaabbbb
3852 aaaa
3853 a
3854
3855/a*b?\w/
3856 aaabbbb
3857 aaaa
3858 a
3859
3860/a*b{0,4}\w/
3861 aaabbbb
3862 aaaa
3863 a
3864
3865/a*b{0,}\w/
3866 aaabbbb
3867 aaaa
3868 a
3869
3870/a*\d*\w/
3871 0a
3872 a
3873
3874/a*b *\w/x
3875 a
3876
3877/a*b#comment
3878 *\w/x
3879 a
3880
3881/a* b *\w/x
3882 a
3883
3884/^\w+=.*(\\\n.*)*/
3885 abc=xyz\\\npqr
3886
3887/(?=(\w+))\1:/
3888 abcd:
3889
3890/^(?=(\w+))\1:/
3891 abcd:
3892
3893/^\Eabc/
3894 abc
3895
3896/^[\Eabc]/
3897 a
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003898\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003899 E
3900
3901/^[a-\Ec]/
3902 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003903\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003904 -
3905 E
3906
3907/^[a\E\E-\Ec]/
3908 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003909\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003910 -
3911 E
3912
3913/^[\E\Qa\E-\Qz\E]+/
3914 b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003915\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003916 -
3917
3918/^[a\Q]bc\E]/
3919 a
3920 ]
3921 c
3922
3923/^[a-\Q\E]/
3924 a
3925 -
3926
3927/^(a()*)*/
3928 aaaa
3929
3930/^(?:a(?:(?:))*)*/
3931 aaaa
3932
3933/^(a()+)+/
3934 aaaa
3935
3936/^(?:a(?:(?:))+)+/
3937 aaaa
3938
3939/(a){0,3}(?(1)b|(c|))*D/
3940 abbD
3941 ccccD
3942 D
3943
3944/(a|)*\d/
Nick Kralevichf73ff172014-09-27 12:41:49 -07003945 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003946\= Expect no match
3947 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07003948
3949/(?>a|)*\d/
Nick Kralevichf73ff172014-09-27 12:41:49 -07003950 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003951\= Expect no match
3952 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07003953
3954/(?:a|)*\d/
Nick Kralevichf73ff172014-09-27 12:41:49 -07003955 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003956\= Expect no match
3957 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07003958
3959/\Z/g
3960 abc\n
3961
3962/^(?s)(?>.*)(?<!\n)/
3963 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003964\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003965 abc\n
3966
3967/^(?![^\n]*\n\z)/
3968 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003969\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003970 abc\n
3971
3972/\z(?<!\n)/
3973 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01003974\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07003975 abc\n
3976
3977/(.*(.)?)*/
3978 abcd
3979
3980/( (A | (?(1)0|) )* )/x
3981 abcd
3982
3983/( ( (?(1)0|) )* )/x
3984 abcd
3985
3986/( (?(1)0|)* )/x
3987 abcd
3988
3989/[[:abcd:xyz]]/
3990 a]
3991 :]
3992
3993/[abc[:x\]pqr]/
3994 a
3995 [
3996 :
3997 ]
3998 p
3999
4000/.*[op][xyz]/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004001\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004002 fooabcfoo
4003
4004/(?(?=.*b)b|^)/
4005 adc
4006 abc
4007
4008/(?(?=^.*b)b|^)/
4009 adc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004010\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004011 abc
4012
4013/(?(?=.*b)b|^)*/
4014 adc
4015 abc
4016
4017/(?(?=.*b)b|^)+/
4018 adc
4019 abc
4020
4021/(?(?=b).*b|^d)/
4022 abc
4023
4024/(?(?=.*b).*b|^d)/
4025 abc
4026
4027/^%((?(?=[a])[^%])|b)*%$/
4028 %ab%
4029
4030/(?i)a(?-i)b|c/
4031 XabX
4032 XAbX
4033 CcC
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004034\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004035 XABX
4036
4037/[\x00-\xff\s]+/
4038 \x0a\x0b\x0c\x0d
4039
Nick Kralevichf73ff172014-09-27 12:41:49 -07004040/(abc)\1/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004041\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004042 abc
4043
4044/(abc)\1/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004045\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004046 abc
4047
4048/[^a]*/i
4049 12abc
4050 12ABC
4051
4052/[^a]*+/i
4053 12abc
4054 12ABC
4055
4056/[^a]*?X/i
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004057\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004058 12abc
4059 12ABC
4060
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004061/[^a]+?X/i
4062\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004063 12abc
4064 12ABC
4065
4066/[^a]?X/i
4067 12aXbcX
4068 12AXBCX
4069 BCX
4070
4071/[^a]??X/i
4072 12aXbcX
4073 12AXBCX
4074 BCX
4075
4076/[^a]?+X/i
4077 12aXbcX
4078 12AXBCX
4079 BCX
4080
4081/[^a]{2,3}/i
4082 abcdef
4083 ABCDEF
4084
4085/[^a]{2,3}?/i
4086 abcdef
4087 ABCDEF
4088
4089/[^a]{2,3}+/i
4090 abcdef
4091 ABCDEF
4092
4093/((a|)+)+Z/
4094 Z
4095
4096/(a)b|(a)c/
4097 ac
4098
4099/(?>(a))b|(a)c/
4100 ac
4101
4102/(?=(a))ab|(a)c/
4103 ac
4104
4105/((?>(a))b|(a)c)/
4106 ac
4107
4108/((?>(a))b|(a)c)++/
4109 ac
4110
4111/(?:(?>(a))b|(a)c)++/
4112 ac
4113
4114/(?=(?>(a))b|(a)c)(..)/
4115 ac
4116
4117/(?>(?>(a))b|(a)c)/
4118 ac
4119
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004120/(?:(?>([ab])))+a=/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004121 =ba=
4122
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004123/(?>([ab]))+a=/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004124 =ba=
4125
4126/((?>(a+)b)+(aabab))/
4127 aaaabaaabaabab
4128
4129/(?>a+|ab)+?c/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004130\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004131 aabc
4132
4133/(?>a+|ab)+c/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004134\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004135 aabc
4136
4137/(?:a+|ab)+c/
4138 aabc
4139
4140/(?(?=(a))a)/
4141 a
4142
4143/(?(?=(a))a)(b)/
4144 ab
4145
4146/^(?:a|ab)++c/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004147\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004148 aaaabc
4149
4150/^(?>a|ab)++c/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004151\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004152 aaaabc
4153
4154/^(?:a|ab)+c/
4155 aaaabc
4156
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004157/(?=abc){3}abc/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004158 abcabcabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004159\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004160 xyz
4161
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004162/(?=abc)+abc/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004163 abcabcabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004164\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004165 xyz
4166
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004167/(?=abc)++abc/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004168 abcabcabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004169\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004170 xyz
4171
4172/(?=abc){0}xyz/
4173 xyz
4174
4175/(?=abc){1}xyz/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004176\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004177 xyz
4178
4179/(?=(a))?./
4180 ab
4181 bc
4182
4183/(?=(a))??./
4184 ab
4185 bc
4186
4187/^(?=(?1))?[az]([abc])d/
4188 abd
4189 zcdxx
4190
4191/^(?!a){0}\w+/
4192 aaaaa
4193
4194/(?<=(abc))?xyz/
4195 abcxyz
4196 pqrxyz
4197
4198/^[\g<a>]+/
4199 ggg<<<aaa>>>
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004200\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004201 \\ga
4202
4203/^[\ga]+/
4204 gggagagaxyz
4205
4206/^[:a[:digit:]]+/
4207 aaaa444:::Z
4208
4209/^[:a[:digit:]:b]+/
4210 aaaa444:::bbbZ
4211
4212/[:a]xxx[b:]/
4213 :xxx:
4214
4215/(?<=a{2})b/i
4216 xaabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004217\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004218 xabc
4219
4220/(?<!a{2})b/i
4221 xabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004222\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004223 xaabc
4224
4225/(?<=a\h)c/
4226 xa c
4227
4228/(?<=[^a]{2})b/
4229 axxbc
4230 aAAbc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004231\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004232 xaabc
4233
4234/(?<=[^a]{2})b/i
4235 axxbc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004236\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004237 aAAbc
4238 xaabc
4239
4240/(?<=a\H)c/
4241 abc
4242
4243/(?<=a\V)c/
4244 abc
4245
4246/(?<=a\v)c/
4247 a\nc
4248
4249/(?(?=c)c|d)++Y/
4250 XcccddYX
4251
4252/(?(?=c)c|d)*+Y/
4253 XcccddYX
4254
4255/^(a{2,3}){2,}+a/
4256 aaaaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004257\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004258 aaaaaa
4259 aaaaaaaaa
4260
4261/^(a{2,3})++a/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004262\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004263 aaaaaa
4264
4265/^(a{2,3})*+a/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004266\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004267 aaaaaa
4268
Nick Kralevichf73ff172014-09-27 12:41:49 -07004269/\H\h\V\v/
4270 X X\x0a
4271 X\x09X\x0b
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004272\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004273 \xa0 X\x0a
4274
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004275/\H*\h+\V?\v{3,4}/
Nick Kralevichf73ff172014-09-27 12:41:49 -07004276 \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
4277 \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
4278 \x09\x20\xa0\x0a\x0b\x0c
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004279\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004280 \x09\x20\xa0\x0a\x0b
4281
4282/\H{3,4}/
4283 XY ABCDE
4284 XY PQR ST
4285
4286/.\h{3,4}./
4287 XY AB PQRS
4288
4289/\h*X\h?\H+Y\H?Z/
4290 >XNNNYZ
4291 > X NYQZ
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004292\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004293 >XYZ
4294 > X NY Z
4295
4296/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/
4297 >XY\x0aZ\x0aA\x0bNN\x0c
4298 >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c
4299
4300/(foo)\Kbar/
4301 foobar
4302
4303/(foo)(\Kbar|baz)/
4304 foobar
4305 foobaz
4306
4307/(foo\Kbar)baz/
4308 foobarbaz
4309
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004310/abc\K|def\K/g,aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004311 Xabcdefghi
4312
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004313/ab\Kc|de\Kf/g,aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004314 Xabcdefghi
4315
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004316/(?=C)/g,aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004317 ABCDECBA
4318
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004319/^abc\K/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07004320 abcdef
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004321\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004322 defabcxyz
4323
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004324/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-2}Z/
Nick Kralevichf73ff172014-09-27 12:41:49 -07004325 ababababbbabZXXXX
4326
4327/(?<A>tom|bon)-\g{A}/
4328 tom-tom
4329 bon-bon
4330
4331/(^(a|b\g{-1}))/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004332\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004333 bacxxx
4334
4335/(?|(abc)|(xyz))\1/
4336 abcabc
4337 xyzxyz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004338\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004339 abcxyz
4340 xyzabc
4341
4342/(?|(abc)|(xyz))(?1)/
4343 abcabc
4344 xyzabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004345\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004346 xyzxyz
4347
4348/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/
4349 XYabcdY
4350
4351/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/
4352 XYabcdY
4353
4354/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/
4355 XYabcdY
4356
4357/(?'abc'\w+):\k<abc>{2}/
4358 a:aaxyz
4359 ab:ababxyz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004360\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004361 a:axyz
4362 ab:abxyz
4363
4364/(?'abc'\w+):\g{abc}{2}/
4365 a:aaxyz
4366 ab:ababxyz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004367\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004368 a:axyz
4369 ab:abxyz
4370
4371/^(?<ab>a)? (?(<ab>)b|c) (?('ab')d|e)/x
4372 abd
4373 ce
4374
4375/^(a.)\g-1Z/
4376 aXaXZ
4377
4378/^(a.)\g{-1}Z/
4379 aXaXZ
4380
4381/^(?(DEFINE) (?<A> a) (?<B> b) ) (?&A) (?&B) /x
4382 abcd
4383
4384/(?<NAME>(?&NAME_PAT))\s+(?<ADDR>(?&ADDRESS_PAT))
4385 (?(DEFINE)
4386 (?<NAME_PAT>[a-z]+)
4387 (?<ADDRESS_PAT>\d+)
4388 )/x
4389 metcalfe 33
4390
4391/(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/
4392 1.2.3.4
4393 131.111.10.206
4394 10.0.0.0
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004395\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004396 10.6
4397 455.3.4.5
4398
4399/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/
4400 1.2.3.4
4401 131.111.10.206
4402 10.0.0.0
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004403\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004404 10.6
4405 455.3.4.5
4406
4407/^(\w++|\s++)*$/
4408 now is the time for all good men to come to the aid of the party
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004409\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004410 this is not a line with only words and spaces!
4411
4412/(\d++)(\w)/
4413 12345a
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004414\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004415 12345+
4416
4417/a++b/
4418 aaab
4419
4420/(a++b)/
4421 aaab
4422
4423/(a++)b/
4424 aaab
4425
4426/([^()]++|\([^()]*\))+/
4427 ((abc(ade)ufh()()x
4428
4429/\(([^()]++|\([^()]+\))+\)/
4430 (abc)
4431 (abc(def)xyz)
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004432\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004433 ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
4434
4435/^([^()]|\((?1)*\))*$/
4436 abc
4437 a(b)c
4438 a(b(c))d
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004439\= Expect no match)
Nick Kralevichf73ff172014-09-27 12:41:49 -07004440 a(b(c)d
4441
4442/^>abc>([^()]|\((?1)*\))*<xyz<$/
4443 >abc>123<xyz<
4444 >abc>1(2)3<xyz<
4445 >abc>(1(2)3)<xyz<
4446
4447/^(?:((.)(?1)\2|)|((.)(?3)\4|.))$/i
4448 1221
4449 Satanoscillatemymetallicsonatas
4450 AmanaplanacanalPanama
4451 AblewasIereIsawElba
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004452\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004453 Thequickbrownfox
4454
4455/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
4456 12
4457 (((2+2)*-3)-7)
4458 -12
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004459\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004460 ((2+2)*-3)-7)
4461
4462/^(x(y|(?1){2})z)/
4463 xyz
4464 xxyzxyzz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004465\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004466 xxyzz
4467 xxyzxyzxyzz
4468
4469/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/x
4470 <>
4471 <abcd>
4472 <abc <123> hij>
4473 <abc <def> hij>
4474 <abc<>def>
4475 <abc<>
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004476\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004477 <abc
4478
4479/^a+(*FAIL)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004480\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004481 aaaaaa
4482
4483/a+b?c+(*FAIL)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004484\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004485 aaabccc
4486
4487/a+b?(*PRUNE)c+(*FAIL)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004488\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004489 aaabccc
4490
4491/a+b?(*COMMIT)c+(*FAIL)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004492\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004493 aaabccc
4494
4495/a+b?(*SKIP)c+(*FAIL)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004496\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004497 aaabcccaaabccc
4498
4499/^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/
4500 aaaxxxxxx
4501 aaa++++++
4502 bbbxxxxx
4503 bbb+++++
4504 cccxxxx
4505 ccc++++
4506 dddddddd
4507
4508/^(aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/
4509 aaaxxxxxx
4510 aaa++++++
4511 bbbxxxxx
4512 bbb+++++
4513 cccxxxx
4514 ccc++++
4515 dddddddd
4516
4517/a+b?(*THEN)c+(*FAIL)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004518\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004519 aaabccc
4520
4521/(A (A|B(*ACCEPT)|C) D)(E)/x
4522 AB
4523 ABX
4524 AADE
4525 ACDE
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004526\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004527 AD
4528
4529/^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
4530 1221
4531 Satan, oscillate my metallic sonatas!
4532 A man, a plan, a canal: Panama!
4533 Able was I ere I saw Elba.
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004534\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004535 The quick brown fox
4536
4537/^((.)(?1)\2|.)$/
4538 a
4539 aba
4540 aabaa
4541 abcdcba
4542 pqaabaaqp
4543 ablewasiereisawelba
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004544\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004545 rhubarb
4546 the quick brown fox
4547
4548/(a)(?<=b(?1))/
4549 baz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004550\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004551 caz
4552
4553/(?<=b(?1))(a)/
4554 zbaaz
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004555\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004556 aaa
4557
4558/(?<X>a)(?<=b(?&X))/
4559 baz
4560
4561/^(?|(abc)|(def))\1/
4562 abcabc
4563 defdef
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004564\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004565 abcdef
4566 defabc
4567
4568/^(?|(abc)|(def))(?1)/
4569 abcabc
4570 defabc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004571\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004572 defdef
4573 abcdef
4574
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004575/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/x,dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07004576 a\"aaaaa
4577 b\"aaaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004578\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004579 b\"11111
4580
4581/(?:(?1)|B)(A(*F)|C)/
4582 ABCD
4583 CCD
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004584\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004585 CAD
4586
4587/^(?:(?1)|B)(A(*F)|C)/
4588 CCD
4589 BCD
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004590\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004591 ABCD
4592 CAD
4593 BAD
4594
4595/(?:(?1)|B)(A(*ACCEPT)XX|C)D/
4596 AAD
4597 ACD
4598 BAD
4599 BCD
4600 BAX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004601\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004602 ACX
4603 ABC
4604
4605/(?(DEFINE)(A))B(?1)C/
4606 BAC
4607
4608/(?(DEFINE)((A)\2))B(?1)C/
4609 BAAC
4610
4611/(?<pn> \( ( [^()]++ | (?&pn) )* \) )/x
4612 (ab(cd)ef)
4613
4614/^(?=a(*SKIP)b|ac)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004615\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004616 ac
4617
4618/^(?=a(*PRUNE)b)/
4619 ab
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004620\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004621 ac
4622
4623/^(?=a(*ACCEPT)b)/
4624 ac
4625
4626/(?>a\Kb)/
4627 ab
4628
4629/((?>a\Kb))/
4630 ab
4631
4632/(a\Kb)/
4633 ab
4634
4635/^a\Kcz|ac/
4636 ac
4637
4638/(?>a\Kbz|ab)/
4639 ab
4640
4641/^(?&t)(?(DEFINE)(?<t>a\Kb))$/
4642 ab
4643
4644/^([^()]|\((?1)*\))*$/
4645 a(b)c
4646 a(b(c)d)e
4647
4648/(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/
4649 0
4650 00
4651 0000
4652
4653/(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/
4654 0
4655 00
4656 0000
4657
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004658# This one does fail, as expected, in Perl. It needs the complex item at the
4659# end of the pattern. A single letter instead of (B|D) makes it not fail, which
4660# I think is a Perl bug.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004661
4662/A(*COMMIT)(B|D)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004663\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004664 ACABX
4665
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004666# Check the use of names for failure
Nick Kralevichf73ff172014-09-27 12:41:49 -07004667
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004668/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
4669\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004670 AC
4671 CB
4672
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004673/(*MARK:A)(*SKIP:B)(C|X)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004674 C
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004675\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004676 D
4677
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004678/^(A(*THEN:A)B|C(*THEN:B)D)/mark
4679\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004680 CB
4681
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004682/^(?:A(*THEN:A)B|C(*THEN:B)D)/mark
4683\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004684 CB
4685
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004686/^(?>A(*THEN:A)B|C(*THEN:B)D)/mark
4687\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004688 CB
4689
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004690# This should succeed, as the skip causes bump to offset 1 (the mark). Note
4691# that we have to have something complicated such as (B|Z) at the end because,
4692# for Perl, a simple character somehow causes an unwanted optimization to mess
4693# with the handling of backtracking verbs.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004694
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004695/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/x,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004696 AAAC
4697
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004698# Test skipping over a non-matching mark.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004699
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004700/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/x,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004701 AAAC
4702
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004703# Check shorthand for MARK.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004704
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004705/A(*:A)A+(*SKIP:A)(B|Z) | AC/x,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004706 AAAC
4707
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004708/(*:A)A+(*SKIP:A)(B|Z)/mark
4709\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004710 AAAC
4711
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004712# This should succeed, as a non-existent skip name disables the skip.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004713
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004714/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004715 AAAC
4716
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004717/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/x,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004718 AAAC
4719
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004720# COMMIT at the start of a pattern should act like an anchor. Again, however,
4721# we need the complication for Perl.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004722
4723/(*COMMIT)(A|P)(B|P)(C|P)/
4724 ABCDEFG
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004725\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004726 DEFGABC
4727
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004728# COMMIT inside an atomic group can't stop backtracking over the group.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004729
4730/(\w+)(?>b(*COMMIT))\w{2}/
4731 abbb
4732
4733/(\w+)b(*COMMIT)\w{2}/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004734\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004735 abbb
4736
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004737# Check opening parens in comment when seeking forward reference.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004738
4739/(?&t)(?#()(?(DEFINE)(?<t>a))/
4740 bac
4741
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004742# COMMIT should override THEN.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004743
4744/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004745\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004746 yes
4747
4748/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004749\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004750 yes
4751
4752/b?(*SKIP)c/
4753 bc
4754 abc
4755
4756/(*SKIP)bc/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004757\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004758 a
4759
4760/(*SKIP)b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004761\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004762 a
4763
4764/(?P<abn>(?P=abn)xxx|)+/
4765 xxx
4766
4767/(?i:([^b]))(?1)/
4768 aa
4769 aA
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004770\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004771 ab
4772 aB
4773 Ba
4774 ba
4775
4776/^(?&t)*+(?(DEFINE)(?<t>a))\w$/
4777 aaaaaaX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004778\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004779 aaaaaa
4780
4781/^(?&t)*(?(DEFINE)(?<t>a))\w$/
4782 aaaaaaX
4783 aaaaaa
4784
4785/^(a)*+(\w)/
4786 aaaaX
4787 YZ
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004788\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004789 aaaa
4790
4791/^(?:a)*+(\w)/
4792 aaaaX
4793 YZ
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004794\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004795 aaaa
4796
4797/^(a)++(\w)/
4798 aaaaX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004799\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004800 aaaa
4801 YZ
4802
4803/^(?:a)++(\w)/
4804 aaaaX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004805\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004806 aaaa
4807 YZ
4808
4809/^(a)?+(\w)/
4810 aaaaX
4811 YZ
4812
4813/^(?:a)?+(\w)/
4814 aaaaX
4815 YZ
4816
4817/^(a){2,}+(\w)/
4818 aaaaX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004819\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004820 aaa
4821 YZ
4822
4823/^(?:a){2,}+(\w)/
4824 aaaaX
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004825\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004826 aaa
4827 YZ
4828
4829/(a|)*(?1)b/
4830 b
4831 ab
4832 aab
4833
4834/(a)++(?1)b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004835\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004836 ab
4837 aab
4838
4839/(a)*+(?1)b/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004840\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004841 ab
4842 aab
4843
4844/(?1)(?:(b)){0}/
4845 b
4846
4847/(foo ( \( ((?:(?> [^()]+ )|(?2))*) \) ) )/x
4848 foo(bar(baz)+baz(bop))
4849
4850/(A (A|B(*ACCEPT)|C) D)(E)/x
4851 AB
4852
4853/\A.*?(a|bc)/
4854 ba
4855
4856/\A.*?(?:a|bc)++/
4857 ba
4858
4859/\A.*?(a|bc)++/
4860 ba
4861
4862/\A.*?(?:a|bc|d)/
4863 ba
4864
4865/(?:(b))++/
4866 beetle
4867
4868/(?(?=(a(*ACCEPT)z))a)/
4869 a
4870
4871/^(a)(?1)+ab/
4872 aaaab
4873
4874/^(a)(?1)++ab/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004875\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004876 aaaab
4877
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004878/^(?=a(*:M))aZ/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004879 aZbc
4880
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004881/^(?!(*:M)b)aZ/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004882 aZbc
4883
4884/(?(DEFINE)(a))?b(?1)/
4885 backgammon
4886
4887/^\N+/
4888 abc\ndef
4889
4890/^\N{1,}/
4891 abc\ndef
4892
4893/(?(R)a+|(?R)b)/
4894 aaaabcde
4895
4896/(?(R)a+|((?R))b)/
4897 aaaabcde
4898
4899/((?(R)a+|(?1)b))/
4900 aaaabcde
4901
4902/((?(R1)a+|(?1)b))/
4903 aaaabcde
4904
4905/((?(R)a|(?1)))*/
4906 aaa
4907
4908/((?(R)a|(?1)))+/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004909 aaa
Nick Kralevichf73ff172014-09-27 12:41:49 -07004910
4911/a(*:any
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004912name)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07004913 abc
4914
4915/(?>(?&t)c|(?&t))(?(DEFINE)(?<t>a|b(*PRUNE)c))/
4916 a
4917 ba
4918 bba
4919
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004920# Checking revised (*THEN) handling.
Nick Kralevichf73ff172014-09-27 12:41:49 -07004921
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004922# Capture
Nick Kralevichf73ff172014-09-27 12:41:49 -07004923
4924/^.*? (a(*THEN)b) c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004925\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004926 aabc
4927
4928/^.*? (a(*THEN)b|(*F)) c/x
4929 aabc
4930
4931/^.*? ( (a(*THEN)b) | (*F) ) c/x
4932 aabc
4933
4934/^.*? ( (a(*THEN)b) ) c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004935\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004936 aabc
4937
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004938# Non-capture
Nick Kralevichf73ff172014-09-27 12:41:49 -07004939
4940/^.*? (?:a(*THEN)b) c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004941\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004942 aabc
4943
4944/^.*? (?:a(*THEN)b|(*F)) c/x
4945 aabc
4946
4947/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x
4948 aabc
4949
4950/^.*? (?: (?:a(*THEN)b) ) c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004951\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004952 aabc
4953
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004954# Atomic
Nick Kralevichf73ff172014-09-27 12:41:49 -07004955
4956/^.*? (?>a(*THEN)b) c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004957\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004958 aabc
4959
4960/^.*? (?>a(*THEN)b|(*F)) c/x
4961 aabc
4962
4963/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x
4964 aabc
4965
4966/^.*? (?> (?>a(*THEN)b) ) c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004967\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004968 aabc
4969
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004970# Possessive capture
Nick Kralevichf73ff172014-09-27 12:41:49 -07004971
4972/^.*? (a(*THEN)b)++ c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004973\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004974 aabc
4975
4976/^.*? (a(*THEN)b|(*F))++ c/x
4977 aabc
4978
4979/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x
4980 aabc
4981
4982/^.*? ( (a(*THEN)b)++ )++ c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004983\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004984 aabc
4985
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004986# Possessive non-capture
Nick Kralevichf73ff172014-09-27 12:41:49 -07004987
4988/^.*? (?:a(*THEN)b)++ c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004989\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07004990 aabc
4991
4992/^.*? (?:a(*THEN)b|(*F))++ c/x
4993 aabc
4994
4995/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x
4996 aabc
4997
4998/^.*? (?: (?:a(*THEN)b)++ )++ c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01004999\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005000 aabc
5001
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005002# Condition assertion
Nick Kralevichf73ff172014-09-27 12:41:49 -07005003
5004/^(?(?=a(*THEN)b)ab|ac)/
5005 ac
5006
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005007# Condition
Nick Kralevichf73ff172014-09-27 12:41:49 -07005008
5009/^.*?(?(?=a)a|b(*THEN)c)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005010\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005011 ba
5012
5013/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/
5014 ba
5015
5016/^.*?(?(?=a)a(*THEN)b|c)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005017\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005018 ac
5019
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005020# Assertion
Nick Kralevichf73ff172014-09-27 12:41:49 -07005021
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005022/^.*(?=a(*THEN)b)/
Nick Kralevichf73ff172014-09-27 12:41:49 -07005023 aabc
5024
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005025# --------------------------
Nick Kralevichf73ff172014-09-27 12:41:49 -07005026
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005027/(?>a(*:m))/imsx,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005028 a
5029
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005030/(?>(a)(*:m))/imsx,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005031 a
5032
5033/(?<=a(*ACCEPT)b)c/
5034 xacd
5035
5036/(?<=(a(*ACCEPT)b))c/
5037 xacd
5038
5039/(?<=(a(*COMMIT)b))c/
5040 xabcd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005041\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005042 xacd
5043
5044/(?<!a(*FAIL)b)c/
5045 xcd
5046 acd
5047
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005048/(?<=a(*:N)b)c/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005049 xabcd
5050
5051/(?<=a(*PRUNE)b)c/
5052 xabcd
5053
5054/(?<=a(*SKIP)b)c/
5055 xabcd
5056
5057/(?<=a(*THEN)b)c/
5058 xabcd
5059
5060/(a)(?2){2}(.)/
5061 abcd
5062
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005063/(*MARK:A)(*PRUNE:B)(C|X)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005064 C
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005065\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005066 D
5067
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005068/(*MARK:A)(*PRUNE:B)(C|X)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005069 C
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005070\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005071 D
5072
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005073/(*MARK:A)(*THEN:B)(C|X)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005074 C
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005075\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005076 D
5077
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005078/(*MARK:A)(*THEN:B)(C|X)/mark,no_start_optimize
Nick Kralevichf73ff172014-09-27 12:41:49 -07005079 C
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005080\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005081 D
5082
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005083/(*MARK:A)(*THEN:B)(C|X)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005084 C
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005085\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005086 D
5087
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005088# This should fail, as the skip causes a bump to offset 3 (the skip).
Nick Kralevichf73ff172014-09-27 12:41:49 -07005089
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005090/A(*MARK:A)A+(*SKIP)(B|Z) | AC/x,mark
5091\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005092 AAAC
5093
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005094# Same
Nick Kralevichf73ff172014-09-27 12:41:49 -07005095
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005096/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/x,mark
5097\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005098 AAAC
5099
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005100/A(*:A)A+(*SKIP)(B|Z) | AC/x,mark
5101\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005102 AAAC
5103
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005104# This should fail, as a null name is the same as no name.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005105
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005106/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/x,mark
5107\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005108 AAAC
5109
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005110# A check on what happens after hitting a mark and them bumping along to
5111# something that does not even start. Perl reports tags after the failures
5112# here, though it does not when the individual letters are made into something
5113# more complicated.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005114
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005115/A(*:A)B|XX(*:B)Y/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005116 AABC
5117 XXYZ
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005118\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005119 XAQQ
5120 XAQQXZZ
5121 AXQQQ
5122 AXXQQQ
5123
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005124/^(A(*THEN:A)B|C(*THEN:B)D)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005125 AB
5126 CD
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005127\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005128 AC
5129 CB
5130
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005131/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005132 AB
5133 CD
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005134\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005135 AC
5136 CB
5137
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005138# An empty name does not pass back an empty string. It is the same as if no
5139# name were given.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005140
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005141/^(A(*PRUNE:)B|C(*PRUNE:B)D)/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005142 AB
5143 CD
5144
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005145# PRUNE goes to next bumpalong; COMMIT does not.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005146
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005147/A(*PRUNE:A)B/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005148 ACAB
5149
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005150# Mark names can be duplicated.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005151
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005152/A(*:A)B|X(*:A)Y/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005153 AABC
5154 XXYZ
5155
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005156/b(*:m)f|a(*:n)w/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005157 aw
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005158\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005159 abc
5160
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005161/b(*:m)f|aw/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005162 abaw
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005163\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005164 abc
5165 abax
5166
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005167/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/x,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005168 AAAC
5169
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005170/(?=a(*MARK:A)b)..x/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005171 abxy
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005172\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005173 abpq
5174
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005175/(?=a(*MARK:A)b)..(*:Y)x/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005176 abxy
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005177\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005178 abpq
5179
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005180/(?=a(*PRUNE:A)b)..x/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005181 abxy
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005182\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005183 abpq
5184
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005185/(?=a(*PRUNE:A)b)..(*:Y)x/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005186 abxy
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005187\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005188 abpq
5189
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005190/(?=a(*THEN:A)b)..x/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005191 abxy
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005192\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005193 abpq
5194
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005195/(?=a(*THEN:A)b)..(*:Y)x/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005196 abxy
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005197\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005198 abpq
5199
5200/(another)?(\1?)test/
5201 hello world test
5202
5203/(another)?(\1+)test/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005204\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005205 hello world test
5206
5207/(a(*COMMIT)b){0}a(?1)|aac/
5208 aac
5209
5210/((?:a?)*)*c/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005211 aac
Nick Kralevichf73ff172014-09-27 12:41:49 -07005212
5213/((?>a?)*)*c/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005214 aac
Nick Kralevichf73ff172014-09-27 12:41:49 -07005215
5216/(?>.*?a)(?<=ba)/
5217 aba
5218
5219/(?:.*?a)(?<=ba)/
5220 aba
5221
Nick Kralevichf73ff172014-09-27 12:41:49 -07005222/(?>.*?a)b/s
5223 aab
5224
5225/(?>.*?a)b/
5226 aab
5227
5228/(?>^a)b/s
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005229\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005230 aab
5231
5232/(?>.*?)(?<=(abcd)|(wxyz))/
5233 alphabetabcd
5234 endingwxyz
5235
5236/(?>.*)(?<=(abcd)|(wxyz))/
5237 alphabetabcd
5238 endingwxyz
5239
Elliott Hughes3435c422020-12-04 13:18:28 -08005240/(?>.*)foo/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005241\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005242 abcdfooxyz
5243
Elliott Hughes3435c422020-12-04 13:18:28 -08005244/(?>.*?)foo/
Nick Kralevichf73ff172014-09-27 12:41:49 -07005245 abcdfooxyz
5246
5247/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/
5248 ac
5249
5250/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/
5251 ac
5252
5253/(?<=(*SKIP)ac)a/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005254\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005255 aa
5256
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005257/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005258 AAAC
5259
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005260/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005261 acacd
5262
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005263/A(*SKIP:m)x|A(*SKIP:n)x|AB/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005264 AB
5265
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005266/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005267 acacd
5268
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005269# Tests that try to figure out how Perl works. My hypothesis is that the first
5270# verb that is backtracked onto is the one that acts. This seems to be the case
5271# almost all the time, but there is one exception that is perhaps a bug.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005272
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005273# This matches "aaaac"; each PRUNE advances one character until the subject no
5274# longer starts with 5 'a's.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005275
5276/aaaaa(*PRUNE)b|a+c/
5277 aaaaaac
5278
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005279# Putting SKIP in front of PRUNE makes no difference, as it is never
5280# backtracked onto, whether or not it has a label.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005281
5282/aaaaa(*SKIP)(*PRUNE)b|a+c/
5283 aaaaaac
5284
5285/aaaaa(*SKIP:N)(*PRUNE)b|a+c/
5286 aaaaaac
5287
5288/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/
5289 aaaaaac
5290
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005291# Putting THEN in front makes no difference.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005292
5293/aaaaa(*THEN)(*PRUNE)b|a+c/
5294 aaaaaac
5295
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005296# However, putting COMMIT in front of the prune changes it to "no match". I
5297# think this is inconsistent and possibly a bug. For the moment, running this
5298# test is moved out of the Perl-compatible file.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005299
5300/aaaaa(*COMMIT)(*PRUNE)b|a+c/
5301
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005302# OK, lets play the same game again using SKIP instead of PRUNE.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005303
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005304# This matches "ac" because SKIP forces the next match to start on the
5305# sixth "a".
Nick Kralevichf73ff172014-09-27 12:41:49 -07005306
5307/aaaaa(*SKIP)b|a+c/
5308 aaaaaac
5309
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005310# Putting PRUNE in front makes no difference.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005311
5312/aaaaa(*PRUNE)(*SKIP)b|a+c/
5313 aaaaaac
5314
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005315# Putting THEN in front makes no difference.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005316
5317/aaaaa(*THEN)(*SKIP)b|a+c/
5318 aaaaaac
5319
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005320# In this case, neither does COMMIT. This still matches "ac".
Nick Kralevichf73ff172014-09-27 12:41:49 -07005321
5322/aaaaa(*COMMIT)(*SKIP)b|a+c/
5323 aaaaaac
5324
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005325# This gives "no match", as expected.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005326
5327/aaaaa(*COMMIT)b|a+c/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005328\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005329 aaaaaac
Nick Kralevichf73ff172014-09-27 12:41:49 -07005330
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005331# ---- Tests using THEN ----
Nick Kralevichf73ff172014-09-27 12:41:49 -07005332
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005333# This matches "aaaaaac", as expected.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005334
5335/aaaaa(*THEN)b|a+c/
5336 aaaaaac
5337
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005338# Putting SKIP in front makes no difference.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005339
5340/aaaaa(*SKIP)(*THEN)b|a+c/
5341 aaaaaac
5342
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005343# Putting PRUNE in front makes no difference.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005344
5345/aaaaa(*PRUNE)(*THEN)b|a+c/
5346 aaaaaac
5347
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005348# Putting COMMIT in front makes no difference.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005349
5350/aaaaa(*COMMIT)(*THEN)b|a+c/
5351 aaaaaac
5352
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005353# End of "priority" tests
Nick Kralevichf73ff172014-09-27 12:41:49 -07005354
5355/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/
5356 aaaaaa
5357
5358/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/
5359 aaaaaa
5360
5361/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/
5362 aaaaaa
5363
5364/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/
5365 aaaaaa
5366
5367/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/
5368 aaaac
5369
5370/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/
5371 aaaac
5372
5373/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/
5374 aaaac
5375
5376/aaa(*MARK:A)a(*SKIP:A)b|a+c/
5377 aaaac
5378
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005379/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005380 aaaaaac
5381
5382/.?(a|b(*THEN)c)/
5383 ba
5384
5385/(a(*COMMIT)b)c|abd/
5386 abc
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005387\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005388 abd
5389
5390/(?=a(*COMMIT)b)abc|abd/
5391 abc
5392 abd
5393
5394/(?>a(*COMMIT)b)c|abd/
5395 abc
5396 abd
5397
5398/a(?=b(*COMMIT)c)[^d]|abd/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005399 abc
5400\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005401 abd
Nick Kralevichf73ff172014-09-27 12:41:49 -07005402
5403/a(?=bc).|abd/
5404 abd
5405 abc
5406
5407/a(?>b(*COMMIT)c)d|abd/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005408\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005409 abceabd
5410
5411/a(?>bc)d|abd/
5412 abceabd
5413
5414/(?>a(*COMMIT)b)c|abd/
5415 abd
5416
5417/(?>a(*COMMIT)c)d|abd/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005418\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005419 abd
5420
5421/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/
5422 ac
5423
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005424# These tests were formerly in test 2, but changes in PCRE and Perl have
5425# made them compatible.
Nick Kralevichf73ff172014-09-27 12:41:49 -07005426
5427/^(a)?(?(1)a|b)+$/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005428\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005429 a
5430
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005431/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/x,mark
5432\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005433 AAAC
5434
5435/^((abc|abcx)(*THEN)y|abcd)/
5436 abcd
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005437\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005438 abcxy
5439
5440/^((yes|no)(*THEN)(*F))?/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005441\= Expect no match
5442 yes
Nick Kralevichf73ff172014-09-27 12:41:49 -07005443
5444/(A (.*) C? (*THEN) | A D) (*FAIL)/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005445\= Expect no match
5446 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005447
5448/(A (.*) C? (*THEN) | A D) z/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005449\= Expect no match
5450 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005451
5452/(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005453\= Expect no match
5454 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005455
5456/(A (.*) C? (*THEN) | A D) \s* z/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005457\= Expect no match
5458 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005459
5460/(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005461\= Expect no match
5462 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005463
5464/(A (.*) (?:C|) (*THEN) | A D) z/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005465\= Expect no match
5466 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005467
5468/(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005469\= Expect no match
5470 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005471
5472/(A (.*) C{0,6} (*THEN) | A D) z/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005473\= Expect no match
5474 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005475
5476/(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005477\= Expect no match
5478 AbcdCEBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005479
5480/(A (.*) (CE){0,6} (*THEN) | A D) z/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005481\= Expect no match
5482 AbcdCEBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005483
5484/(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005485\= Expect no match
5486 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005487
5488/(A (.*) (CE*){0,6} (*THEN) | A D) z/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005489\= Expect no match
5490 AbcdCBefgBhiBqz
Nick Kralevichf73ff172014-09-27 12:41:49 -07005491
5492/(?=a(*COMMIT)b|ac)ac|ac/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005493\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005494 ac
5495
5496/(?=a(*COMMIT)b|(ac)) ac | (a)c/x
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005497\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005498 ac
5499
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005500# ----
Nick Kralevichf73ff172014-09-27 12:41:49 -07005501
5502/(?(?!b(*THEN)a)bn|bnn)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005503 bnn
Nick Kralevichf73ff172014-09-27 12:41:49 -07005504
5505/(?!b(*SKIP)a)bn|bnn/
5506 bnn
5507
5508/(?(?!b(*SKIP)a)bn|bnn)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005509 bnn
Nick Kralevichf73ff172014-09-27 12:41:49 -07005510
5511/(?!b(*PRUNE)a)bn|bnn/
5512 bnn
5513
5514/(?(?!b(*PRUNE)a)bn|bnn)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005515 bnn
Nick Kralevichf73ff172014-09-27 12:41:49 -07005516
5517/(?!b(*COMMIT)a)bn|bnn/
5518 bnn
5519
5520/(?(?!b(*COMMIT)a)bn|bnn)/
5521 bnn
5522
5523/(?=b(*SKIP)a)bn|bnn/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005524\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005525 bnn
5526
5527/(?=b(*THEN)a)bn|bnn/
5528 bnn
5529
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005530/^(?!a(*SKIP)b)/
5531 ac
Nick Kralevichf73ff172014-09-27 12:41:49 -07005532
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005533/^(?!a(*SKIP)b)../
5534 acd
Nick Kralevichf73ff172014-09-27 12:41:49 -07005535
5536/(?!a(*SKIP)b)../
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005537 acd
Nick Kralevichf73ff172014-09-27 12:41:49 -07005538
5539/^(?(?!a(*SKIP)b))/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005540 ac
Nick Kralevichf73ff172014-09-27 12:41:49 -07005541
5542/^(?!a(*PRUNE)b)../
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005543 acd
Nick Kralevichf73ff172014-09-27 12:41:49 -07005544
5545/(?!a(*PRUNE)b)../
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005546 acd
Nick Kralevichf73ff172014-09-27 12:41:49 -07005547
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005548/(?!a(*COMMIT)b)ac|cd/
5549 ac
Nick Kralevichf73ff172014-09-27 12:41:49 -07005550
5551/\A.*?(?:a|bc)/
5552 ba
5553
5554/^(A(*THEN)B|C(*THEN)D)/
5555 CD
5556
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005557/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005558 abc
5559
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005560/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005561 abc
5562
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005563/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005564 abc
5565
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005566/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
Nick Kralevichf73ff172014-09-27 12:41:49 -07005567 abc
5568
5569/^\d*\w{4}/
5570 1234
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005571\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005572 123
5573
5574/^[^b]*\w{4}/
5575 aaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005576\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005577 aaa
5578
5579/^[^b]*\w{4}/i
5580 aaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005581\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005582 aaa
5583
5584/^a*\w{4}/
5585 aaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005586\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005587 aaa
5588
5589/^a*\w{4}/i
5590 aaaa
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005591\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005592 aaa
5593
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005594/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07005595 foofoo
5596 barbar
5597
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005598/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07005599 AfooA
5600 AbarA
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005601\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005602 Afoofoo
5603 Abarbar
5604
5605/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
5606 1 IN SOA non-sp1 non-sp2(
5607
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005608/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/x,dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07005609 Ax
5610 BAxy
5611
5612/^A\xZ/
5613 A\0Z
5614
5615/^A\o{123}B/
5616 A\123B
5617
5618/ ^ a + + b $ /x
5619 aaaab
5620
5621/ ^ a + #comment
5622 + b $ /x
5623 aaaab
5624
5625/ ^ a + #comment
5626 #comment
5627 + b $ /x
5628 aaaab
5629
5630/ ^ (?> a + ) b $ /x
5631 aaaab
5632
5633/ ^ ( a + ) + + \w $ /x
5634 aaaab
5635
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005636/(?:a\Kb)*+/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07005637 ababc
5638
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005639/(?>a\Kb)*/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07005640 ababc
5641
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005642/(?:a\Kb)*/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07005643 ababc
5644
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005645/(a\Kb)*+/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07005646 ababc
5647
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005648/(a\Kb)*/aftertext
Nick Kralevichf73ff172014-09-27 12:41:49 -07005649 ababc
5650
5651/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005652\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005653 acb
5654
Elliott Hughes3435c422020-12-04 13:18:28 -08005655/\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++/
Nick Kralevichf73ff172014-09-27 12:41:49 -07005656 NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
5657
Elliott Hughes3435c422020-12-04 13:18:28 -08005658/\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++/
Nick Kralevichf73ff172014-09-27 12:41:49 -07005659 NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
5660
Elliott Hughes3435c422020-12-04 13:18:28 -08005661/\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++/
Nick Kralevichf73ff172014-09-27 12:41:49 -07005662 NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
5663
Elliott Hughes3435c422020-12-04 13:18:28 -08005664/\A([^\"1]++|[\"2]([^\"3]*+|[\"4][\"5])*+[\"6])++/
Nick Kralevichf73ff172014-09-27 12:41:49 -07005665 NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
5666
5667/^\w+(?>\s*)(?<=\w)/
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005668 test test
Nick Kralevichf73ff172014-09-27 12:41:49 -07005669
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005670/(?P<same>a)(?P<same>b)/g,dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07005671 abbaba
5672
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005673/(?P<same>a)(?P<same>b)(?P=same)/g,dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07005674 abbaba
5675
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005676/(?P=same)?(?P<same>a)(?P<same>b)/g,dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07005677 abbaba
5678
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005679/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/g,dupnames
Nick Kralevichf73ff172014-09-27 12:41:49 -07005680 bbbaaabaabb
5681
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005682/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/g,dupnames
5683\= Expect no match
Nick Kralevichf73ff172014-09-27 12:41:49 -07005684 bbbaaaccccaaabbbcc
5685
5686/(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/
5687 acl
5688 bdl
5689 adl
5690 bcl
5691
5692/\sabc/
5693 \x{0b}abc
5694
5695/[\Qa]\E]+/
5696 aa]]
5697
5698/[\Q]a\E]+/
5699 aa]]
5700
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005701/A((((((((a))))))))\8B/
5702 AaaB
5703
5704/A(((((((((a)))))))))\9B/
5705 AaaB
5706
5707/A[\8\9]B/
5708 A8B
5709 A9B
5710
5711/(|ab)*?d/
5712 abd
5713 xyd
5714
Elliott Hughes8366e8b2015-08-14 20:48:15 -07005715/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
5716 1234abcd
5717
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005718/(\2|a)(\1)/
5719 aaa
5720
Elliott Hughes8366e8b2015-08-14 20:48:15 -07005721/(\2)(\1)/
5722
Elliott Hughes3435c422020-12-04 13:18:28 -08005723/Z*(|d*){216}/
Elliott Hughes8366e8b2015-08-14 20:48:15 -07005724
Elliott Hughes3435c422020-12-04 13:18:28 -08005725/(?1)(?#?'){8}(a)/
Elliott Hughes8366e8b2015-08-14 20:48:15 -07005726 baaaaaaaaac
5727
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005728/((((((((((((x))))))))))))\12/
5729 xx
5730
5731/A[\8]B[\9]C/
5732 A8B9C
5733
5734/(?1)()((((((\1++))\x85)+)|))/
5735 \x85\x85
5736
Elliott Hughes3435c422020-12-04 13:18:28 -08005737/(?|(\k'Pm')|(?'Pm'))/
Elliott Hughes0ea98832015-12-04 23:18:20 -08005738 abcd
5739
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01005740/(?|(aaa)|(b))\g{1}/
5741 aaaaaa
5742 bb
5743
5744/(?|(aaa)|(b))(?1)/
5745 aaaaaa
5746 baaa
5747\= Expect no match
5748 bb
5749
5750/(?|(aaa)|(b))/
5751 xaaa
5752 xbc
5753
5754/(?|(?'a'aaa)|(?'a'b))\k'a'/
5755 aaaaaa
5756 bb
5757
5758/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames
5759 aaaccccaaa
5760 bccccb
5761
Elliott Hughes9bc971b2018-07-27 13:23:14 -07005762# /x does not apply to MARK labels
5763
5764/x (*MARK:ab cd # comment
5765ef) x/x,mark
5766 axxz
5767
5768/(?<=a(B){0}c)X/
5769 acX
5770
5771/(?<DEFINE>b)(?(DEFINE)(a+))(?&DEFINE)/
5772 bbbb
5773\= Expect no match
5774 baaab
5775
5776/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/
5777 \ Fred:099
5778
5779/(?=.*X)X$/
5780 \ X
5781
5782/(?s)(?=.*?)b/
5783 aabc
5784
5785/(Z)(a)\2{1,2}?(?-i)\1X/i
5786 ZaAAZX
5787
5788/(?'c')XX(?'YYYYYYYYYYYYYYYYYYYYYYYCl')/
5789
5790/[s[:digit:]\E-H]+/
5791 s09-H
5792
5793/[s[:digit:]\Q\E-H]+/
5794 s09-H
5795
5796/a+(?:|b)a/
5797 aaaa
5798
5799/X?(R||){3335}/
5800
5801/(?1)(A(*COMMIT)|B)D/
5802 ABD
5803 XABD
5804 BAD
5805 ABXABD
5806\= Expect no match
5807 ABX
5808
5809/(?(DEFINE)(?<m> 1? (?=(?<cond>2)?) 1 2 (?('cond')|3)))
5810 \A
5811 ()
5812 (?&m)
5813 \Z/x
5814 123
5815
5816/^(?:
5817(?: A| (1? (?=(?<cond>2)?) (1) 2 (?('cond')|3)) )
5818(Z)
5819)+$/x
5820 AZ123Z
5821\= Expect no match
5822 AZ12Z
5823
5824/^ (?(DEFINE) ( (?!(a)\2b)..) ) ()(?1) /x
5825 acb
5826\= Expect no match
5827 aab
5828
Elliott Hughes3435c422020-12-04 13:18:28 -08005829/(?>ab|abab){1,5}?M/
Elliott Hughes9bc971b2018-07-27 13:23:14 -07005830 abababababababababababM
5831
Elliott Hughes3435c422020-12-04 13:18:28 -08005832/(?>ab|abab){2}?M/
Elliott Hughes9bc971b2018-07-27 13:23:14 -07005833 abababM
5834
Elliott Hughes3435c422020-12-04 13:18:28 -08005835/((?(?=(a))a)+k)/
Elliott Hughes9bc971b2018-07-27 13:23:14 -07005836 bbak
5837
Elliott Hughes3435c422020-12-04 13:18:28 -08005838/((?(?=(a))a|)+k)/
Elliott Hughes9bc971b2018-07-27 13:23:14 -07005839 bbak
5840
Elliott Hughes3435c422020-12-04 13:18:28 -08005841/(?(?!(b))a|b)+k/
Elliott Hughes9bc971b2018-07-27 13:23:14 -07005842 ababbalbbadabak
5843
5844/(?!(b))c|b/
5845 Ab
5846 Ac
5847
5848/(?=(b))b|c/
5849 Ab
5850 Ac
5851
5852/^(.|(.)(?1)\2)$/
5853 a
5854 aba
5855 abcba
5856 ababa
5857 abcdcba
5858
5859/^((.)(?1)\2|.?)$/
5860 a
5861 aba
5862 abba
5863 abcba
5864 ababa
5865 abccba
5866 abcdcba
5867 abcddcba
5868
5869/^(.)(\1|a(?2))/
5870 bab
5871
5872/^(.|(.)(?1)?\2)$/
5873 abcba
5874
5875/^(?(?=(a))abc|def)/
5876 abc
5877
5878/^(?(?!(a))def|abc)/
5879 abc
5880
5881/^(?(?=(a)(*ACCEPT))abc|def)/
5882 abc
5883
5884/^(?(?!(a)(*ACCEPT))def|abc)/
5885 abc
5886
5887/^(?1)\d{3}(a)/
5888 a123a
5889
5890# This pattern uses a lot of named subpatterns in order to match email
5891# addresses in various formats. It's a heavy test for named subpatterns. In the
5892# <atext> group, slash is coded as \x{2f} so that this pattern can also be
5893# processed by perltest.sh, which does not cater for an escaped delimiter
5894# within the pattern. $ within the pattern must also be escaped. All $ and @
5895# characters in subject strings are escaped so that Perl doesn't interpret them
5896# as variable insertions and " characters must also be escaped for Perl.
5897
5898# This set of subpatterns is more or less a direct transliteration of the BNF
5899# definitions in RFC2822, without any of the obsolete features. The addition of
5900# a possessive + to the definition of <phrase> reduced the match limit in PCRE2
5901# from over 5 million to just under 400, and eliminated a very noticeable delay
5902# when this file was passed to perltest.sh.
5903
5904/(?ix)(?(DEFINE)
5905(?<addr_spec> (?&local_part) \@ (?&domain) )
5906(?<angle_addr> (?&CFWS)?+ < (?&addr_spec) > (?&CFWS)?+ )
5907(?<atext> [a-z\d!#\$%&'*+-\x{2f}=?^_`{|}~] )
5908(?<atom> (?&CFWS)?+ (?&atext)+ (?&CFWS)?+ )
5909(?<ccontent> (?&ctext) | (?&quoted_pair) | (?&comment) )
5910(?<ctext> [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ ()\\] )
5911(?<comment> \( (?: (?&FWS)?+ (?&ccontent) )*+ (?&FWS)?+ \) )
5912(?<CFWS> (?: (?&FWS)?+ (?&comment) )* (?# NOT possessive)
5913 (?: (?&FWS)?+ (?&comment) | (?&FWS) ) )
5914(?<dcontent> (?&dtext) | (?&quoted_pair) )
5915(?<display_name> (?&phrase) )
5916(?<domain> (?&dot_atom) | (?&domain_literal) )
5917(?<domain_literal> (?&CFWS)?+ \[ (?: (?&FWS)?+ (?&dcontent) )* (?&FWS)?+ \]
5918 (?&CFWS)?+ )
5919(?<dot_atom> (?&CFWS)?+ (?&dot_atom_text) (?&CFWS)?+ )
5920(?<dot_atom_text> (?&atext)++ (?: \. (?&atext)++)*+ )
5921(?<dtext> [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ \[\]\\] )
5922(?<FWS> (?: [\t\ ]*+ \n)?+ [\t\ ]++ )
5923(?<local_part> (?&dot_atom) | (?&quoted_string) )
5924(?<mailbox> (?&name_addr) | (?&addr_spec) )
5925(?<name_addr> (?&display_name)? (?&angle_addr) )
5926(?<phrase> (?&word)++ )
5927(?<qcontent> (?&qtext) | (?&quoted_pair) )
5928(?<quoted_pair> " (?&text) )
5929(?<quoted_string> (?&CFWS)?+ " (?: (?&FWS)?+ (?&qcontent))* (?&FWS)?+ "
5930 (?&CFWS)?+ )
5931(?<qtext> [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ "\\] )
5932(?<text> [^\r\n] )
5933(?<word> (?&atom) | (?&quoted_string) )
5934) # End DEFINE
5935^(?&mailbox)$/
5936 Alan Other <user\@dom.ain>
5937 <user\@dom.ain>
5938 user\@dom.ain
5939 user\@[]
5940 user\@[domain literal]
5941 user\@[domain literal with \"[square brackets\"] inside]
5942 \"A. Other\" <user.1234\@dom.ain> (a comment)
5943 A. Other <user.1234\@dom.ain> (a comment)
5944 \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
5945\= Expect no match
5946 A missing angle <user\@some.where
5947 The quick brown fox
5948
5949# --------------------------------------------------------------------------
5950
5951# This pattern uses named groups to match default PCRE2 patterns. It's another
5952# heavy test for named subpatterns. Once again, code slash as \x{2f} and escape
5953# $ even in classes so that this works with pcre2test.
5954
5955/(?sx)(?(DEFINE)
5956
5957(?<assertion> (?&simple_assertion) | (?&lookaround) )
5958
5959(?<atomic_group> \( \? > (?&regex) \) )
5960
5961(?<back_reference> \\ \d+ |
5962 \\g (?: [+-]?\d+ | \{ (?: [+-]?\d+ | (?&groupname) ) \} ) |
5963 \\k <(?&groupname)> |
5964 \\k '(?&groupname)' |
5965 \\k \{ (?&groupname) \} |
5966 \( \? P= (?&groupname) \) )
5967
5968(?<branch> (?:(?&assertion) |
5969 (?&callout) |
5970 (?&comment) |
5971 (?&option_setting) |
5972 (?&qualified_item) |
5973 (?&quoted_string) |
5974 (?&quoted_string_empty) |
5975 (?&special_escape) |
5976 (?&verb)
5977 )* )
5978
5979(?<callout> \(\?C (?: \d+ |
5980 (?: (?<D>["'`^%\#\$])
5981 (?: \k'D'\k'D' | (?!\k'D') . )* \k'D' |
5982 \{ (?: \}\} | [^}]*+ )* \} )
5983 )? \) )
5984
5985(?<capturing_group> \( (?: \? P? < (?&groupname) > | \? ' (?&groupname) ' )?
5986 (?&regex) \) )
5987
5988(?<character_class> \[ \^?+ (?: \] (?&class_item)* | (?&class_item)+ ) \] )
5989
5990(?<character_type> (?! \\N\{\w+\} ) \\ [dDsSwWhHvVRN] )
5991
5992(?<class_item> (?: \[ : (?:
5993 alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|
5994 punct|space|upper|word|xdigit
5995 ) : \] |
5996 (?&quoted_string) |
5997 (?&quoted_string_empty) |
5998 (?&escaped_character) |
5999 (?&character_type) |
6000 [^]] ) )
6001
6002(?<comment> \(\?\# [^)]* \) | (?&quoted_string_empty) | \\E )
6003
6004(?<condition> (?: \( [+-]? \d+ \) |
6005 \( < (?&groupname) > \) |
6006 \( ' (?&groupname) ' \) |
6007 \( R \d* \) |
6008 \( R & (?&groupname) \) |
6009 \( (?&groupname) \) |
6010 \( DEFINE \) |
6011 \( VERSION >?=\d+(?:\.\d\d?)? \) |
6012 (?&callout)?+ (?&comment)* (?&lookaround) ) )
6013
6014(?<conditional_group> \(\? (?&condition) (?&branch) (?: \| (?&branch) )? \) )
6015
6016(?<delimited_regex> (?<delimiter> [-\x{2f}!"'`=_:;,%&@~]) (?&regex)
6017 \k'delimiter' .* )
6018
6019(?<escaped_character> \\ (?: 0[0-7]{1,2} | [0-7]{1,3} | o\{ [0-7]+ \} |
6020 x \{ (*COMMIT) [[:xdigit:]]* \} | x [[:xdigit:]]{0,2} |
6021 [aefnrt] | c[[:print:]] |
6022 [^[:alnum:]] ) )
6023
6024(?<group> (?&capturing_group) | (?&non_capturing_group) |
6025 (?&resetting_group) | (?&atomic_group) |
6026 (?&conditional_group) )
6027
6028(?<groupname> [a-zA-Z_]\w* )
6029
6030(?<literal_character> (?! (?&range_qualifier) ) [^[()|*+?.\$\\] )
6031
6032(?<lookaround> \(\? (?: = | ! | <= | <! ) (?&regex) \) )
6033
6034(?<non_capturing_group> \(\? [iJmnsUx-]* : (?&regex) \) )
6035
6036(?<option_setting> \(\? [iJmnsUx-]* \) )
6037
6038(?<qualified_item> (?:\. |
6039 (?&lookaround) |
6040 (?&back_reference) |
6041 (?&character_class) |
6042 (?&character_type) |
6043 (?&escaped_character) |
6044 (?&group) |
6045 (?&subroutine_call) |
6046 (?&literal_character) |
6047 (?&quoted_string)
6048 ) (?&comment)? (?&qualifier)? )
6049
6050(?<qualifier> (?: [?*+] | (?&range_qualifier) ) [+?]? )
6051
6052(?<quoted_string> (?: \\Q (?: (?!\\E | \k'delimiter') . )++ (?: \\E | ) ) )
6053
6054(?<quoted_string_empty> \\Q\\E )
6055
6056(?<range_qualifier> \{ (?: \d+ (?: , \d* )? | , \d+ ) \} )
6057
6058(?<regex> (?&start_item)* (?&branch) (?: \| (?&branch) )* )
6059
6060(?<resetting_group> \( \? \| (?&regex) \) )
6061
6062(?<simple_assertion> \^ | \$ | \\A | \\b | \\B | \\G | \\z | \\Z )
6063
6064(?<special_escape> \\K )
6065
6066(?<start_item> \( \* (?:
6067 ANY |
6068 ANYCRLF |
6069 BSR_ANYCRLF |
6070 BSR_UNICODE |
6071 CR |
6072 CRLF |
6073 LF |
6074 LIMIT_MATCH=\d+ |
6075 LIMIT_DEPTH=\d+ |
6076 LIMIT_HEAP=\d+ |
6077 NOTEMPTY |
6078 NOTEMPTY_ATSTART |
6079 NO_AUTO_POSSESS |
6080 NO_DOTSTAR_ANCHOR |
6081 NO_JIT |
6082 NO_START_OPT |
6083 NUL |
6084 UTF |
6085 UCP ) \) )
6086
6087(?<subroutine_call> (?: \(\?R\) | \(\?[+-]?\d+\) |
6088 \(\? (?: & | P> ) (?&groupname) \) |
6089 \\g < (?&groupname) > |
6090 \\g ' (?&groupname) ' |
6091 \\g < [+-]? \d+ > |
6092 \\g ' [+-]? \d+ ) )
6093
6094(?<verb> \(\* (?: ACCEPT | FAIL | F | COMMIT |
6095 (?:MARK)?:(?&verbname) |
6096 (?:PRUNE|SKIP|THEN) (?: : (?&verbname)? )? ) \) )
6097
6098(?<verbname> [^)]+ )
6099
6100) # End DEFINE
6101# Kick it all off...
6102^(?&delimited_regex)$/subject_literal,jitstack=256
6103 /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
6104 /(cat(a(ract|tonic)|erpillar)) \1()2(3)/
6105 /^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]/
6106 /^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
6107 /<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
6108 /^(?(DEFINE) (?<A> a) (?<B> b) ) (?&A) (?&B) /
6109 /(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/
6110 /\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/
6111 /^(\w++|\s++)*$/
6112 /a+b?(*THEN)c+(*FAIL)/
6113 /(A (A|B(*ACCEPT)|C) D)(E)/x
6114 /^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
6115 /A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/B
6116 /(?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
6117 /(?sx)(?(DEFINE)(?<assertion> (?&simple_assertion) | (?&lookaround) )(?<atomic_group> \( \? > (?&regex) \) )(?<back_reference> \\ \d+ | \\g (?: [+-]?\d+ | \{ (?: [+-]?\d+ | (?&groupname) ) \} ) | \\k <(?&groupname)> | \\k '(?&groupname)' | \\k \{ (?&groupname) \} | \( \? P= (?&groupname) \) )(?<branch> (?:(?&assertion) | (?&callout) | (?&comment) | (?&option_setting) | (?&qualified_item) | (?&quoted_string) | (?&quoted_string_empty) | (?&special_escape) | (?&verb) )* )(?<callout> \(\?C (?: \d+ | (?: (?<D>["'`^%\#\$]) (?: \k'D'\k'D' | (?!\k'D') . )* \k'D' | \{ (?: \}\} | [^}]*+ )* \} ) )? \) )(?<capturing_group> \( (?: \? P? < (?&groupname) > | \? ' (?&groupname) ' )? (?&regex) \) )(?<character_class> \[ \^?+ (?: \] (?&class_item)* | (?&class_item)+ ) \] )(?<character_type> (?! \\N\{\w+\} ) \\ [dDsSwWhHvVRN] )(?<class_item> (?: \[ : (?: alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print| punct|space|upper|word|xdigit ) : \] | (?&quoted_string) | (?&quoted_string_empty) | (?&escaped_character) | (?&character_type) | [^]] ) )(?<comment> \(\?\# [^)]* \) | (?&quoted_string_empty) | \\E )(?<condition> (?: \( [+-]? \d+ \) | \( < (?&groupname) > \) | \( ' (?&groupname) ' \) | \( R \d* \) | \( R & (?&groupname) \) | \( (?&groupname) \) | \( DEFINE \) | \( VERSION >?=\d+(?:\.\d\d?)? \) | (?&callout)?+ (?&comment)* (?&lookaround) ) )(?<conditional_group> \(\? (?&condition) (?&branch) (?: \| (?&branch) )? \) )(?<delimited_regex> (?<delimiter> [-\x{2f}!"'`=_:;,%&@~]) (?&regex) \k'delimiter' .* )(?<escaped_character> \\ (?: 0[0-7]{1,2} | [0-7]{1,3} | o\{ [0-7]+ \} | x \{ (*COMMIT) [[:xdigit:]]* \} | x [[:xdigit:]]{0,2} | [aefnrt] | c[[:print:]] | [^[:alnum:]] ) )(?<group> (?&capturing_group) | (?&non_capturing_group) | (?&resetting_group) | (?&atomic_group) | (?&conditional_group) )(?<groupname> [a-zA-Z_]\w* )(?<literal_character> (?! (?&range_qualifier) ) [^[()|*+?.\$\\] )(?<lookaround> \(\? (?: = | ! | <= | <! ) (?&regex) \) )(?<non_capturing_group> \(\? [iJmnsUx-]* : (?&regex) \) )(?<option_setting> \(\? [iJmnsUx-]* \) )(?<qualified_item> (?:\. | (?&lookaround) | (?&back_reference) | (?&character_class) | (?&character_type) | (?&escaped_character) | (?&group) | (?&subroutine_call) | (?&literal_character) | (?&quoted_string) ) (?&comment)? (?&qualifier)? )(?<qualifier> (?: [?*+] | (?&range_qualifier) ) [+?]? )(?<quoted_string> (?: \\Q (?: (?!\\E | \k'delimiter') . )++ (?: \\E | ) ) ) (?<quoted_string_empty> \\Q\\E ) (?<range_qualifier> \{ (?: \d+ (?: , \d* )? | , \d+ ) \} )(?<regex> (?&start_item)* (?&branch) (?: \| (?&branch) )* )(?<resetting_group> \( \? \| (?&regex) \) )(?<simple_assertion> \^ | \$ | \\A | \\b | \\B | \\G | \\z | \\Z )(?<special_escape> \\K )(?<start_item> \( \* (?: ANY | ANYCRLF | BSR_ANYCRLF | BSR_UNICODE | CR | CRLF | LF | LIMIT_MATCH=\d+ | LIMIT_DEPTH=\d+ | LIMIT_HEAP=\d+ | NOTEMPTY | NOTEMPTY_ATSTART | NO_AUTO_POSSESS | NO_DOTSTAR_ANCHOR | NO_JIT | NO_START_OPT | NUL | UTF | UCP ) \) )(?<subroutine_call> (?: \(\?R\) | \(\?[+-]?\d+\) | \(\? (?: & | P> ) (?&groupname) \) | \\g < (?&groupname) > | \\g ' (?&groupname) ' | \\g < [+-]? \d+ > | \\g ' [+-]? \d+ ) )(?<verb> \(\* (?: ACCEPT | FAIL | F | COMMIT | (?:MARK)?:(?&verbname) | (?:PRUNE|SKIP|THEN) (?: : (?&verbname)? )? ) \) )(?<verbname> [^)]+ ))^(?&delimited_regex)$/
6118\= Expect no match
6119 /((?(?C'')\QX\E(?!((?(?C'')(?!X=X));=)r*X=X));=)/
6120 /(?:(?(2y)a|b)(X))+/
6121 /a(*MARK)b/
6122 /a(*CR)b/
6123 /(?P<abn>(?P=abn)(?<badstufxxx)/
6124
6125# --------------------------------------------------------------------------
6126
6127/<(?x:[a b])>/xx
6128 < >
6129
6130/<(?:[a b])>/xx
6131 < >
6132
6133/<(?xxx:[a b])>/
6134 < >
6135
6136/<(?-x:[a b])>/xx
6137 < >
6138
6139/[[:digit:]-]+/
6140 12-24
6141
6142/((?<=((*ACCEPT)) )\1?\b) /
6143\= Expect no match
6144 ((?<=((*ACCEPT)) )\\1?\\b)\x20
6145
6146/((?<=((*ACCEPT))X)\1?Y)\1/
6147 XYYZ
6148
6149/((?<=((*ACCEPT))X)\1?Y(*ACCEPT))\1/
6150 XYYZ
6151
6152/(?(DEFINE)(?<optional_a>a?)X)^(?&optional_a)a$/
6153 aa
6154 a
6155
6156/^(a?)b(?1)a/
6157 abaa
6158 aba
6159 baa
6160 ba
6161
6162/^(a?)+b(?1)a/
6163 abaa
6164 aba
6165 baa
6166 ba
6167
6168/^(a?)++b(?1)a/
6169 abaa
6170 aba
6171 baa
6172 ba
6173
6174/^(a?)+b/
6175 b
6176 ab
6177 aaab
6178
6179/(?=a+)a(a+)++b/
6180 aab
6181
Elliott Hughes653c2102019-01-09 15:41:36 -08006182/(?<=\G.)/g,aftertext
6183 abc
6184
6185/(?<=(?=.)?)/
6186
6187/(?<=(?=.)?+)/
6188
6189/(?<=(?=.)*)/
6190
6191/(?<=(?=.){4,5})/
6192
6193/(?<=(?=.){4,5}x)/
6194
6195/a(?=.(*:X))(*SKIP:X)(*F)|(.)/
6196 abc
6197
6198/a(?>(*:X))(*SKIP:X)(*F)|(.)/
6199 abc
6200
6201/a(?:(*:X))(*SKIP:X)(*F)|(.)/
6202 abc
6203
6204#pattern no_start_optimize
6205
6206/(?>a(*:1))(?>b(*:1))(*SKIP:1)x|.*/
6207 abc
6208
6209/(?>a(*:1))(?>b)(*SKIP:1)x|.*/
6210 abc
6211
6212#subject mark
6213
6214/a(*ACCEPT:X)b/
6215 abc
6216
6217/(?=a(*ACCEPT:QQ)bc)axyz/
6218 axyz
6219
6220/(?(DEFINE)(a(*ACCEPT:X)))(?1)b/
6221 abc
6222
6223/a(*F:X)b/
6224 abc
6225
6226/(?(DEFINE)(a(*F:X)))(?1)b/
6227 abc
6228
6229/a(*COMMIT:X)b/
6230 abc
6231
6232/(?(DEFINE)(a(*COMMIT:X)))(?1)b/
6233 abc
6234
6235/a+(*:Z)b(*COMMIT:X)(*SKIP:Z)c|.*/
6236 aaaabd
6237
6238/a+(*:Z)b(*COMMIT:X)(*SKIP:X)c|.*/
6239 aaaabd
6240
6241/a(*COMMIT:X)b/
6242 axabc
6243
6244#pattern -no_start_optimize
6245#subject -mark
6246
6247/(.COMMIT)(*COMMIT::::::::::interal error:::)/
6248
6249/(*COMMIT:ÿÿ)/
6250
6251/(*COMMIT:]w)/
6252
6253/(?i)A(?^)B(?^x:C D)(?^i)e f/
6254 aBCDE F
6255\= Expect no match
6256 aBCDEF
6257 AbCDe f
6258
Elliott Hughes0c26e192019-08-07 12:24:46 -07006259/(*pla:foo).{6}/
6260 abcfoobarxyz
6261\= Expect no match
6262 abcfooba
6263
6264/(*positive_lookahead:foo).{6}/
6265 abcfoobarxyz
6266
6267/(?(*pla:foo).{6}|a..)/
6268 foobarbaz
6269 abcfoobar
6270
6271/(?(*positive_lookahead:foo).{6}|a..)/
6272 foobarbaz
6273 abcfoobar
6274
6275/(*plb:foo)bar/
6276 abcfoobar
6277\= Expect no match
6278 abcbarfoo
6279
6280/(*positive_lookbehind:foo)bar/
6281 abcfoobar
6282\= Expect no match
6283 abcbarfoo
6284
6285/(?(*plb:foo)bar|baz)/
6286 abcfoobar
6287 bazfoobar
6288 abcbazfoobar
6289 foobazfoobar
6290
6291/(?(*positive_lookbehind:foo)bar|baz)/
6292 abcfoobar
6293 bazfoobar
6294 abcbazfoobar
6295 foobazfoobar
6296
6297/(*nlb:foo)bar/
6298 abcbarfoo
6299\= Expect no match
6300 abcfoobar
6301
6302/(*negative_lookbehind:foo)bar/
6303 abcbarfoo
6304\= Expect no match
6305 abcfoobar
6306
6307/(?(*nlb:foo)bar|baz)/
6308 abcfoobaz
6309 abcbarbaz
6310\= Expect no match
6311 abcfoobar
6312
6313/(?(*negative_lookbehind:foo)bar|baz)/
6314 abcfoobaz
6315 abcbarbaz
6316\= Expect no match
6317 abcfoobar
6318
6319/(*atomic:a+)\w/
6320 aaab
6321\= Expect no match
6322 aaaa
6323
6324/ (?<word> \w+ )* \. /xi
6325 pokus.
6326
6327/(?(DEFINE) (?<word> \w+ ) ) (?&word)* \./xi
6328 pokus.
6329
6330/(?(DEFINE) (?<word> \w+ ) ) ( (?&word)* ) \./xi
6331 pokus.
6332
6333/(?&word)* (?(DEFINE) (?<word> \w+ ) ) \./xi
6334 pokus.
6335
6336/(?&word)* \. (?<word> \w+ )/xi
6337 pokus.hokus
6338
Elliott Hughes2dbd7d22020-06-03 14:32:37 -07006339/a(?(?=(*:2)b).)/mark
6340 abc
6341 acb
6342
6343/a(?(?!(*:2)b).)/mark
6344 acb
6345 abc
6346
6347/(?:a|ab){1}+c/
6348\= Expect no match
6349 abc
6350
6351/(a|ab){1}+c/
6352 abc
6353
6354/(a+){1}+a/
6355\= Expect no match
6356 aaaa
6357
6358/(?(DEFINE)(a|ab))(?1){1}+c/
6359 abc
6360
6361/(?:a|(?=b)|.)*\z/
6362 abc
6363
6364/(?:a|(?=b)|.)*/
6365 abc
6366
6367/(?<=a(*SKIP)x)|c/
6368 abcd
6369
6370/(?<=a(*SKIP)x)|d/
6371 abcd
6372
6373/(?<=(?=.(?<=x)))/aftertext
6374 abx
6375
6376/(?<=(?=(?<=a)))b/
6377 ab
6378
6379/^(?<A>a)(?(<A>)b)((?<=b).*)$/
6380 abc
6381
6382/^(a\1?){4}$/
6383 aaaa
6384 aaaaaa
6385
6386/^((\1+)|\d)+133X$/
6387 111133X
6388
6389/^(?=.*(?=(([A-Z]).*(?(1)\1)))(?!.+\2)){26}/i
6390 The quick brown fox jumps over the lazy dog.
6391 Jackdaws love my big sphinx of quartz.
6392 Pack my box with five dozen liquor jugs.
6393\= Expect no match
6394 The quick brown fox jumps over the lazy cat.
6395 Hackdaws love my big sphinx of quartz.
6396 Pack my fox with five dozen liquor jugs.
6397
6398/^(?>.*?([A-Z])(?!.*\1)){26}/i
6399 The quick brown fox jumps over the lazy dog.
6400 Jackdaws love my big sphinx of quartz.
6401 Pack my box with five dozen liquor jugs.
6402\= Expect no match
6403 The quick brown fox jumps over the lazy cat.
6404 Hackdaws love my big sphinx of quartz.
6405 Pack my fox with five dozen liquor jugs.
6406
Elliott Hughes3435c422020-12-04 13:18:28 -08006407/(?<=X(?(DEFINE)(A)))X(*F)/
Elliott Hughes2dbd7d22020-06-03 14:32:37 -07006408\= Expect no match
6409 AXYZ
6410
Elliott Hughes3435c422020-12-04 13:18:28 -08006411/(?<=X(?(DEFINE)(A)))./
Elliott Hughes2dbd7d22020-06-03 14:32:37 -07006412 AXYZ
6413
Elliott Hughes3435c422020-12-04 13:18:28 -08006414/(?<=X(?(DEFINE)(.*))Y)./
Elliott Hughes2dbd7d22020-06-03 14:32:37 -07006415 AXYZ
6416
Elliott Hughes3435c422020-12-04 13:18:28 -08006417/(?<=X(?(DEFINE)(Y))(?1))./
Elliott Hughes2dbd7d22020-06-03 14:32:37 -07006418 AXYZ
6419
Elliott Hughes3435c422020-12-04 13:18:28 -08006420/(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word/
Elliott Hughes2dbd7d22020-06-03 14:32:37 -07006421 word
6422
Elliott Hughes378b1752021-06-08 13:42:40 -07006423/a{1,2,3}b/
6424 a{1,2,3}b
6425
6426/\214748364/
6427 >\x{8c}748364<
6428
6429/a{65536/
6430 >a{65536<
6431
6432/a\K.(?0)*/
6433 abac
6434
6435/(a\K.(?1)*)/
6436 abac
6437
Janis Danisevskis112c9cc2016-03-31 13:35:25 +01006438# End of testinput1