# This set of tests is for features that are compatible with all versions of # Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and # 32-bit PCRE libraries, and also using the perltest.pl script. #forbid_utf #perltest /the quick brown fox/ the quick brown fox The quick brown FOX What do you know about the quick brown fox? What do you know about THE QUICK BROWN FOX? /The quick brown fox/i the quick brown fox The quick brown FOX What do you know about the quick brown fox? What do you know about THE QUICK BROWN FOX? /abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz *** Failers abxyzpqrrabbxyyyypqAzz abxyzpqrrrrabbxyyyypqAzz abxyzpqrrrabxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyypqAzz aaabcxyzpqrrrabbxyyyypqqqqqqqAzz /^(abc){1,2}zz/ abczz abcabczz *** Failers zz abcabcabczz >>abczz /^(b+?|a){1,2}?c/ bc bbc bbbc bac bbac aac abbbbbbbbbbbc bbbbbbbbbbbac *** Failers aaac abbbbbbbbbbbac /^(b+|a){1,2}c/ bc bbc bbbc bac bbac aac abbbbbbbbbbbc bbbbbbbbbbbac *** Failers aaac abbbbbbbbbbbac /^(b+|a){1,2}?bc/ bbc /^(b*|ba){1,2}?bc/ babc bbabc bababc *** Failers bababbc babababc /^(ba|b*){1,2}?bc/ babc bbabc bababc *** Failers bababbc babababc /^\ca\cA\c[;\c:/ \x01\x01\e;z /^[ab\]cde]/ athing bthing ]thing cthing dthing ething *** Failers fthing [thing \\thing /^[]cde]/ ]thing cthing dthing ething *** Failers athing fthing /^[^ab\]cde]/ fthing [thing \\thing *** Failers athing bthing ]thing cthing dthing ething /^[^]cde]/ athing fthing *** Failers ]thing cthing dthing ething /^\�/ � /^�/ � /^[0-9]+$/ 0 1 2 3 4 5 6 7 8 9 10 100 *** Failers abc /^.*nter/ enter inter uponter /^xxx[0-9]+$/ xxx0 xxx1234 *** Failers xxx /^.+[0-9][0-9][0-9]$/ x123 xx123 123456 *** Failers 123 x1234 /^.+?[0-9][0-9][0-9]$/ x123 xx123 123456 *** Failers 123 x1234 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ abc!pqr=apquxz.ixr.zzz.ac.uk *** Failers !pqr=apquxz.ixr.zzz.ac.uk abc!=apquxz.ixr.zzz.ac.uk abc!pqr=apquxz:ixr.zzz.ac.uk abc!pqr=apquxz.ixr.zzz.ac.ukk /:/ Well, we need a colon: somewhere *** Fail if we don't /([\da-f:]+)$/i 0abc abc fed E :: 5f03:12C0::932e fed def Any old stuff *** Failers 0zzz gzzz fed\x20 Any old rubbish /^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ .1.2.3 A.12.123.0 *** Failers .1.2.3333 1.2.3 1234.2.3 /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ 1 IN SOA non-sp1 non-sp2( 1 IN SOA non-sp1 non-sp2 ( *** Failers 1IN SOA non-sp1 non-sp2( /^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ a. Z. 2. ab-c.pq-r. sxk.zzz.ac.uk. x-.y-. *** Failers -abc.peq. /^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ *.a *.b0-a *.c3-b.c *.c-a.b-c *** Failers *.0 *.a- *.a-b.c- *.c-a.0-c /^(?=ab(de))(abd)(e)/ abde /^(?!(ab)de|x)(abd)(f)/ abdf /^(?=(ab(cd)))(ab)/ abcd /^[\da-f](\.[\da-f])*$/i a.b.c.d A.B.C.D a.b.c.1.2.3.C /^\".*\"\s*(;.*)?$/ \"1234\" \"abcd\" ; \"\" ; rhubarb *** Failers \"1234\" : things /^$/ \ *** Failers / ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x ab c *** Failers abc ab cde /(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ ab c *** Failers abc ab cde /^ a\ b[c ]d $/x a bcd a b d *** Failers abcd ab d /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ abcdefhijklm /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ abcdefhijklm /^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ a+ Z0+\x08\n\x1d\x12 /^[.^$|()*+?{,}]+/ .^\$(*+)|{?,?} /^a*\w/ z az aaaz a aa aaaa a+ aa+ /^a*?\w/ z az aaaz a aa aaaa a+ aa+ /^a+\w/ az aaaz aa aaaa aa+ /^a+?\w/ az aaaz aa aaaa aa+ /^\d{8}\w{2,}/ 1234567890 12345678ab 12345678__ *** Failers 1234567 /^[aeiou\d]{4,5}$/ uoie 1234 12345 aaaaa *** Failers 123456 /^[aeiou\d]{4,5}?/ uoie 1234 12345 aaaaa 123456 /\A(abc|def)=(\1){2,3}\Z/ abc=abcabc def=defdefdef *** Failers abc=defdef /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ abcdefghijkcda2 abcdefghijkkkkcda2 /(cat(a(ract|tonic)|erpillar)) \1()2(3)/ cataract cataract23 catatonic catatonic23 caterpillar caterpillar23 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ From abcd Mon Sep 01 12:33:02 1997 /^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ From abcd Mon Sep 01 12:33:02 1997 From abcd Mon Sep 1 12:33:02 1997 *** Failers From abcd Sep 01 12:33:02 1997 /^12.34/s 12\n34 12\r34 /\w+(?=\t)/ the quick brown\t fox /foo(?!bar)(.*)/ foobar is foolish see? /(?:(?!foo)...|^.{0,2})bar(.*)/ foobar crowbar etc barrel 2barrel A barrel /^(\D*)(?=\d)(?!123)/ abc456 *** Failers abc123 /^1234(?# test newlines inside)/ 1234 /^1234 #comment in extended re /x 1234 /#rhubarb abcd/x abcd /^abcd#rhubarb/x abcd /^(a)\1{2,3}(.)/ aaab aaaab aaaaab aaaaaab /(?!^)abc/ the abc *** Failers abc /(?=^)abc/ abc *** Failers the abc /^[ab]{1,3}(ab*|b)/ aabbbbb /^[ab]{1,3}?(ab*|b)/ aabbbbb /^[ab]{1,3}?(ab*?|b)/ aabbbbb /^[ab]{1,3}(ab*?|b)/ aabbbbb / (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional leading comment (?: (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # one word, optionally followed by.... (?: [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) | # comments, or... " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote # quoted strings )* < (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # leading < (?: @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* , (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* )* # further okay, if led by comma : # closing colon (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address spec (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* > # trailing > # name and address ) (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional trailing comment /x Alan Other <user\@dom.ain> <user\@dom.ain> user\@dom.ain \"A. Other\" <user.1234\@dom.ain> (a comment) A. Other <user.1234\@dom.ain> (a comment) \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay A missing angle <user\@some.where *** Failers The quick brown fox /[\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional leading comment (?: (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) # leading word [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces (?: (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) | " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " ) # "special" comment or quoted string [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" )* < [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # < (?: @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* (?: , [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* )* # additional domains : [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address spec > # > # name and address ) /x Alan Other <user\@dom.ain> <user\@dom.ain> user\@dom.ain \"A. Other\" <user.1234\@dom.ain> (a comment) A. Other <user.1234\@dom.ain> (a comment) \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay A missing angle <user\@some.where *** Failers The quick brown fox /abc\0def\00pqr\000xyz\0000AB/ abc\0def\00pqr\000xyz\0000AB abc456 abc\0def\00pqr\000xyz\0000ABCDE /abc\x0def\x00pqr\x000xyz\x0000AB/ abc\x0def\x00pqr\x000xyz\x0000AB abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE /^[\000-\037]/ \0A \01B \037C /\0*/ \0\0\0\0 /A\x0{2,3}Z/ The A\x0\x0Z An A\0\x0\0Z *** Failers A\0Z A\0\x0\0\x0Z /^(cow|)\1(bell)/ cowcowbell bell *** Failers cowbell /^\s/ \040abc \x0cabc \nabc \rabc \tabc *** Failers abc /^a b c/x abc /^(a|)\1*b/ ab aaaab b *** Failers acb /^(a|)\1+b/ aab aaaab b *** Failers ab /^(a|)\1?b/ ab aab b *** Failers acb /^(a|)\1{2}b/ aaab b *** Failers ab aab aaaab /^(a|)\1{2,3}b/ aaab aaaab b *** Failers ab aab aaaaab /ab{1,3}bc/ abbbbc abbbc abbc *** Failers abc abbbbbc /([^.]*)\.([^:]*):[T ]+(.*)/ track1.title:TBlah blah blah /([^.]*)\.([^:]*):[T ]+(.*)/i track1.title:TBlah blah blah /([^.]*)\.([^:]*):[t ]+(.*)/i track1.title:TBlah blah blah /^[W-c]+$/ WXY_^abc *** Failers wxy /^[W-c]+$/i WXY_^abc wxy_^ABC /^[\x3f-\x5F]+$/i WXY_^abc wxy_^ABC /^abc$/m abc qqq\nabc abc\nzzz qqq\nabc\nzzz /^abc$/ abc *** Failers qqq\nabc abc\nzzz qqq\nabc\nzzz /\Aabc\Z/m abc abc\n *** Failers qqq\nabc abc\nzzz qqq\nabc\nzzz /\A(.)*\Z/s abc\ndef /\A(.)*\Z/m *** Failers abc\ndef /(?:b)|(?::+)/ b::c c::b /[-az]+/ az- *** Failers b /[az-]+/ za- *** Failers b /[a\-z]+/ a-z *** Failers b /[a-z]+/ abcdxyz /[\d-]+/ 12-34 *** Failers aaa /[\d-z]+/ 12-34z *** Failers aaa /\x5c/ \\ /\x20Z/ the Zoo *** Failers Zulu /(abc)\1/i abcabc ABCabc abcABC /ab{3cd/ ab{3cd /ab{3,cd/ ab{3,cd /ab{3,4a}cd/ ab{3,4a}cd /{4,5a}bc/ {4,5a}bc /abc$/ abc abc\n *** Failers abc\ndef /(abc)\123/ abc\x53 /(abc)\223/ abc\x93 /(abc)\323/ abc\xd3 /(abc)\100/ abc\x40 abc\100 /(abc)\1000/ abc\x400 abc\x40\x30 abc\1000 abc\100\x30 abc\100\060 abc\100\60 /^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/ ABCDEFGHIHI /^[A\8B\9C]+$/ A8B9C *** Failers A8B9C\x00 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/ abcdefghijkllS /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/ abcdefghijk\12S /a{0}bc/ bc /(a|(bc)){0,0}?xyz/ xyz /abc[\10]de/ abc\010de /abc[\1]de/ abc\1de /(abc)[\1]de/ abc\1de /(?s)a.b/ a\nb /^([^a])([^\b])([^c]*)([^d]{3,4})/ baNOTccccd baNOTcccd baNOTccd bacccd *** Failers anything b\bc baccd /[^a]/ Abc /[^a]/i Abc /[^a]+/ AAAaAbc /[^a]+/i AAAaAbc /[^a]+/ bbb\nccc /[^k]$/ abc *** Failers abk /[^k]{2,3}$/ abc kbc kabc *** Failers abk akb akk /^\d{8,}\@.+[^k]$/ 12345678\@a.b.c.d 123456789\@x.y.z *** Failers 12345678\@x.y.uk 1234567\@a.b.c.d /(a)\1{8,}/ aaaaaaaaa aaaaaaaaaa *** Failers aaaaaaa /[^a]/ aaaabcd aaAabcd /[^a]/i aaaabcd aaAabcd /[^az]/ aaaabcd aaAabcd /[^az]/i aaaabcd aaAabcd /\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 /P[^*]TAIRE[^*]{1,6}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx /P[^*]TAIRE[^*]{1,}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx /(\.\d\d[1-9]?)\d+/ 1.230003938 1.875000282 1.235 /(\.\d\d((?=0)|\d(?=\d)))/ 1.230003938 1.875000282 *** Failers 1.235 /a(?)b/ ab /\b(foo)\s+(\w+)/i Food is on the foo table /foo(.*)bar/ The food is under the bar in the barn. /foo(.*?)bar/ The food is under the bar in the barn. /(.*)(\d*)/ I have 2 numbers: 53147 /(.*)(\d+)/ I have 2 numbers: 53147 /(.*?)(\d*)/ I have 2 numbers: 53147 /(.*?)(\d+)/ I have 2 numbers: 53147 /(.*)(\d+)$/ I have 2 numbers: 53147 /(.*?)(\d+)$/ I have 2 numbers: 53147 /(.*)\b(\d+)$/ I have 2 numbers: 53147 /(.*\D)(\d+)$/ I have 2 numbers: 53147 /^\D*(?!123)/ ABC123 /^(\D*)(?=\d)(?!123)/ ABC445 *** Failers ABC123 /^[W-]46]/ W46]789 -46]789 *** Failers Wall Zebra 42 [abcd] ]abcd[ /^[W-\]46]/ W46]789 Wall Zebra Xylophone 42 [abcd] ]abcd[ \\backslash *** Failers -46]789 well /\d\d\/\d\d\/\d\d\d\d/ 01/01/2000 /word (?:[a-zA-Z0-9]+ ){0,10}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword word cat dog elephant mussel cow horse canary baboon snake shark /word (?:[a-zA-Z0-9]+ ){0,300}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope /^(a){0,0}/ bcd abc aab /^(a){0,1}/ bcd abc aab /^(a){0,2}/ bcd abc aab /^(a){0,3}/ bcd abc aab aaa /^(a){0,}/ bcd abc aab aaa aaaaaaaa /^(a){1,1}/ bcd abc aab /^(a){1,2}/ bcd abc aab /^(a){1,3}/ bcd abc aab aaa /^(a){1,}/ bcd abc aab aaa aaaaaaaa /.*\.gif/ borfle\nbib.gif\nno /.{0,}\.gif/ borfle\nbib.gif\nno /.*\.gif/m borfle\nbib.gif\nno /.*\.gif/s borfle\nbib.gif\nno /.*\.gif/ms borfle\nbib.gif\nno /.*$/ borfle\nbib.gif\nno /.*$/m borfle\nbib.gif\nno /.*$/s borfle\nbib.gif\nno /.*$/ms borfle\nbib.gif\nno /.*$/ borfle\nbib.gif\nno\n /.*$/m borfle\nbib.gif\nno\n /.*$/s borfle\nbib.gif\nno\n /.*$/ms borfle\nbib.gif\nno\n /(.*X|^B)/ abcde\n1234Xyz BarFoo *** Failers abcde\nBar /(.*X|^B)/m abcde\n1234Xyz BarFoo abcde\nBar /(.*X|^B)/s abcde\n1234Xyz BarFoo *** Failers abcde\nBar /(.*X|^B)/ms abcde\n1234Xyz BarFoo abcde\nBar /(?s)(.*X|^B)/ abcde\n1234Xyz BarFoo *** Failers abcde\nBar /(?s:.*X|^B)/ abcde\n1234Xyz BarFoo *** Failers abcde\nBar /^.*B/ **** Failers abc\nB /(?s)^.*B/ abc\nB /(?m)^.*B/ abc\nB /(?ms)^.*B/ abc\nB /(?ms)^B/ abc\nB /(?s)B$/ B\n /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 123456654321 /^\d\d\d\d\d\d\d\d\d\d\d\d/ 123456654321 /^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ 123456654321 /^[abc]{12}/ abcabcabcabc /^[a-c]{12}/ abcabcabcabc /^(a|b|c){12}/ abcabcabcabc /^[abcdefghijklmnopqrstuvwxy0123456789]/ n *** Failers z /abcde{0,0}/ abcd *** Failers abce /ab[cd]{0,0}e/ abe *** Failers abcde /ab(c){0,0}d/ abd *** Failers abcd /a(b*)/ a ab abbbb *** Failers bbbbb /ab\d{0}e/ abe *** Failers ab1e /"([^\\"]+|\\.)*"/ the \"quick\" brown fox \"the \\\"quick\\\" brown fox\" /.*?/g,aftertext abc /\b/g,aftertext abc /\b/g,aftertext abc //g abc /<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR> /a[^a]b/ acb a\nb /a.b/ acb *** Failers a\nb /a[^a]b/s acb a\nb /a.b/s acb a\nb /^(b+?|a){1,2}?c/ bac bbac bbbac bbbbac bbbbbac /^(b+|a){1,2}?c/ bac bbac bbbac bbbbac bbbbbac /(?!\A)x/m x\nb\n a\bx\n /\x0{ab}/ \0{ab} /(A|B)*?CD/ CD /(A|B)*CD/ CD /(AB)*?\1/ ABABAB /(AB)*\1/ ABABAB /(?<!bar)foo/ foo catfood arfootle rfoosh *** Failers barfoo towbarfoo /\w{3}(?<!bar)foo/ catfood *** Failers foo barfoo towbarfoo /(?<=(foo)a)bar/ fooabar *** Failers bar foobbar /\Aabc\z/m abc *** Failers abc\n qqq\nabc abc\nzzz qqq\nabc\nzzz "(?>.*/)foo" /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ "(?>.*/)foo" /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo /(?>(\.\d\d[1-9]?))\d+/ 1.230003938 1.875000282 *** Failers 1.235 /^((?>\w+)|(?>\s+))*$/ now is the time for all good men to come to the aid of the party *** Failers this is not a line with only words and spaces! /(\d+)(\w)/ 12345a 12345+ /((?>\d+))(\w)/ 12345a *** Failers 12345+ /(?>a+)b/ aaab /((?>a+)b)/ aaab /(?>(a+))b/ aaab /(?>b)+/ aaabbbccc /(?>a+|b+|c+)*c/ aaabbbbccccd /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x /\(((?>[^()]+)|\([^()]+\))+\)/ (abc) (abc(def)xyz) *** Failers ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa /a(?-i)b/i ab Ab *** Failers aB AB /(a (?x)b c)d e/ a bcd e *** Failers a b cd e abcd e a bcde /(a b(?x)c d (?-x)e f)/ a bcde f *** Failers abcdef /(a(?i)b)c/ abc aBc *** Failers abC aBC Abc ABc ABC AbC /a(?i:b)c/ abc aBc *** Failers ABC abC aBC /a(?i:b)*c/ aBc aBBc *** Failers aBC aBBC /a(?=b(?i)c)\w\wd/ abcd abCd *** Failers aBCd abcD /(?s-i:more.*than).*million/i more than million more than MILLION more \n than Million *** Failers MORE THAN MILLION more \n than \n million /(?:(?s-i)more.*than).*million/i more than million more than MILLION more \n than Million *** Failers MORE THAN MILLION more \n than \n million /(?>a(?i)b+)+c/ abc aBbc aBBc *** Failers Abc abAb abbC /(?=a(?i)b)\w\wc/ abc aBc *** Failers Ab abC aBC /(?<=a(?i)b)(\w\w)c/ abxxc aBxxc *** Failers Abxxc ABxxc abxxC /(?:(a)|b)(?(1)A|B)/ aA bB *** Failers aB bA /^(a)?(?(1)a|b)+$/ aa b bb *** Failers ab # Perl gets this next one wrong if the pattern ends with $; in that case it # fails to match "12". /^(?(?=abc)\w{3}:|\d\d)/ abc: 12 123 *** Failers xyz /^(?(?!abc)\d\d|\w{3}:)$/ abc: 12 *** Failers 123 xyz /(?(?<=foo)bar|cat)/ foobar cat fcat focat *** Failers foocat /(?(?<!foo)cat|bar)/ foobar cat fcat focat *** Failers foocat /( \( )? [^()]+ (?(1) \) |) /x abcd (abcd) the quick (abcd) fox (abcd /( \( )? [^()]+ (?(1) \) ) /x abcd (abcd) the quick (abcd) fox (abcd /^(?(2)a|(1)(2))+$/ 12 12a 12aa *** Failers 1234 /((?i)blah)\s+\1/ blah blah BLAH BLAH Blah Blah blaH blaH *** Failers blah BLAH Blah blah blaH blah /((?i)blah)\s+(?i:\1)/ blah blah BLAH BLAH Blah Blah blaH blaH blah BLAH Blah blah blaH blah /(?>a*)*/ a aa aaaa /(abc|)+/ abc abcabc abcabcabc xyz /([a]*)*/ a aaaaa /([ab]*)*/ a b ababab aaaabcde bbbb /([^a]*)*/ b bbbb aaa /([^ab]*)*/ cccc abab /([a]*?)*/ a aaaa /([ab]*?)*/ a b abab baba /([^a]*?)*/ b bbbb aaa /([^ab]*?)*/ c cccc baba /(?>a*)*/ a aaabcde /((?>a*))*/ aaaaa aabbaa /((?>a*?))*/ aaaaa aabbaa /(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x 12-sep-98 12-09-98 *** Failers sep-12-98 /(?<=(foo))bar\1/ foobarfoo foobarfootling *** Failers foobar barfoo /(?i:saturday|sunday)/ saturday sunday Saturday Sunday SATURDAY SUNDAY SunDay /(a(?i)bc|BB)x/ abcx aBCx bbx BBx *** Failers abcX aBCX bbX BBX /^([ab](?i)[cd]|[ef])/ ac aC bD elephant Europe frog France *** Failers Africa /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ ab aBd xy xY zebra Zambesi *** Failers aCD XY /(?<=foo\n)^bar/m foo\nbar *** Failers bar baz\nbar /(?<=(?<!foo)bar)baz/ barbaz barbarbaz koobarbaz *** Failers baz foobarbaz /The cases of aaaa and aaaaaa are missed out below because Perl does things/ /differently. We know that odd, and maybe incorrect, things happen with/ /recursive references in Perl, as far as 5.11.3 - see some stuff in test #2./ /^(a\1?){4}$/ a aa aaa aaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa aaaaaaaaaaa aaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaaa aaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa /^(a\1?)(a\1?)(a\2?)(a\3?)$/ a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa aaaaaaaaaaa aaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaaa aaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa /The following tests are taken from the Perl 5.005 test suite; some of them/ /are compatible with 5.004, but I'd rather not have to sort them out./ /abc/ abc xabcy ababc *** Failers xbc axc abx /ab*c/ abc /ab*bc/ abc abbc abbbbc /.{1}/ abbbbc /.{3,4}/ abbbbc /ab{0,}bc/ abbbbc /ab+bc/ abbc *** Failers abc abq /ab{1,}bc/ /ab+bc/ abbbbc /ab{1,}bc/ abbbbc /ab{1,3}bc/ abbbbc /ab{3,4}bc/ abbbbc /ab{4,5}bc/ *** Failers abq abbbbc /ab?bc/ abbc abc /ab{0,1}bc/ abc /ab?bc/ /ab?c/ abc /ab{0,1}c/ abc /^abc$/ abc *** Failers abbbbc abcc /^abc/ abcc /^abc$/ /abc$/ aabc *** Failers aabc aabcd /^/ abc /$/ abc /a.c/ abc axc /a.*c/ axyzc /a[bc]d/ abd *** Failers axyzd abc /a[b-d]e/ ace /a[b-d]/ aac /a[-b]/ a- /a[b-]/ a- /a]/ a] /a[]]b/ a]b /a[^bc]d/ aed *** Failers abd abd /a[^-b]c/ adc /a[^]b]c/ adc *** Failers a-c a]c /\ba\b/ a- -a -a- /\by\b/ *** Failers xy yz xyz /\Ba\B/ *** Failers a- -a -a- /\By\b/ xy /\by\B/ yz /\By\B/ xyz /\w/ a /\W/ - *** Failers - a /a\sb/ a b /a\Sb/ a-b *** Failers a-b a b /\d/ 1 /\D/ - *** Failers - 1 /[\w]/ a /[\W]/ - *** Failers - a /a[\s]b/ a b /a[\S]b/ a-b *** Failers a-b a b /[\d]/ 1 /[\D]/ - *** Failers - 1 /ab|cd/ abc abcd /()ef/ def /$b/ /a\(b/ a(b /a\(*b/ ab a((b /a\\b/ a\\b /((a))/ abc /(a)b(c)/ abc /a+b+c/ aabbabc /a{1,}b{1,}c/ aabbabc /a.+?c/ abcabc /(a+|b)*/ ab /(a+|b){0,}/ ab /(a+|b)+/ ab /(a+|b){1,}/ ab /(a+|b)?/ ab /(a+|b){0,1}/ ab /[^ab]*/ cde /abc/ *** Failers b /a*/ /([abc])*d/ abbbcd /([abc])*bcd/ abcd /a|b|c|d|e/ e /(a|b|c|d|e)f/ ef /abcd*efg/ abcdefg /ab*/ xabyabbbz xayabbbz /(ab|cd)e/ abcde /[abhgefdc]ij/ hij /^(ab|cd)e/ /(abc|)ef/ abcdef /(a|b)c*d/ abcd /(ab|ab*)bc/ abc /a([bc]*)c*/ abc /a([bc]*)(c*d)/ abcd /a([bc]+)(c*d)/ abcd /a([bc]*)(c+d)/ abcd /a[bcd]*dcdcde/ adcdcde /a[bcd]+dcdcde/ *** Failers abcde adcdcde /(ab|a)b*c/ abc /((a)(b)c)(d)/ abcd /[a-zA-Z_][a-zA-Z0-9_]*/ alpha /^a(bc+|b[eh])g|.h$/ abh /(bc+d$|ef*g.|h?i(j|k))/ effgz ij reffgz *** Failers effg bcdd /((((((((((a))))))))))/ a /((((((((((a))))))))))\10/ aa /(((((((((a)))))))))/ a /multiple words of text/ *** Failers aa uh-uh /multiple words/ multiple words, yeah /(.*)c(.*)/ abcde /\((.*), (.*)\)/ (a, b) /[k]/ /abcd/ abcd /a(bc)d/ abcd /a[-]?c/ ac /(abc)\1/ abcabc /([a-c]*)\1/ abcabc /(a)|\1/ a *** Failers ab x /(([a-c])b*?\2)*/ ababbbcbc /(([a-c])b*?\2){3}/ ababbbcbc /((\3|b)\2(a)x)+/ aaaxabaxbaaxbbax /((\3|b)\2(a)){2,}/ bbaababbabaaaaabbaaaabba /abc/i ABC XABCY ABABC *** Failers aaxabxbaxbbx XBC AXC ABX /ab*c/i ABC /ab*bc/i ABC ABBC /ab*?bc/i ABBBBC /ab{0,}?bc/i ABBBBC /ab+?bc/i ABBC /ab+bc/i *** Failers ABC ABQ /ab{1,}bc/i /ab+bc/i ABBBBC /ab{1,}?bc/i ABBBBC /ab{1,3}?bc/i ABBBBC /ab{3,4}?bc/i ABBBBC /ab{4,5}?bc/i *** Failers ABQ ABBBBC /ab??bc/i ABBC ABC /ab{0,1}?bc/i ABC /ab??bc/i /ab??c/i ABC /ab{0,1}?c/i ABC /^abc$/i ABC *** Failers ABBBBC ABCC /^abc/i ABCC /^abc$/i /abc$/i AABC /^/i ABC /$/i ABC /a.c/i ABC AXC /a.*?c/i AXYZC /a.*c/i *** Failers AABC AXYZD /a[bc]d/i ABD /a[b-d]e/i ACE *** Failers ABC ABD /a[b-d]/i AAC /a[-b]/i A- /a[b-]/i A- /a]/i A] /a[]]b/i A]B /a[^bc]d/i AED /a[^-b]c/i ADC *** Failers ABD A-C /a[^]b]c/i ADC /ab|cd/i ABC ABCD /()ef/i DEF /$b/i *** Failers A]C B /a\(b/i A(B /a\(*b/i AB A((B /a\\b/i A\\b a\\B /((a))/i ABC /(a)b(c)/i ABC /a+b+c/i AABBABC /a{1,}b{1,}c/i AABBABC /a.+?c/i ABCABC /a.*?c/i ABCABC /a.{0,5}?c/i ABCABC /(a+|b)*/i AB /(a+|b){0,}/i AB /(a+|b)+/i AB /(a+|b){1,}/i AB /(a+|b)?/i AB /(a+|b){0,1}/i AB /(a+|b){0,1}?/i AB /[^ab]*/i CDE /abc/i /a*/i /([abc])*d/i ABBBCD /([abc])*bcd/i ABCD /a|b|c|d|e/i E /(a|b|c|d|e)f/i EF /abcd*efg/i ABCDEFG /ab*/i XABYABBBZ XAYABBBZ /(ab|cd)e/i ABCDE /[abhgefdc]ij/i HIJ /^(ab|cd)e/i ABCDE /(abc|)ef/i ABCDEF /(a|b)c*d/i ABCD /(ab|ab*)bc/i ABC /a([bc]*)c*/i ABC /a([bc]*)(c*d)/i ABCD /a([bc]+)(c*d)/i ABCD /a([bc]*)(c+d)/i ABCD /a[bcd]*dcdcde/i ADCDCDE /a[bcd]+dcdcde/i /(ab|a)b*c/i ABC /((a)(b)c)(d)/i ABCD /[a-zA-Z_][a-zA-Z0-9_]*/i ALPHA /^a(bc+|b[eh])g|.h$/i ABH /(bc+d$|ef*g.|h?i(j|k))/i EFFGZ IJ REFFGZ *** Failers ADCDCDE EFFG BCDD /((((((((((a))))))))))/i A /((((((((((a))))))))))\10/i AA /(((((((((a)))))))))/i A /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i A /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i C /multiple words of text/i *** Failers AA UH-UH /multiple words/i MULTIPLE WORDS, YEAH /(.*)c(.*)/i ABCDE /\((.*), (.*)\)/i (A, B) /[k]/i /abcd/i ABCD /a(bc)d/i ABCD /a[-]?c/i AC /(abc)\1/i ABCABC /([a-c]*)\1/i ABCABC /a(?!b)./ abad /a(?=d)./ abad /a(?=c|d)./ abad /a(?:b|c|d)(.)/ ace /a(?:b|c|d)*(.)/ ace /a(?:b|c|d)+?(.)/ ace acdbcdbe /a(?:b|c|d)+(.)/ acdbcdbe /a(?:b|c|d){2}(.)/ acdbcdbe /a(?:b|c|d){4,5}(.)/ acdbcdbe /a(?:b|c|d){4,5}?(.)/ acdbcdbe /((foo)|(bar))*/ foobar /a(?:b|c|d){6,7}(.)/ acdbcdbe /a(?:b|c|d){6,7}?(.)/ acdbcdbe /a(?:b|c|d){5,6}(.)/ acdbcdbe /a(?:b|c|d){5,6}?(.)/ acdbcdbe /a(?:b|c|d){5,7}(.)/ acdbcdbe /a(?:b|c|d){5,7}?(.)/ acdbcdbe /a(?:b|(c|e){1,2}?|d)+?(.)/ ace /^(.+)?B/ AB /^([^a-z])|(\^)$/ . /^[<>]&/ <&OUT /^(a\1?){4}$/ aaaaaaaaaa *** Failers AB aaaaaaaaa aaaaaaaaaaa /^(a(?(1)\1)){4}$/ aaaaaaaaaa *** Failers aaaaaaaaa aaaaaaaaaaa /(?:(f)(o)(o)|(b)(a)(r))*/ foobar /(?<=a)b/ ab *** Failers cb b /(?<!c)b/ ab b b /(?:..)*a/ aba /(?:..)*?a/ aba /^(?:b|a(?=(.)))*\1/ abc /^(){3,5}/ abc /^(a+)*ax/ aax /^((a|b)+)*ax/ aax /^((a|bc)+)*ax/ aax /(a|x)*ab/ cab /(a)*ab/ cab /(?:(?i)a)b/ ab /((?i)a)b/ ab /(?:(?i)a)b/ Ab /((?i)a)b/ Ab /(?:(?i)a)b/ *** Failers cb aB /((?i)a)b/ /(?i:a)b/ ab /((?i:a))b/ ab /(?i:a)b/ Ab /((?i:a))b/ Ab /(?i:a)b/ *** Failers aB aB /((?i:a))b/ /(?:(?-i)a)b/i ab /((?-i)a)b/i ab /(?:(?-i)a)b/i aB /((?-i)a)b/i aB /(?:(?-i)a)b/i *** Failers aB Ab /((?-i)a)b/i /(?:(?-i)a)b/i aB /((?-i)a)b/i aB /(?:(?-i)a)b/i *** Failers Ab AB /((?-i)a)b/i /(?-i:a)b/i ab /((?-i:a))b/i ab /(?-i:a)b/i aB /((?-i:a))b/i aB /(?-i:a)b/i *** Failers AB Ab /((?-i:a))b/i /(?-i:a)b/i aB /((?-i:a))b/i aB /(?-i:a)b/i *** Failers Ab AB /((?-i:a))b/i /((?-i:a.))b/i *** Failers AB a\nB /((?s-i:a.))b/i a\nB /(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/ cabbbb /(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/ caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb /(ab)\d\1/i Ab4ab ab4Ab /foo\w*\d{4}baz/ foobar1234baz /x(~~)*(?:(?:F)?)?/ x~~ /^a(?#xxx){3}c/ aaac /^a (?#xxx) (?#yyy) {3}c/x aaac /(?<![cd])b/ *** Failers B\nB dbcb /(?<![cd])[ab]/ dbaacb /(?<!(c|d))b/ /(?<!(c|d))[ab]/ dbaacb /(?<!cd)[ab]/ cdaccb /^(?:a?b?)*$/ \ a ab aaa *** Failers dbcb a-- aa-- /((?s)^a(.))((?m)^b$)/ a\nb\nc\n /((?m)^b$)/ a\nb\nc\n /(?m)^b/ a\nb\n /(?m)^(b)/ a\nb\n /((?m)^b)/ a\nb\n /\n((?m)^b)/ a\nb\n /((?s).)c(?!.)/ a\nb\nc\n a\nb\nc\n /((?s)b.)c(?!.)/ a\nb\nc\n a\nb\nc\n /^b/ /()^b/ *** Failers a\nb\nc\n a\nb\nc\n /((?m)^b)/ a\nb\nc\n /(x)?(?(1)a|b)/ *** Failers a a /(x)?(?(1)b|a)/ a /()?(?(1)b|a)/ a /()(?(1)b|a)/ /()?(?(1)a|b)/ a /^(\()?blah(?(1)(\)))$/ (blah) blah *** Failers a blah) (blah /^(\(+)?blah(?(1)(\)))$/ (blah) blah *** Failers blah) (blah /(?(?!a)a|b)/ /(?(?!a)b|a)/ a /(?(?=a)b|a)/ *** Failers a a /(?(?=a)a|b)/ a /(?=(a+?))(\1ab)/ aaab /^(?=(a+?))\1ab/ /(\w+:)+/ one: /$(?<=^(a))/ a /(?=(a+?))(\1ab)/ aaab /^(?=(a+?))\1ab/ *** Failers aaab aaab /([\w:]+::)?(\w+)$/ abcd xy:z:::abcd /^[^bcd]*(c+)/ aexycd /(a*)b+/ caab /([\w:]+::)?(\w+)$/ abcd xy:z:::abcd *** Failers abcd: abcd: /^[^bcd]*(c+)/ aexycd /(>a+)ab/ /(?>a+)b/ aaab /([[:]+)/ a:[b]: /([[=]+)/ a=[b]= /([[.]+)/ a.[b]. /((?>a+)b)/ aaab /(?>(a+))b/ aaab /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x /a\Z/ *** Failers aaab a\nb\n /b\Z/ a\nb\n /b\z/ /b\Z/ a\nb /b\z/ a\nb *** Failers /^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ a abc a-b 0-9 a.b 5.6.7 the.quick.brown.fox a100.b200.300c 12-ab.1245 *** Failers \ .a -a a- a. a_b a.- a.. ab..bc the.quick.brown.fox- the.quick.brown.fox. the.quick.brown.fox_ the.quick.brown.fox+ /(?>.*)(?<=(abcd|wxyz))/ alphabetabcd endingwxyz *** Failers a rather long string that doesn't end with one of them /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword word cat dog elephant mussel cow horse canary baboon snake shark /word (?>[a-zA-Z0-9]+ ){0,30}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope /(?<=\d{3}(?!999))foo/ 999foo 123999foo *** Failers 123abcfoo /(?<=(?!...999)\d{3})foo/ 999foo 123999foo *** Failers 123abcfoo /(?<=\d{3}(?!999)...)foo/ 123abcfoo 123456foo *** Failers 123999foo /(?<=\d{3}...)(?<!999)foo/ 123abcfoo 123456foo *** Failers 123999foo /<a[\s]+href[\s]*=[\s]* # find <a href= ([\"\'])? # find single or double quote (?(1) (.*?)\1 | ([^\s]+)) # if quote found, match up to next matching # quote, otherwise match up to next space /isx <a href=abcd xyz <a href=\"abcd xyz pqr\" cats <a href=\'abcd xyz pqr\' cats /<a\s+href\s*=\s* # find <a href= (["'])? # find single or double quote (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching # quote, otherwise match up to next space /isx <a href=abcd xyz <a href=\"abcd xyz pqr\" cats <a href = \'abcd xyz pqr\' cats /<a\s+href(?>\s*)=(?>\s*) # find <a href= (["'])? # find single or double quote (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching # quote, otherwise match up to next space /isx <a href=abcd xyz <a href=\"abcd xyz pqr\" cats <a href = \'abcd xyz pqr\' cats /((Z)+|A)*/ ZABCDEFG /(Z()|A)*/ ZABCDEFG /(Z(())|A)*/ ZABCDEFG /((?>Z)+|A)*/ ZABCDEFG /((?>)+|A)*/ ZABCDEFG /a*/g abbab /^[\d-a]/ abcde -things 0digit *** Failers bcdef /[[:space:]]+/ > \x09\x0a\x0c\x0d\x0b< /[[:blank:]]+/ > \x09\x0a\x0c\x0d\x0b< /[\s]+/ > \x09\x0a\x0c\x0d\x0b< /\s+/ > \x09\x0a\x0c\x0d\x0b< /ab/x ab /(?!\A)x/m a\nxb\n /(?!^)x/m a\nxb\n /abc\Qabc\Eabc/ abcabcabc /abc\Q(*+|\Eabc/ abc(*+|abc / abc\Q abc\Eabc/x abc abcabc *** Failers abcabcabc /abc#comment \Q#not comment literal\E/x abc#not comment\n literal /abc#comment \Q#not comment literal/x abc#not comment\n literal /abc#comment \Q#not comment literal\E #more comment /x abc#not comment\n literal /abc#comment \Q#not comment literal\E #more comment/x abc#not comment\n literal /\Qabc\$xyz\E/ abc\\\$xyz /\Qabc\E\$\Qxyz\E/ abc\$xyz /\Gabc/ abc *** Failers xyzabc /\Gabc./g abc1abc2xyzabc3 /abc./g abc1abc2xyzabc3 /a(?x: b c )d/ XabcdY *** Failers Xa b c d Y /((?x)x y z | a b c)/ XabcY AxyzB /(?i)AB(?-i)C/ XabCY *** Failers XabcY /((?i)AB(?-i)C|D)E/ abCE DE *** Failers abcE abCe dE De /(.*)\d+\1/ abc123abc abc123bc /(.*)\d+\1/s abc123abc abc123bc /((.*))\d+\1/ abc123abc abc123bc # This tests for an IPv6 address in the form where it can have up to # eight components, one and only one of which is empty. This must be # an internal component. /^(?!:) # colon disallowed at start (?: # start of item (?: [0-9a-f]{1,4} | # 1-4 hex digits or (?(1)0 | () ) ) # if null previously matched, fail; else null : # followed by colon ){1,7} # end item; 1-7 of them required [0-9a-f]{1,4} $ # final hex number at end of string (?(1)|.) # check that there was an empty component /ix a123::a123 a123:b342::abcd a123:b342::324e:abcd a123:ddde:b342::324e:abcd a123:ddde:b342::324e:dcba:abcd a123:ddde:9999:b342::324e:dcba:abcd *** Failers 1:2:3:4:5:6:7:8 a123:bce:ddde:9999:b342::324e:dcba:abcd a123::9999:b342::324e:dcba:abcd abcde:2:3:4:5:6:7:8 ::1 abcd:fee0:123:: :1 1: /[z\Qa-d]\E]/ z a - d ] *** Failers b /(a+)*b/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa /(?i)reg(?:ul(?:[a�]|ae)r|ex)/ REGular regulaer Regex regul�r /����[�-��-�]+/ ����� ����� ����� ����� /(?<=Z)X./ \x84XAZXB /ab cd (?x) de fg/ ab cd defg /ab cd(?x) de fg/ ab cddefg ** Failers abcddefg /(?<![^f]oo)(bar)/ foobarX ** Failers boobarX /(?<![^f])X/ offX ** Failers onyX /(?<=[^f])X/ onyX ** Failers offX /^/gm a\nb\nc\n \ /(?<=C\n)^/gm A\nC\nC\n /(?:(?(1)a|b)(X))+/ bXaX /(?:(?(1)\1a|b)(X|Y))+/ bXXaYYaY bXYaXXaX /()()()()()()()()()(?:(?(10)\10a|b)(X|Y))+/ bXXaYYaY /[[,abc,]+]/ abc] a,b] [a,b,c] /(?-x: )/x A\x20B "(?x)(?-x: \s*#\s*)" A # B ** Failers # "(?x-is)(?:(?-ixs) \s*#\s*) include" A #include ** Failers A#include A #Include /a*b*\w/ aaabbbb aaaa a /a*b?\w/ aaabbbb aaaa a /a*b{0,4}\w/ aaabbbb aaaa a /a*b{0,}\w/ aaabbbb aaaa a /a*\d*\w/ 0a a /a*b *\w/x a /a*b#comment *\w/x a /a* b *\w/x a /^\w+=.*(\\\n.*)*/ abc=xyz\\\npqr /(?=(\w+))\1:/ abcd: /^(?=(\w+))\1:/ abcd: /^\Eabc/ abc /^[\Eabc]/ a ** Failers E /^[a-\Ec]/ b ** Failers - E /^[a\E\E-\Ec]/ b ** Failers - E /^[\E\Qa\E-\Qz\E]+/ b ** Failers - /^[a\Q]bc\E]/ a ] c /^[a-\Q\E]/ a - /^(a()*)*/ aaaa /^(?:a(?:(?:))*)*/ aaaa /^(a()+)+/ aaaa /^(?:a(?:(?:))+)+/ aaaa /(a){0,3}(?(1)b|(c|))*D/ abbD ccccD D /(a|)*\d/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 /(?>a|)*\d/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 /(?:a|)*\d/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 /\Z/g abc\n /^(?s)(?>.*)(?<!\n)/ abc abc\n /^(?![^\n]*\n\z)/ abc abc\n /\z(?<!\n)/ abc abc\n /(.*(.)?)*/ abcd /( (A | (?(1)0|) )* )/x abcd /( ( (?(1)0|) )* )/x abcd /( (?(1)0|)* )/x abcd /[[:abcd:xyz]]/ a] :] /[abc[:x\]pqr]/ a [ : ] p /.*[op][xyz]/ fooabcfoo /(?(?=.*b)b|^)/ adc abc /(?(?=^.*b)b|^)/ adc abc /(?(?=.*b)b|^)*/ adc abc /(?(?=.*b)b|^)+/ adc abc /(?(?=b).*b|^d)/ abc /(?(?=.*b).*b|^d)/ abc /^%((?(?=[a])[^%])|b)*%$/ %ab% /(?i)a(?-i)b|c/ XabX XAbX CcC ** Failers XABX /[\x00-\xff\s]+/ \x0a\x0b\x0c\x0d /(abc)\1/i abc /(abc)\1/ abc /[^a]*/i 12abc 12ABC /[^a]*+/i 12abc 12ABC /[^a]*?X/i ** Failers 12abc 12ABC /[^a]+?X/i ** Failers 12abc 12ABC /[^a]?X/i 12aXbcX 12AXBCX BCX /[^a]??X/i 12aXbcX 12AXBCX BCX /[^a]?+X/i 12aXbcX 12AXBCX BCX /[^a]{2,3}/i abcdef ABCDEF /[^a]{2,3}?/i abcdef ABCDEF /[^a]{2,3}+/i abcdef ABCDEF /((a|)+)+Z/ Z /(a)b|(a)c/ ac /(?>(a))b|(a)c/ ac /(?=(a))ab|(a)c/ ac /((?>(a))b|(a)c)/ ac /((?>(a))b|(a)c)++/ ac /(?:(?>(a))b|(a)c)++/ ac /(?=(?>(a))b|(a)c)(..)/ ac /(?>(?>(a))b|(a)c)/ ac /(?:(?>([ab])))+a=/aftertext =ba= /(?>([ab]))+a=/aftertext =ba= /((?>(a+)b)+(aabab))/ aaaabaaabaabab /(?>a+|ab)+?c/ aabc /(?>a+|ab)+c/ aabc /(?:a+|ab)+c/ aabc /(?(?=(a))a)/ a /(?(?=(a))a)(b)/ ab /^(?:a|ab)++c/ aaaabc /^(?>a|ab)++c/ aaaabc /^(?:a|ab)+c/ aaaabc /(?=abc){3}abc/aftertext abcabcabc ** Failers xyz /(?=abc)+abc/aftertext abcabcabc ** Failers xyz /(?=abc)++abc/aftertext abcabcabc ** Failers xyz /(?=abc){0}xyz/ xyz /(?=abc){1}xyz/ ** Failers xyz /(?=(a))?./ ab bc /(?=(a))??./ ab bc /^(?=(?1))?[az]([abc])d/ abd zcdxx /^(?!a){0}\w+/ aaaaa /(?<=(abc))?xyz/ abcxyz pqrxyz /^[\g<a>]+/ ggg<<<aaa>>> ** Failers \\ga /^[\ga]+/ gggagagaxyz /^[:a[:digit:]]+/ aaaa444:::Z /^[:a[:digit:]:b]+/ aaaa444:::bbbZ /[:a]xxx[b:]/ :xxx: /(?<=a{2})b/i xaabc ** Failers xabc /(?<!a{2})b/i xabc ** Failers xaabc /(?<=a\h)c/ xa c /(?<=[^a]{2})b/ axxbc aAAbc ** Failers xaabc /(?<=[^a]{2})b/i axxbc ** Failers aAAbc xaabc /(?<=a\H)c/ abc /(?<=a\V)c/ abc /(?<=a\v)c/ a\nc /(?(?=c)c|d)++Y/ XcccddYX /(?(?=c)c|d)*+Y/ XcccddYX /^(a{2,3}){2,}+a/ aaaaaaa ** Failers aaaaaa aaaaaaaaa /^(a{2,3})++a/ ** Failers aaaaaa /^(a{2,3})*+a/ ** Failers aaaaaa /ab\Cde/ abXde /(?<=ab\Cde)X/ abZdeX /\H\h\V\v/ X X\x0a X\x09X\x0b ** Failers \xa0 X\x0a /\H*\h+\V?\v{3,4}/ \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a \x09\x20\xa0\x0a\x0b\x0c ** Failers \x09\x20\xa0\x0a\x0b /\H{3,4}/ XY ABCDE XY PQR ST /.\h{3,4}./ XY AB PQRS /\h*X\h?\H+Y\H?Z/ >XNNNYZ > X NYQZ ** Failers >XYZ > X NY Z /\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ >XY\x0aZ\x0aA\x0bNN\x0c >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c /(foo)\Kbar/ foobar /(foo)(\Kbar|baz)/ foobar foobaz /(foo\Kbar)baz/ foobarbaz /abc\K|def\K/g,aftertext Xabcdefghi /ab\Kc|de\Kf/g,aftertext Xabcdefghi /(?=C)/g,aftertext ABCDECBA /^abc\K/aftertext abcdef ** Failers defabcxyz /^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/ ababababbbabZXXXX /(?<A>tom|bon)-\g{A}/ tom-tom bon-bon /(^(a|b\g{-1}))/ bacxxx /(?|(abc)|(xyz))\1/ abcabc xyzxyz ** Failers abcxyz xyzabc /(?|(abc)|(xyz))(?1)/ abcabc xyzabc ** Failers xyzxyz /^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/ XYabcdY /^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/ XYabcdY /^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/ XYabcdY /(?'abc'\w+):\k<abc>{2}/ a:aaxyz ab:ababxyz ** Failers a:axyz ab:abxyz /(?'abc'\w+):\g{abc}{2}/ a:aaxyz ab:ababxyz ** Failers a:axyz ab:abxyz /^(?<ab>a)? (?(<ab>)b|c) (?('ab')d|e)/x abd ce /^(a.)\g-1Z/ aXaXZ /^(a.)\g{-1}Z/ aXaXZ /^(?(DEFINE) (?<A> a) (?<B> b) ) (?&A) (?&B) /x abcd /(?<NAME>(?&NAME_PAT))\s+(?<ADDR>(?&ADDRESS_PAT)) (?(DEFINE) (?<NAME_PAT>[a-z]+) (?<ADDRESS_PAT>\d+) )/x metcalfe 33 /(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/ 1.2.3.4 131.111.10.206 10.0.0.0 ** Failers 10.6 455.3.4.5 /\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/ 1.2.3.4 131.111.10.206 10.0.0.0 ** Failers 10.6 455.3.4.5 /^(\w++|\s++)*$/ now is the time for all good men to come to the aid of the party *** Failers this is not a line with only words and spaces! /(\d++)(\w)/ 12345a *** Failers 12345+ /a++b/ aaab /(a++b)/ aaab /(a++)b/ aaab /([^()]++|\([^()]*\))+/ ((abc(ade)ufh()()x /\(([^()]++|\([^()]+\))+\)/ (abc) (abc(def)xyz) *** Failers ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa /^([^()]|\((?1)*\))*$/ abc a(b)c a(b(c))d *** Failers) a(b(c)d /^>abc>([^()]|\((?1)*\))*<xyz<$/ >abc>123<xyz< >abc>1(2)3<xyz< >abc>(1(2)3)<xyz< /^(?:((.)(?1)\2|)|((.)(?3)\4|.))$/i 1221 Satanoscillatemymetallicsonatas AmanaplanacanalPanama AblewasIereIsawElba *** Failers Thequickbrownfox /^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/ 12 (((2+2)*-3)-7) -12 *** Failers ((2+2)*-3)-7) /^(x(y|(?1){2})z)/ xyz xxyzxyzz *** Failers xxyzz xxyzxyzxyzz /((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/x <> <abcd> <abc <123> hij> <abc <def> hij> <abc<>def> <abc<> *** Failers <abc /^a+(*FAIL)/ aaaaaa /a+b?c+(*FAIL)/ aaabccc /a+b?(*PRUNE)c+(*FAIL)/ aaabccc /a+b?(*COMMIT)c+(*FAIL)/ aaabccc /a+b?(*SKIP)c+(*FAIL)/ aaabcccaaabccc /^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ aaaxxxxxx aaa++++++ bbbxxxxx bbb+++++ cccxxxx ccc++++ dddddddd /^(aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ aaaxxxxxx aaa++++++ bbbxxxxx bbb+++++ cccxxxx ccc++++ dddddddd /a+b?(*THEN)c+(*FAIL)/ aaabccc /(A (A|B(*ACCEPT)|C) D)(E)/x AB ABX AADE ACDE ** Failers AD /^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i 1221 Satan, oscillate my metallic sonatas! A man, a plan, a canal: Panama! Able was I ere I saw Elba. *** Failers The quick brown fox /^((.)(?1)\2|.)$/ a aba aabaa abcdcba pqaabaaqp ablewasiereisawelba rhubarb the quick brown fox /(a)(?<=b(?1))/ baz ** Failers caz /(?<=b(?1))(a)/ zbaaz ** Failers aaa /(?<X>a)(?<=b(?&X))/ baz /^(?|(abc)|(def))\1/ abcabc defdef ** Failers abcdef defabc /^(?|(abc)|(def))(?1)/ abcabc defabc ** Failers defdef abcdef /(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/x,dupnames a\"aaaaa b\"aaaaa ** Failers b\"11111 /(?:(?1)|B)(A(*F)|C)/ ABCD CCD ** Failers CAD /^(?:(?1)|B)(A(*F)|C)/ CCD BCD ** Failers ABCD CAD BAD /(?:(?1)|B)(A(*ACCEPT)XX|C)D/ AAD ACD BAD BCD BAX ** Failers ACX ABC /(?(DEFINE)(A))B(?1)C/ BAC /(?(DEFINE)((A)\2))B(?1)C/ BAAC /(?<pn> \( ( [^()]++ | (?&pn) )* \) )/x (ab(cd)ef) /^(?=a(*SKIP)b|ac)/ ** Failers ac /^(?=a(*PRUNE)b)/ ab ** Failers ac /^(?=a(*ACCEPT)b)/ ac /(?>a\Kb)/ ab /((?>a\Kb))/ ab /(a\Kb)/ ab /^a\Kcz|ac/ ac /(?>a\Kbz|ab)/ ab /^(?&t)(?(DEFINE)(?<t>a\Kb))$/ ab /^([^()]|\((?1)*\))*$/ a(b)c a(b(c)d)e /(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/ 0 00 0000 /(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/ 0 00 0000 # This one does fail, as expected, in Perl. It needs the complex item at the # end of the pattern. A single letter instead of (B|D) makes it not fail, which # I think is a Perl bug. /A(*COMMIT)(B|D)/ ACABX # Check the use of names for failure /^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark ** Failers AC CB /(*MARK:A)(*SKIP:B)(C|X)/mark C D /^(A(*THEN:A)B|C(*THEN:B)D)/mark ** Failers CB /^(?:A(*THEN:A)B|C(*THEN:B)D)/mark CB /^(?>A(*THEN:A)B|C(*THEN:B)D)/mark CB # This should succeed, as the skip causes bump to offset 1 (the mark). Note # that we have to have something complicated such as (B|Z) at the end because, # for Perl, a simple character somehow causes an unwanted optimization to mess # with the handling of backtracking verbs. /A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/x,mark AAAC # Test skipping over a non-matching mark. /A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/x,mark AAAC # Check shorthand for MARK. /A(*:A)A+(*SKIP:A)(B|Z) | AC/x,mark AAAC /(*:A)A+(*SKIP:A)(B|Z)/mark AAAC # This should succeed, as a non-existent skip name disables the skip. /A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark AAAC /A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/x,mark AAAC # COMMIT at the start of a pattern should act like an anchor. Again, however, # we need the complication for Perl. /(*COMMIT)(A|P)(B|P)(C|P)/ ABCDEFG ** Failers DEFGABC # COMMIT inside an atomic group can't stop backtracking over the group. /(\w+)(?>b(*COMMIT))\w{2}/ abbb /(\w+)b(*COMMIT)\w{2}/ abbb # Check opening parens in comment when seeking forward reference. /(?&t)(?#()(?(DEFINE)(?<t>a))/ bac # COMMIT should override THEN. /(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/ yes /(?>(*COMMIT)(yes|no)(*THEN)(*F))?/ yes /b?(*SKIP)c/ bc abc /(*SKIP)bc/ a /(*SKIP)b/ a /(?P<abn>(?P=abn)xxx|)+/ xxx /(?i:([^b]))(?1)/ aa aA ** Failers ab aB Ba ba /^(?&t)*+(?(DEFINE)(?<t>a))\w$/ aaaaaaX ** Failers aaaaaa /^(?&t)*(?(DEFINE)(?<t>a))\w$/ aaaaaaX aaaaaa /^(a)*+(\w)/ aaaaX YZ ** Failers aaaa /^(?:a)*+(\w)/ aaaaX YZ ** Failers aaaa /^(a)++(\w)/ aaaaX ** Failers aaaa YZ /^(?:a)++(\w)/ aaaaX ** Failers aaaa YZ /^(a)?+(\w)/ aaaaX YZ /^(?:a)?+(\w)/ aaaaX YZ /^(a){2,}+(\w)/ aaaaX ** Failers aaa YZ /^(?:a){2,}+(\w)/ aaaaX ** Failers aaa YZ /(a|)*(?1)b/ b ab aab /(a)++(?1)b/ ** Failers ab aab /(a)*+(?1)b/ ** Failers ab aab /(?1)(?:(b)){0}/ b /(foo ( \( ((?:(?> [^()]+ )|(?2))*) \) ) )/x foo(bar(baz)+baz(bop)) /(A (A|B(*ACCEPT)|C) D)(E)/x AB /\A.*?(a|bc)/ ba /\A.*?(?:a|bc)++/ ba /\A.*?(a|bc)++/ ba /\A.*?(?:a|bc|d)/ ba /(?:(b))++/ beetle /(?(?=(a(*ACCEPT)z))a)/ a /^(a)(?1)+ab/ aaaab /^(a)(?1)++ab/ aaaab /^(?=a(*:M))aZ/mark aZbc /^(?!(*:M)b)aZ/mark aZbc /(?(DEFINE)(a))?b(?1)/ backgammon /^\N+/ abc\ndef /^\N{1,}/ abc\ndef /(?(R)a+|(?R)b)/ aaaabcde /(?(R)a+|((?R))b)/ aaaabcde /((?(R)a+|(?1)b))/ aaaabcde /((?(R1)a+|(?1)b))/ aaaabcde /((?(R)a|(?1)))*/ aaa /((?(R)a|(?1)))+/ aaa /a(*:any name)/mark abc /(?>(?&t)c|(?&t))(?(DEFINE)(?<t>a|b(*PRUNE)c))/ a ba bba # Checking revised (*THEN) handling. # Capture /^.*? (a(*THEN)b) c/x aabc /^.*? (a(*THEN)b|(*F)) c/x aabc /^.*? ( (a(*THEN)b) | (*F) ) c/x aabc /^.*? ( (a(*THEN)b) ) c/x aabc # Non-capture /^.*? (?:a(*THEN)b) c/x aabc /^.*? (?:a(*THEN)b|(*F)) c/x aabc /^.*? (?: (?:a(*THEN)b) | (*F) ) c/x aabc /^.*? (?: (?:a(*THEN)b) ) c/x aabc # Atomic /^.*? (?>a(*THEN)b) c/x aabc /^.*? (?>a(*THEN)b|(*F)) c/x aabc /^.*? (?> (?>a(*THEN)b) | (*F) ) c/x aabc /^.*? (?> (?>a(*THEN)b) ) c/x aabc # Possessive capture /^.*? (a(*THEN)b)++ c/x aabc /^.*? (a(*THEN)b|(*F))++ c/x aabc /^.*? ( (a(*THEN)b)++ | (*F) )++ c/x aabc /^.*? ( (a(*THEN)b)++ )++ c/x aabc # Possessive non-capture /^.*? (?:a(*THEN)b)++ c/x aabc /^.*? (?:a(*THEN)b|(*F))++ c/x aabc /^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x aabc /^.*? (?: (?:a(*THEN)b)++ )++ c/x aabc # Condition assertion /^(?(?=a(*THEN)b)ab|ac)/ ac # Condition /^.*?(?(?=a)a|b(*THEN)c)/ ba /^.*?(?:(?(?=a)a|b(*THEN)c)|d)/ ba /^.*?(?(?=a)a(*THEN)b|c)/ ac # Assertion /^.*(?=a(*THEN)b)/ aabc # -------------------------- /(?>a(*:m))/imsx,mark a /(?>(a)(*:m))/imsx,mark a /(?<=a(*ACCEPT)b)c/ xacd /(?<=(a(*ACCEPT)b))c/ xacd /(?<=(a(*COMMIT)b))c/ xabcd ** Failers xacd /(?<!a(*FAIL)b)c/ xcd acd /(?<=a(*:N)b)c/mark xabcd /(?<=a(*PRUNE)b)c/ xabcd /(?<=a(*SKIP)b)c/ xabcd /(?<=a(*THEN)b)c/ xabcd /(a)(?2){2}(.)/ abcd /(*MARK:A)(*PRUNE:B)(C|X)/mark C D /(*MARK:A)(*PRUNE:B)(C|X)/mark C D /(*MARK:A)(*THEN:B)(C|X)/mark C D /(*MARK:A)(*THEN:B)(C|X)/mark,no_start_optimize C D /(*MARK:A)(*THEN:B)(C|X)/mark C D # This should fail, as the skip causes a bump to offset 3 (the skip). /A(*MARK:A)A+(*SKIP)(B|Z) | AC/x,mark AAAC # Same /A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/x,mark AAAC /A(*:A)A+(*SKIP)(B|Z) | AC/x,mark AAAC # This should fail, as a null name is the same as no name. /A(*MARK:A)A+(*SKIP:)(B|Z) | AC/x,mark AAAC # A check on what happens after hitting a mark and them bumping along to # something that does not even start. Perl reports tags after the failures # here, though it does not when the individual letters are made into something # more complicated. /A(*:A)B|XX(*:B)Y/mark AABC XXYZ ** Failers XAQQ XAQQXZZ AXQQQ AXXQQQ /^(A(*THEN:A)B|C(*THEN:B)D)/mark AB CD ** Failers AC CB /^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark AB CD ** Failers AC CB # An empty name does not pass back an empty string. It is the same as if no # name were given. /^(A(*PRUNE:)B|C(*PRUNE:B)D)/mark AB CD # PRUNE goes to next bumpalong; COMMIT does not. /A(*PRUNE:A)B/mark ACAB # Mark names can be duplicated. /A(*:A)B|X(*:A)Y/mark AABC XXYZ /b(*:m)f|a(*:n)w/mark aw ** Failers abc /b(*:m)f|aw/mark abaw ** Failers abc abax /A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/x,mark AAAC /a(*PRUNE:X)bc|qq/mark,no_start_optimize ** Failers axy /a(*THEN:X)bc|qq/mark,no_start_optimize ** Failers axy /(?=a(*MARK:A)b)..x/mark abxy ** Failers abpq /(?=a(*MARK:A)b)..(*:Y)x/mark abxy ** Failers abpq /(?=a(*PRUNE:A)b)..x/mark abxy ** Failers abpq /(?=a(*PRUNE:A)b)..(*:Y)x/mark abxy ** Failers abpq /(?=a(*THEN:A)b)..x/mark abxy ** Failers abpq /(?=a(*THEN:A)b)..(*:Y)x/mark abxy ** Failers abpq /(another)?(\1?)test/ hello world test /(another)?(\1+)test/ hello world test /(a(*COMMIT)b){0}a(?1)|aac/ aac /((?:a?)*)*c/ aac /((?>a?)*)*c/ aac /(?>.*?a)(?<=ba)/ aba /(?:.*?a)(?<=ba)/ aba /.*?a(*PRUNE)b/ aab /.*?a(*PRUNE)b/s aab /^a(*PRUNE)b/s aab /.*?a(*SKIP)b/ aab /(?>.*?a)b/s aab /(?>.*?a)b/ aab /(?>^a)b/s aab /(?>.*?)(?<=(abcd)|(wxyz))/ alphabetabcd endingwxyz /(?>.*)(?<=(abcd)|(wxyz))/ alphabetabcd endingwxyz "(?>.*)foo" abcdfooxyz "(?>.*?)foo" abcdfooxyz /(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/ ac /(?:(a(*SKIP)b)){0}(?:(?1)|ac)/ ac /(?<=(*SKIP)ac)a/ aa /A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark AAAC /a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/mark acacd /A(*SKIP:m)x|A(*SKIP:n)x|AB/mark AB /((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/mark acacd # Tests that try to figure out how Perl works. My hypothesis is that the first # verb that is backtracked onto is the one that acts. This seems to be the case # almost all the time, but there is one exception that is perhaps a bug. # This matches "aaaac"; each PRUNE advances one character until the subject no # longer starts with 5 'a's. /aaaaa(*PRUNE)b|a+c/ aaaaaac # Putting SKIP in front of PRUNE makes no difference, as it is never # backtracked onto, whether or not it has a label. /aaaaa(*SKIP)(*PRUNE)b|a+c/ aaaaaac /aaaaa(*SKIP:N)(*PRUNE)b|a+c/ aaaaaac /aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/ aaaaaac # Putting THEN in front makes no difference. /aaaaa(*THEN)(*PRUNE)b|a+c/ aaaaaac # However, putting COMMIT in front of the prune changes it to "no match". I # think this is inconsistent and possibly a bug. For the moment, running this # test is moved out of the Perl-compatible file. /aaaaa(*COMMIT)(*PRUNE)b|a+c/ # OK, lets play the same game again using SKIP instead of PRUNE. # This matches "ac" because SKIP forces the next match to start on the # sixth "a". /aaaaa(*SKIP)b|a+c/ aaaaaac # Putting PRUNE in front makes no difference. /aaaaa(*PRUNE)(*SKIP)b|a+c/ aaaaaac # Putting THEN in front makes no difference. /aaaaa(*THEN)(*SKIP)b|a+c/ aaaaaac # In this case, neither does COMMIT. This still matches "ac". /aaaaa(*COMMIT)(*SKIP)b|a+c/ aaaaaac # This gives "no match", as expected. /aaaaa(*COMMIT)b|a+c/ aaaaaac # ---- Tests using THEN ---- # This matches "aaaaaac", as expected. /aaaaa(*THEN)b|a+c/ aaaaaac # Putting SKIP in front makes no difference. /aaaaa(*SKIP)(*THEN)b|a+c/ aaaaaac # Putting PRUNE in front makes no difference. /aaaaa(*PRUNE)(*THEN)b|a+c/ aaaaaac # Putting COMMIT in front makes no difference. /aaaaa(*COMMIT)(*THEN)b|a+c/ aaaaaac # End of "priority" tests /aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/ aaaaaa /aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ aaaaaa /aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/ aaaaaa /aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ aaaaaa /a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/ aaaac /a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/ aaaac /aaa(*PRUNE:A)a(*SKIP:A)b|a+c/ aaaac /aaa(*MARK:A)a(*SKIP:A)b|a+c/ aaaac /a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/mark aaaaaac /.?(a|b(*THEN)c)/ ba /(a(*COMMIT)b)c|abd/ abc abd /(?=a(*COMMIT)b)abc|abd/ abc abd /(?>a(*COMMIT)b)c|abd/ abc abd /a(?=b(*COMMIT)c)[^d]|abd/ abd abc /a(?=bc).|abd/ abd abc /a(?>b(*COMMIT)c)d|abd/ abceabd /a(?>bc)d|abd/ abceabd /(?>a(*COMMIT)b)c|abd/ abd /(?>a(*COMMIT)c)d|abd/ abd /((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/ ac # These tests were formerly in test 2, but changes in PCRE and Perl have # made them compatible. /^(a)?(?(1)a|b)+$/ *** Failers a /(?=a\Kb)ab/ ab /(?!a\Kb)ac/ ac /^abc(?<=b\Kc)d/ abcd /^abc(?<!b\Kq)d/ abcd /A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/x,mark AAAC /^((abc|abcx)(*THEN)y|abcd)/ abcd *** Failers abcxy /^((yes|no)(*THEN)(*F))?/ yes /(A (.*) C? (*THEN) | A D) (*FAIL)/x AbcdCBefgBhiBqz /(A (.*) C? (*THEN) | A D) z/x AbcdCBefgBhiBqz /(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x AbcdCBefgBhiBqz /(A (.*) C? (*THEN) | A D) \s* z/x AbcdCBefgBhiBqz /(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x AbcdCBefgBhiBqz /(A (.*) (?:C|) (*THEN) | A D) z/x AbcdCBefgBhiBqz /(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x AbcdCBefgBhiBqz /(A (.*) C{0,6} (*THEN) | A D) z/x AbcdCBefgBhiBqz /(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x AbcdCEBefgBhiBqz /(A (.*) (CE){0,6} (*THEN) | A D) z/x AbcdCEBefgBhiBqz /(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x AbcdCBefgBhiBqz /(A (.*) (CE*){0,6} (*THEN) | A D) z/x AbcdCBefgBhiBqz /(?=a(*COMMIT)b|ac)ac|ac/ ac /(?=a(*COMMIT)b|(ac)) ac | (a)c/x ac # ---- /(?(?!b(*THEN)a)bn|bnn)/ bnn /(?!b(*SKIP)a)bn|bnn/ bnn /(?(?!b(*SKIP)a)bn|bnn)/ bnn /(?!b(*PRUNE)a)bn|bnn/ bnn /(?(?!b(*PRUNE)a)bn|bnn)/ bnn /(?!b(*COMMIT)a)bn|bnn/ bnn /(?(?!b(*COMMIT)a)bn|bnn)/ bnn /(?=b(*SKIP)a)bn|bnn/ bnn /(?=b(*THEN)a)bn|bnn/ bnn /^(?!a(*SKIP)b)/ ac /^(?!a(*SKIP)b)../ acd /(?!a(*SKIP)b)../ acd /^(?(?!a(*SKIP)b))/ ac /^(?!a(*PRUNE)b)../ acd /(?!a(*PRUNE)b)../ acd /(?!a(*COMMIT)b)ac|cd/ ac /\A.*?(?:a|bc)/ ba /^(A(*THEN)B|C(*THEN)D)/ CD /(*:m(m)(?&y)(?(DEFINE)(?<y>b))/mark abc /(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/mark abc /(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/mark abc /(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/mark abc /^\d*\w{4}/ 1234 123 /^[^b]*\w{4}/ aaaa aaa /^[^b]*\w{4}/i aaaa aaa /^a*\w{4}/ aaaa aaa /^a*\w{4}/i aaaa aaa /(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames foofoo barbar /(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames AfooA AbarA ** Failers Afoofoo Abarbar /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ 1 IN SOA non-sp1 non-sp2( /^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/x,dupnames Ax BAxy /^A\xZ/ A\0Z /^A\o{123}B/ A\123B / ^ a + + b $ /x aaaab / ^ a + #comment + b $ /x aaaab / ^ a + #comment #comment + b $ /x aaaab / ^ (?> a + ) b $ /x aaaab / ^ ( a + ) + + \w $ /x aaaab /(?:a\Kb)*+/aftertext ababc /(?>a\Kb)*/aftertext ababc /(?:a\Kb)*/aftertext ababc /(a\Kb)*+/aftertext ababc /(a\Kb)*/aftertext ababc /(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/ acb '\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++' NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED '\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++' NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED '\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++' NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED '\A([^\"1]++|[\"2]([^\"3]*+|[\"4][\"5])*+[\"6])++' NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED /^\w+(?>\s*)(?<=\w)/ test test /(?P<same>a)(?P<same>b)/g,dupnames abbaba /(?P<same>a)(?P<same>b)(?P=same)/g,dupnames abbaba /(?P=same)?(?P<same>a)(?P<same>b)/g,dupnames abbaba /(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/g,dupnames bbbaaabaabb /(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/g,dupnames bbbaaaccccaaabbbcc /(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/ acl bdl adl bcl /\sabc/ \x{0b}abc /[\Qa]\E]+/ aa]] /[\Q]a\E]+/ aa]] /A((((((((a))))))))\8B/ AaaB /A(((((((((a)))))))))\9B/ AaaB /A[\8\9]B/ A8B A9B /(|ab)*?d/ abd xyd /(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/ 1234abcd /(\2|a)(\1)/ aaa /(\2)(\1)/ "Z*(|d*){216}" "(?1)(?#?'){8}(a)" baaaaaaaaac /((((((((((((x))))))))))))\12/ xx /A[\8]B[\9]C/ A8B9C /(?1)()((((((\1++))\x85)+)|))/ \x85\x85 "(?|(\k'Pm')|(?'Pm'))" abcd # End of testinput1