# 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 #newline_default lf any anycrlf #perltest /the quick brown fox/ the quick brown fox 0: the quick brown fox What do you know about the quick brown fox? 0: the quick brown fox \= Expect no match The quick brown FOX No match What do you know about THE QUICK BROWN FOX? No match /The quick brown fox/i the quick brown fox 0: the quick brown fox The quick brown FOX 0: The quick brown FOX What do you know about the quick brown fox? 0: the quick brown fox What do you know about THE QUICK BROWN FOX? 0: THE QUICK BROWN FOX /abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz 0: aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz 0: aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz 0: aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz 0: aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz 0: aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz 0: aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz 0: abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz 0: aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz 0: aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz 0: aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz 0: abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz 0: aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz 0: aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz 0: aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz \= Expect no match abxyzpqrrabbxyyyypqAzz No match abxyzpqrrrrabbxyyyypqAzz No match abxyzpqrrrabxyyyypqAzz No match aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz No match aaaabcxyzzzzpqrrrabbbxyyypqAzz No match aaabcxyzpqrrrabbxyyyypqqqqqqqAzz No match /^(abc){1,2}zz/ abczz 0: abczz 1: abc abcabczz 0: abcabczz 1: abc \= Expect no match zz No match abcabcabczz No match >>abczz No match /^(b+?|a){1,2}?c/ bc 0: bc 1: b bbc 0: bbc 1: b bbbc 0: bbbc 1: bb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a \= Expect no match aaac No match abbbbbbbbbbbac No match /^(b+|a){1,2}c/ bc 0: bc 1: b bbc 0: bbc 1: bb bbbc 0: bbbc 1: bbb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a \= Expect no match aaac No match abbbbbbbbbbbac No match /^(b+|a){1,2}?bc/ bbc 0: bbc 1: b /^(b*|ba){1,2}?bc/ babc 0: babc 1: ba bbabc 0: bbabc 1: ba bababc 0: bababc 1: ba \= Expect no match bababbc No match babababc No match /^(ba|b*){1,2}?bc/ babc 0: babc 1: ba bbabc 0: bbabc 1: ba bababc 0: bababc 1: ba \= Expect no match bababbc No match babababc No match #/^\ca\cA\c[;\c:/ # \x01\x01\e;z # 0: \x01\x01\x1b;z /^[ab\]cde]/ athing 0: a bthing 0: b ]thing 0: ] cthing 0: c dthing 0: d ething 0: e \= Expect no match fthing No match [thing No match \\thing No match /^[]cde]/ ]thing 0: ] cthing 0: c dthing 0: d ething 0: e \= Expect no match athing No match fthing No match /^[^ab\]cde]/ fthing 0: f [thing 0: [ \\thing 0: \ \= Expect no match athing No match bthing No match ]thing No match cthing No match dthing No match ething No match /^[^]cde]/ athing 0: a fthing 0: f \= Expect no match ]thing No match cthing No match dthing No match ething No match # DLC - I don't get this one #/^\/ # # 0: \x81 #updated to handle 16-bits utf8 /^ÿ/ ÿ 0: \xc3\xbf /^[0-9]+$/ 0 0: 0 1 0: 1 2 0: 2 3 0: 3 4 0: 4 5 0: 5 6 0: 6 7 0: 7 8 0: 8 9 0: 9 10 0: 10 100 0: 100 \= Expect no match abc No match /^.*nter/ enter 0: enter inter 0: inter uponter 0: uponter /^xxx[0-9]+$/ xxx0 0: xxx0 xxx1234 0: xxx1234 \= Expect no match xxx No match /^.+[0-9][0-9][0-9]$/ x123 0: x123 x1234 0: x1234 xx123 0: xx123 123456 0: 123456 \= Expect no match 123 No match /^.+?[0-9][0-9][0-9]$/ x123 0: x123 x1234 0: x1234 xx123 0: xx123 123456 0: 123456 \= Expect no match 123 No match /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ abc!pqr=apquxz.ixr.zzz.ac.uk 0: abc!pqr=apquxz.ixr.zzz.ac.uk 1: abc 2: pqr \= Expect no match !pqr=apquxz.ixr.zzz.ac.uk No match abc!=apquxz.ixr.zzz.ac.uk No match abc!pqr=apquxz:ixr.zzz.ac.uk No match abc!pqr=apquxz.ixr.zzz.ac.ukk No match /:/ Well, we need a colon: somewhere 0: : \= Expect no match Fail without a colon No match /([\da-f:]+)$/i 0abc 0: 0abc 1: 0abc abc 0: abc 1: abc fed 0: fed 1: fed E 0: E 1: E :: 0: :: 1: :: 5f03:12C0::932e 0: 5f03:12C0::932e 1: 5f03:12C0::932e fed def 0: def 1: def Any old stuff 0: ff 1: ff \= Expect no match 0zzz No match gzzz No match fed\x20 No match Any old rubbish No match /^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ .1.2.3 0: .1.2.3 1: 1 2: 2 3: 3 A.12.123.0 0: A.12.123.0 1: 12 2: 123 3: 0 \= Expect no match .1.2.3333 No match 1.2.3 No match 1234.2.3 No match /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ 1 IN SOA non-sp1 non-sp2( 0: 1 IN SOA non-sp1 non-sp2( 1: 1 2: non-sp1 3: non-sp2 1 IN SOA non-sp1 non-sp2 ( 0: 1 IN SOA non-sp1 non-sp2 ( 1: 1 2: non-sp1 3: non-sp2 \= Expect no match 1IN SOA non-sp1 non-sp2( No match /^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ a. 0: a. Z. 0: Z. 2. 0: 2. ab-c.pq-r. 0: ab-c.pq-r. 1: .pq-r sxk.zzz.ac.uk. 0: sxk.zzz.ac.uk. 1: .uk x-.y-. 0: x-.y-. 1: .y- \= Expect no match -abc.peq. No match /^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ *.a 0: *.a *.b0-a 0: *.b0-a 1: 0-a *.c3-b.c 0: *.c3-b.c 1: 3-b 2: .c *.c-a.b-c 0: *.c-a.b-c 1: -a 2: .b-c 3: -c \= Expect no match *.0 No match *.a- No match *.a-b.c- No match *.c-a.0-c No match /^(?=ab(de))(abd)(e)/ abde 0: abde 1: de 2: abd 3: e /^(?!(ab)de|x)(abd)(f)/ abdf 0: abdf 1: <unset> 2: abd 3: f /^(?=(ab(cd)))(ab)/ abcd 0: ab 1: abcd 2: cd 3: ab /^[\da-f](\.[\da-f])*$/i a.b.c.d 0: a.b.c.d 1: .d A.B.C.D 0: A.B.C.D 1: .D a.b.c.1.2.3.C 0: a.b.c.1.2.3.C 1: .C /^\".*\"\s*(;.*)?$/ \"1234\" 0: "1234" \"abcd\" ; 0: "abcd" ; 1: ; \"\" ; rhubarb 0: "" ; rhubarb 1: ; rhubarb \= Expect no match \"1234\" : things No match /^$/ \ 0: \= Expect no match A non-empty line No match / ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x ab c 0: ab c \= Expect no match abc No match ab cde No match /(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ ab c 0: ab c \= Expect no match abc No match ab cde No match /^ a\ b[c ]d $/x a bcd 0: a bcd a b d 0: a b d \= Expect no match abcd No match ab d No match /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ abcdefhijklm 0: abcdefhijklm 1: abc 2: bc 3: c 4: def 5: ef 6: f 7: hij 8: ij 9: j 10: klm 11: lm 12: m /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ abcdefhijklm 0: abcdefhijklm 1: bc 2: c 3: ef 4: f 5: ij 6: j 7: lm 8: m #/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ # a+ Z0+\x08\n\x1d\x12 # 0: a+ Z0+\x08\x0a\x1d\x12 /^[.^$|()*+?{,}]+/ .^\$(*+)|{?,?} 0: .^$(*+)|{?,?} /^a*\w/ z 0: z az 0: az aaaz 0: aaaz a 0: a aa 0: aa aaaa 0: aaaa a+ 0: a aa+ 0: aa /^a*?\w/ z 0: z az 0: a aaaz 0: a a 0: a aa 0: a aaaa 0: a a+ 0: a aa+ 0: a /^a+\w/ az 0: az aaaz 0: aaaz aa 0: aa aaaa 0: aaaa aa+ 0: aa /^a+?\w/ az 0: az aaaz 0: aa aa 0: aa aaaa 0: aa aa+ 0: aa /^\d{8}\w{2,}/ 1234567890 0: 1234567890 12345678ab 0: 12345678ab 12345678__ 0: 12345678__ \= Expect no match 1234567 No match /^[aeiou\d]{4,5}$/ uoie 0: uoie 1234 0: 1234 12345 0: 12345 aaaaa 0: aaaaa \= Expect no match 123456 No match /^[aeiou\d]{4,5}?/ uoie 0: uoie 1234 0: 1234 12345 0: 1234 aaaaa 0: aaaa 123456 0: 1234 /\A(abc|def)=(\1){2,3}\Z/ abc=abcabc 0: abc=abcabc 1: abc 2: abc def=defdefdef 0: def=defdefdef 1: def 2: def \= Expect no match abc=defdef No match /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ abcdefghijkcda2 0: abcdefghijkcda2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: cd abcdefghijkkkkcda2 0: abcdefghijkkkkcda2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: cd /(cat(a(ract|tonic)|erpillar)) \1()2(3)/ cataract cataract23 0: cataract cataract23 1: cataract 2: aract 3: ract 4: 5: 3 catatonic catatonic23 0: catatonic catatonic23 1: catatonic 2: atonic 3: tonic 4: 5: 3 caterpillar caterpillar23 0: caterpillar caterpillar23 1: caterpillar 2: erpillar 3: <unset> 4: 5: 3 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: abcd /^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: Sep From abcd Mon Sep 1 12:33:02 1997 0: From abcd Mon Sep 1 12:33 1: Sep \= Expect no match From abcd Sep 01 12:33:02 1997 No match /^12.34/s 12\n34 0: 12\x0a34 12\r34 0: 12\x0d34 /\w+(?=\t)/ the quick brown\t fox 0: brown /foo(?!bar)(.*)/ foobar is foolish see? 0: foolish see? 1: lish see? /(?:(?!foo)...|^.{0,2})bar(.*)/ foobar crowbar etc 0: rowbar etc 1: etc barrel 0: barrel 1: rel 2barrel 0: 2barrel 1: rel A barrel 0: A barrel 1: rel /^(\D*)(?=\d)(?!123)/ abc456 0: abc 1: abc \= Expect no match abc123 No match /^1234(?# test newlines inside)/ 1234 0: 1234 /^1234 #comment in extended re /x 1234 0: 1234 /#rhubarb abcd/x abcd 0: abcd /^abcd#rhubarb/x abcd 0: abcd /^(a)\1{2,3}(.)/ aaab 0: aaab 1: a 2: b aaaab 0: aaaab 1: a 2: b aaaaab 0: aaaaa 1: a 2: a aaaaaab 0: aaaaa 1: a 2: a /(?!^)abc/ the abc 0: abc \= Expect no match abc No match /(?=^)abc/ abc 0: abc \= Expect no match the abc No match /^[ab]{1,3}(ab*|b)/ aabbbbb 0: aabb 1: b /^[ab]{1,3}?(ab*|b)/ aabbbbb 0: aabbbbb 1: abbbbb /^[ab]{1,3}?(ab*?|b)/ aabbbbb 0: aa 1: a /^[ab]{1,3}(ab*?|b)/ aabbbbb 0: aabb 1: b / (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional leading comment (?: (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # one word, optionally followed by.... (?: [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) | # comments, or... " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote # quoted strings )* < (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # leading < (?: @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* , (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* )* # further okay, if led by comma : # closing colon (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address spec (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* > # trailing > # name and address ) (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional trailing comment /x Alan Other <user\@dom.ain> 0: Alan Other <user@dom.ain> <user\@dom.ain> 0: user@dom.ain user\@dom.ain 0: user@dom.ain \"A. Other\" <user.1234\@dom.ain> (a comment) 0: "A. Other" <user.1234@dom.ain> (a comment) A. Other <user.1234\@dom.ain> (a comment) 0: Other <user.1234@dom.ain> (a comment) \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay A missing angle <user\@some.where 0: user@some.where \= Expect no match The quick brown fox No match /[\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional leading comment (?: (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) # leading word [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces (?: (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) | " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " ) # "special" comment or quoted string [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" )* < [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # < (?: @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* (?: , [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* )* # additional domains : [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address spec > # > # name and address ) /x Alan Other <user\@dom.ain> 0: Alan Other <user@dom.ain> <user\@dom.ain> 0: user@dom.ain user\@dom.ain 0: user@dom.ain \"A. Other\" <user.1234\@dom.ain> (a comment) 0: "A. Other" <user.1234@dom.ain> A. Other <user.1234\@dom.ain> (a comment) 0: Other <user.1234@dom.ain> \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay A missing angle <user\@some.where 0: user@some.where \= Expect no match The quick brown fox No match /abc\0def\00pqr\000xyz\0000AB/ abc\0def\00pqr\000xyz\0000AB 0: abc\x00def\x00pqr\x00xyz\x000AB abc456 abc\0def\00pqr\000xyz\0000ABCDE 0: abc\x00def\x00pqr\x00xyz\x000AB /abc\x0def\x00pqr\x000xyz\x0000AB/ abc\x0def\x00pqr\x000xyz\x0000AB 0: abc\x0def\x00pqr\x000xyz\x0000AB abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE 0: abc\x0def\x00pqr\x000xyz\x0000AB /^[\000-\037]/ \0A 0: \x00 \01B 0: \x01 \037C 0: \x1f #.NET doesn't do octal with 1 number /^(cow|)\1(bell)/ cowcowbell 0: cowcowbell 1: cow 2: bell bell 0: bell 1: 2: bell \= Expect no match cowbell No match /^\s/ \040abc 0: \x0cabc 0: \x0c \nabc 0: \x0a \rabc 0: \x0d \tabc 0: \x09 \= Expect no match abc No match /^a b c/x abc 0: abc /^(a|)\1*b/ ab 0: ab 1: a aaaab 0: aaaab 1: a b 0: b 1: \= Expect no match acb No match /^(a|)\1+b/ aab 0: aab 1: a aaaab 0: aaaab 1: a b 0: b 1: \= Expect no match ab No match /^(a|)\1?b/ ab 0: ab 1: a aab 0: aab 1: a b 0: b 1: \= Expect no match acb No match /^(a|)\1{2}b/ aaab 0: aaab 1: a b 0: b 1: \= Expect no match ab No match aab No match aaaab No match /^(a|)\1{2,3}b/ aaab 0: aaab 1: a aaaab 0: aaaab 1: a b 0: b 1: \= Expect no match ab No match aab No match aaaaab No match /ab{1,3}bc/ abbbbc 0: abbbbc abbbc 0: abbbc abbc 0: abbc \= Expect no match abc No match abbbbbc No match /([^.]*)\.([^:]*):[T ]+(.*)/ track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /([^.]*)\.([^:]*):[T ]+(.*)/i track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /([^.]*)\.([^:]*):[t ]+(.*)/i track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /^[W-c]+$/ WXY_^abc 0: WXY_^abc \= Expect no match wxy No match /^[W-c]+$/i WXY_^abc 0: WXY_^abc wxy_^ABC 0: wxy_^ABC /^[\x3f-\x5F]+$/i WXY_^abc 0: WXY_^abc wxy_^ABC 0: wxy_^ABC /^abc$/m abc 0: abc qqq\nabc 0: abc abc\nzzz 0: abc qqq\nabc\nzzz 0: abc /^abc$/ abc 0: abc \= Expect no match qqq\nabc No match abc\nzzz No match qqq\nabc\nzzz No match /\Aabc\Z/m abc 0: abc abc\n 0: abc \= Expect no match qqq\nabc No match abc\nzzz No match qqq\nabc\nzzz No match /\A(.)*\Z/s abc\ndef 0: abc\x0adef 1: f /\A(.)*\Z/m \= Expect no match abc\ndef No match /(?:b)|(?::+)/ b::c 0: b c::b 0: :: /[-az]+/ az- 0: az- \= Expect no match b No match /[az-]+/ za- 0: za- \= Expect no match b No match /[a\-z]+/ a-z 0: a-z \= Expect no match b No match /[a-z]+/ abcdxyz 0: abcdxyz /[\d-]+/ 12-34 0: 12-34 \= Expect no match aaa No match /[\d-z]+/ 12-34z 0: 12-34z \= Expect no match aaa No match /\x5c/ \\ 0: \ /\x20Z/ the Zoo 0: Z \= Expect no match Zulu No match /(abc)\1/i abcabc 0: abcabc 1: abc ABCabc 0: ABCabc 1: ABC abcABC 0: abcABC 1: abc /abc$/ abc 0: abc abc\n 0: abc \= Expect no match abc\ndef No match /(abc)\123/ abc\x53 0: abcS 1: abc /(abc)\100/ abc\x40 0: abc@ 1: abc abc\100 0: abc@ 1: abc /(abc)\1000/ abc\x400 0: abc@0 1: abc abc\x40\x30 0: abc@0 1: abc abc\1000 0: abc@0 1: abc abc\100\x30 0: abc@0 1: abc abc\100\060 0: abc@0 1: abc abc\100\60 0: abc@0 1: abc /^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/ ABCDEFGHIHI 0: ABCDEFGHIHI 1: A 2: B 3: C 4: D 5: E 6: F 7: G 8: H 9: I /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/ abcdefghijkllS 0: abcdefghijkllS 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: l /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/ abcdefghijk\12S 0: abcdefghijk\x0aS 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k /a{0}bc/ bc 0: bc /(a|(bc)){0,0}?xyz/ xyz 0: xyz /abc[\10]de/ abc\010de 0: abc\x08de /abc[\1]de/ abc\1de 0: abc\x01de /(abc)[\1]de/ abc\1de 0: abc\x01de 1: abc /(?s)a.b/ a\nb 0: a\x0ab /^([^a])([^\b])([^c]*)([^d]{3,4})/ baNOTccccd 0: baNOTcccc 1: b 2: a 3: NOT 4: cccc baNOTcccd 0: baNOTccc 1: b 2: a 3: NOT 4: ccc baNOTccd 0: baNOTcc 1: b 2: a 3: NO 4: Tcc bacccd 0: baccc 1: b 2: a 3: 4: ccc \= Expect no match anything No match b\bc No match baccd No match /[^a]/ Abc 0: A /[^a]/i Abc 0: b /[^a]+/ AAAaAbc 0: AAA /[^a]+/i AAAaAbc 0: bc /[^a]+/ bbb\nccc 0: bbb\x0accc /[^k]$/ abc 0: c \= Expect no match abk No match /[^k]{2,3}$/ abc 0: abc kbc 0: bc kabc 0: abc \= Expect no match abk No match akb No match akk No match /^\d{8,}\@.+[^k]$/ 12345678\@a.b.c.d 0: 12345678@a.b.c.d 123456789\@x.y.z 0: 123456789@x.y.z \= Expect no match 12345678\@x.y.uk No match 1234567\@a.b.c.d No match /(a)\1{8,}/ aaaaaaaaa 0: aaaaaaaaa 1: a aaaaaaaaaa 0: aaaaaaaaaa 1: a \= Expect no match aaaaaaa No match /[^a]/ aaaabcd 0: b aaAabcd 0: A /[^a]/i aaaabcd 0: b aaAabcd 0: b /[^az]/ aaaabcd 0: b aaAabcd 0: A /[^az]/i aaaabcd 0: b aaAabcd 0: b # trimmed upper ascii since Go is UTF-8 /\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/ \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 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f /P[^*]TAIRE[^*]{1,6}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /P[^*]TAIRE[^*]{1,}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /(\.\d\d[1-9]?)\d+/ 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 1.235 0: .235 1: .23 /(\.\d\d((?=0)|\d(?=\d)))/ 1.230003938 0: .23 1: .23 2: 1.875000282 0: .875 1: .875 2: 5 \= Expect no match 1.235 No match /\b(foo)\s+(\w+)/i Food is on the foo table 0: foo table 1: foo 2: table /foo(.*)bar/ The food is under the bar in the barn. 0: food is under the bar in the bar 1: d is under the bar in the /foo(.*?)bar/ The food is under the bar in the barn. 0: food is under the bar 1: d is under the /(.*)(\d*)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 53147 2: /(.*)(\d+)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*?)(\d*)/ I have 2 numbers: 53147 0: 1: 2: /(.*?)(\d+)/ I have 2 numbers: 53147 0: I have 2 1: I have 2: 2 /(.*)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*?)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*)\b(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*\D)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /^\D*(?!123)/ ABC123 0: AB /^(\D*)(?=\d)(?!123)/ ABC445 0: ABC 1: ABC \= Expect no match ABC123 No match /^[W-]46]/ W46]789 0: W46] -46]789 0: -46] \= Expect no match Wall No match Zebra No match 42 No match [abcd] No match ]abcd[ No match /^[W-\]46]/ W46]789 0: W Wall 0: W Zebra 0: Z Xylophone 0: X 42 0: 4 [abcd] 0: [ ]abcd[ 0: ] \\backslash 0: \ \= Expect no match -46]789 No match well No match /\d\d\/\d\d\/\d\d\d\d/ 01/01/2000 0: 01/01/2000 /word (?:[a-zA-Z0-9]+ ){0,10}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword \= Expect no match word cat dog elephant mussel cow horse canary baboon snake shark No match /word (?:[a-zA-Z0-9]+ ){0,300}otherword/ \= Expect no match word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope No match /^(a){0,0}/ bcd 0: abc 0: aab 0: /^(a){0,1}/ bcd 0: abc 0: a 1: a aab 0: a 1: a /^(a){0,2}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a /^(a){0,3}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a /^(a){0,}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a /^(a){1,1}/ abc 0: a 1: a aab 0: a 1: a \= Expect no match bcd No match /^(a){1,2}/ abc 0: a 1: a aab 0: aa 1: a \= Expect no match bcd No match /^(a){1,3}/ abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a \= Expect no match bcd No match /^(a){1,}/ abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a \= Expect no match bcd No match /.*\.gif/ borfle\nbib.gif\nno 0: bib.gif /.{0,}\.gif/ borfle\nbib.gif\nno 0: bib.gif /.*\.gif/m borfle\nbib.gif\nno 0: bib.gif /.*\.gif/s borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*\.gif/ms borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*$/ borfle\nbib.gif\nno 0: no /.*$/m borfle\nbib.gif\nno 0: borfle /.*$/s borfle\nbib.gif\nno 0: borfle\x0abib.gif\x0ano /.*$/ms borfle\nbib.gif\nno 0: borfle\x0abib.gif\x0ano /.*$/ borfle\nbib.gif\nno\n 0: no /.*$/m borfle\nbib.gif\nno\n 0: borfle /.*$/s borfle\nbib.gif\nno\n 0: borfle\x0abib.gif\x0ano\x0a /.*$/ms borfle\nbib.gif\nno\n 0: borfle\x0abib.gif\x0ano\x0a /(.*X|^B)/ abcde\n1234Xyz 0: 1234X 1: 1234X BarFoo 0: B 1: B \= Expect no match abcde\nBar No match /(.*X|^B)/m abcde\n1234Xyz 0: 1234X 1: 1234X BarFoo 0: B 1: B abcde\nBar 0: B 1: B /(.*X|^B)/s abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B \= Expect no match abcde\nBar No match /(.*X|^B)/ms abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B abcde\nBar 0: B 1: B /(?s)(.*X|^B)/ abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B \= Expect no match abcde\nBar No match /(?s:.*X|^B)/ abcde\n1234Xyz 0: abcde\x0a1234X BarFoo 0: B \= Expect no match abcde\nBar No match /^.*B/ \= Expect no match abc\nB No match /(?s)^.*B/ abc\nB 0: abc\x0aB /(?m)^.*B/ abc\nB 0: B /(?ms)^.*B/ abc\nB 0: abc\x0aB /(?ms)^B/ abc\nB 0: B /(?s)B$/ B\n 0: B /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 123456654321 0: 123456654321 /^\d\d\d\d\d\d\d\d\d\d\d\d/ 123456654321 0: 123456654321 /^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ 123456654321 0: 123456654321 /^[abc]{12}/ abcabcabcabc 0: abcabcabcabc /^[a-c]{12}/ abcabcabcabc 0: abcabcabcabc /^(a|b|c){12}/ abcabcabcabc 0: abcabcabcabc 1: c /^[abcdefghijklmnopqrstuvwxy0123456789]/ n 0: n \= Expect no match z No match /abcde{0,0}/ abcd 0: abcd \= Expect no match abce No match /ab[cd]{0,0}e/ abe 0: abe \= Expect no match abcde No match /ab(c){0,0}d/ abd 0: abd \= Expect no match abcd No match /a(b*)/ a 0: a 1: ab 0: ab 1: b abbbb 0: abbbb 1: bbbb \= Expect no match bbbbb No match /ab\d{0}e/ abe 0: abe \= Expect no match ab1e No match /"([^\\"]+|\\.)*"/ the \"quick\" brown fox 0: "quick" 1: quick \"the \\\"quick\\\" brown fox\" 0: "the \"quick\" brown fox" 1: brown fox /<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR> 0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR> 1: BGCOLOR='#DBE9E9' 2: align=left valign=top 3: 43. 4: <a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286) 5: 6: 7: <unset> 8: align=left valign=top 9: Lega lstaff.com 10: align=left valign=top 11: CA - Statewide /a[^a]b/ acb 0: acb a\nb 0: a\x0ab /a.b/ acb 0: acb \= Expect no match a\nb No match /a[^a]b/s acb 0: acb a\nb 0: a\x0ab /a.b/s acb 0: acb a\nb 0: a\x0ab /^(b+?|a){1,2}?c/ bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /^(b+|a){1,2}?c/ bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /(?!\A)x/m a\bx\n 0: x a\nx\n 0: x \= Expect no match x\nb\n No match /(A|B)*?CD/ CD 0: CD /(A|B)*CD/ CD 0: CD /(AB)*?\1/ ABABAB 0: ABAB 1: AB /(AB)*\1/ ABABAB 0: ABABAB 1: AB /(?<!bar)foo/ foo 0: foo catfood 0: foo arfootle 0: foo rfoosh 0: foo \= Expect no match barfoo No match towbarfoo No match /\w{3}(?<!bar)foo/ catfood 0: catfoo \= Expect no match foo No match barfoo No match towbarfoo No match /(?<=(foo)a)bar/ fooabar 0: bar 1: foo \= Expect no match bar No match foobbar No match /\Aabc\z/m abc 0: abc \= Expect no match abc\n No match qqq\nabc No match abc\nzzz No match qqq\nabc\nzzz No match "(?>.*/)foo" /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo \= Expect no match /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ No match /(?>(\.\d\d[1-9]?))\d+/ 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 \= Expect no match 1.235 No match /^((?>\w+)|(?>\s+))*$/ now is the time for all good men to come to the aid of the party 0: now is the time for all good men to come to the aid of the party 1: party \= Expect no match this is not a line with only words and spaces! No match /(\d+)(\w)/ 12345a 0: 12345a 1: 12345 2: a 12345+ 0: 12345 1: 1234 2: 5 /((?>\d+))(\w)/ 12345a 0: 12345a 1: 12345 2: a \= Expect no match 12345+ No match /(?>a+)b/ aaab 0: aaab /((?>a+)b)/ aaab 0: aaab 1: aaab /(?>(a+))b/ aaab 0: aaab 1: aaa /(?>b)+/ aaabbbccc 0: bbb /(?>a+|b+|c+)*c/ aaabbbbccccd 0: aaabbbbc /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x 0: abc(ade)ufh()()x 1: x /\(((?>[^()]+)|\([^()]+\))+\)/ (abc) 0: (abc) 1: abc (abc(def)xyz) 0: (abc(def)xyz) 1: xyz \= Expect no match ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa No match /a(?-i)b/i ab 0: ab Ab 0: Ab \= Expect no match aB No match AB No match /(a (?x)b c)d e/ a bcd e 0: a bcd e 1: a bc \= Expect no match a b cd e No match abcd e No match a bcde No match /(a b(?x)c d (?-x)e f)/ a bcde f 0: a bcde f 1: a bcde f \= Expect no match abcdef No match /(a(?i)b)c/ abc 0: abc 1: ab aBc 0: aBc 1: aB \= Expect no match abC No match aBC No match Abc No match ABc No match ABC No match AbC No match /a(?i:b)c/ abc 0: abc aBc 0: aBc \= Expect no match ABC No match abC No match aBC No match /a(?i:b)*c/ aBc 0: aBc aBBc 0: aBBc \= Expect no match aBC No match aBBC No match /a(?=b(?i)c)\w\wd/ abcd 0: abcd abCd 0: abCd \= Expect no match aBCd No match abcD No match /(?s-i:more.*than).*million/i more than million 0: more than million more than MILLION 0: more than MILLION more \n than Million 0: more \x0a than Million \= Expect no match MORE THAN MILLION No match more \n than \n million No match /(?:(?s-i)more.*than).*million/i more than million 0: more than million more than MILLION 0: more than MILLION more \n than Million 0: more \x0a than Million \= Expect no match MORE THAN MILLION No match more \n than \n million No match /(?>a(?i)b+)+c/ abc 0: abc aBbc 0: aBbc aBBc 0: aBBc \= Expect no match Abc No match abAb No match abbC No match /(?=a(?i)b)\w\wc/ abc 0: abc aBc 0: aBc \= Expect no match Ab No match abC No match aBC No match /(?<=a(?i)b)(\w\w)c/ abxxc 0: xxc 1: xx aBxxc 0: xxc 1: xx \= Expect no match Abxxc No match ABxxc No match abxxC No match /(?:(a)|b)(?(1)A|B)/ aA 0: aA 1: a bB 0: bB \= Expect no match aB No match bA No match /^(a)?(?(1)a|b)+$/ aa 0: aa 1: a b 0: b bb 0: bb \= Expect no match ab No match # 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: 0: abc: 12 0: 12 123 0: 12 \= Expect no match xyz No match /^(?(?!abc)\d\d|\w{3}:)$/ abc: 0: abc: 12 0: 12 \= Expect no match 123 No match xyz No match /(?(?<=foo)bar|cat)/ foobar 0: bar cat 0: cat fcat 0: cat focat 0: cat \= Expect no match foocat No match /(?(?<!foo)cat|bar)/ foobar 0: bar cat 0: cat fcat 0: cat focat 0: cat \= Expect no match foocat No match /( \( )? [^()]+ (?(1) \) |) /x abcd 0: abcd (abcd) 0: (abcd) 1: ( the quick (abcd) fox 0: the quick (abcd 0: abcd /( \( )? [^()]+ (?(1) \) ) /x abcd 0: abcd (abcd) 0: (abcd) 1: ( the quick (abcd) fox 0: the quick (abcd 0: abcd /^(?(2)a|(1)(2))+$/ 12 0: 12 1: 1 2: 2 12a 0: 12a 1: 1 2: 2 12aa 0: 12aa 1: 1 2: 2 \= Expect no match 1234 No match /((?i)blah)\s+\1/ blah blah 0: blah blah 1: blah BLAH BLAH 0: BLAH BLAH 1: BLAH Blah Blah 0: Blah Blah 1: Blah blaH blaH 0: blaH blaH 1: blaH \= Expect no match blah BLAH No match Blah blah No match blaH blah No match /((?i)blah)\s+(?i:\1)/ blah blah 0: blah blah 1: blah BLAH BLAH 0: BLAH BLAH 1: BLAH Blah Blah 0: Blah Blah 1: Blah blaH blaH 0: blaH blaH 1: blaH blah BLAH 0: blah BLAH 1: blah Blah blah 0: Blah blah 1: Blah blaH blah 0: blaH blah 1: blaH /(?>a*)*/ a 0: a aa 0: aa aaaa 0: aaaa /(abc|)+/ abc 0: abc 1: abcabc 0: abcabc 1: abcabcabc 0: abcabcabc 1: xyz 0: 1: /([a]*)*/ a 0: a 1: aaaaa 0: aaaaa 1: /([ab]*)*/ a 0: a 1: b 0: b 1: ababab 0: ababab 1: aaaabcde 0: aaaab 1: bbbb 0: bbbb 1: /([^a]*)*/ b 0: b 1: bbbb 0: bbbb 1: aaa 0: 1: /([^ab]*)*/ cccc 0: cccc 1: abab 0: 1: /([a]*?)*/ a 0: 1: aaaa 0: 1: /([ab]*?)*/ a 0: 1: b 0: 1: abab 0: 1: baba 0: 1: /([^a]*?)*/ b 0: 1: bbbb 0: 1: aaa 0: 1: /([^ab]*?)*/ c 0: 1: cccc 0: 1: baba 0: 1: /(?>a*)*/ a 0: a aaabcde 0: aaa /((?>a*))*/ aaaaa 0: aaaaa 1: aabbaa 0: aa 1: /((?>a*?))*/ aaaaa 0: 1: aabbaa 0: 1: /(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x 12-sep-98 0: 12-sep-98 12-09-98 0: 12-09-98 \= Expect no match sep-12-98 No match /(?<=(foo))bar\1/ foobarfoo 0: barfoo 1: foo foobarfootling 0: barfoo 1: foo \= Expect no match foobar No match barfoo No match /(?i:saturday|sunday)/ saturday 0: saturday sunday 0: sunday Saturday 0: Saturday Sunday 0: Sunday SATURDAY 0: SATURDAY SUNDAY 0: SUNDAY SunDay 0: SunDay /(a(?i)bc|BB)x/ abcx 0: abcx 1: abc aBCx 0: aBCx 1: aBC bbx 0: bbx 1: bb BBx 0: BBx 1: BB \= Expect no match abcX No match aBCX No match bbX No match BBX No match /^([ab](?i)[cd]|[ef])/ ac 0: ac 1: ac aC 0: aC 1: aC bD 0: bD 1: bD elephant 0: e 1: e Europe 0: E 1: E frog 0: f 1: f France 0: F 1: F \= Expect no match Africa No match /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ ab 0: ab 1: ab aBd 0: aBd 1: aBd xy 0: xy 1: xy xY 0: xY 1: xY zebra 0: z 1: z Zambesi 0: Z 1: Z \= Expect no match aCD No match XY No match /(?<=foo\n)^bar/m foo\nbar 0: bar \= Expect no match bar No match baz\nbar No match /(?<=(?<!foo)bar)baz/ barbaz 0: baz barbarbaz 0: baz koobarbaz 0: baz \= Expect no match baz No match foobarbaz No match # 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}$/ aaaaa 0: aaaaa 1: a aaaaaaa 0: aaaaaaa 1: a aaaaaaaaaa 0: aaaaaaaaaa 1: aaaa \= Expect no match a No match aa No match aaa No match aaaaaaaa No match aaaaaaaaa No match aaaaaaaaaaa No match aaaaaaaaaaaa No match aaaaaaaaaaaaa No match aaaaaaaaaaaaaa No match aaaaaaaaaaaaaaa No match aaaaaaaaaaaaaaaa No match /^(a\1?)(a\1?)(a\2?)(a\3?)$/ aaaa 0: aaaa 1: a 2: a 3: a 4: a aaaaa 0: aaaaa 1: a 2: aa 3: a 4: a aaaaaa 0: aaaaaa 1: a 2: aa 3: a 4: aa aaaaaaa 0: aaaaaaa 1: a 2: aa 3: aaa 4: a aaaaaaaaaa 0: aaaaaaaaaa 1: a 2: aa 3: aaa 4: aaaa \= Expect no match a No match aa No match aaa No match aaaaaaaa No match aaaaaaaaa No match aaaaaaaaaaa No match aaaaaaaaaaaa No match aaaaaaaaaaaaa No match aaaaaaaaaaaaaa No match aaaaaaaaaaaaaaa No match aaaaaaaaaaaaaaaa No match # 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 0: abc xabcy 0: abc ababc 0: abc \= Expect no match xbc No match axc No match abx No match /ab*c/ abc 0: abc /ab*bc/ abc 0: abc abbc 0: abbc abbbbc 0: abbbbc /.{1}/ abbbbc 0: a /.{3,4}/ abbbbc 0: abbb /ab{0,}bc/ abbbbc 0: abbbbc /ab+bc/ abbc 0: abbc \= Expect no match abc No match abq No match /ab{1,}bc/ /ab+bc/ abbbbc 0: abbbbc /ab{1,}bc/ abbbbc 0: abbbbc /ab{1,3}bc/ abbbbc 0: abbbbc /ab{3,4}bc/ abbbbc 0: abbbbc /ab{4,5}bc/ \= Expect no match abq No match abbbbc No match /ab?bc/ abbc 0: abbc abc 0: abc /ab{0,1}bc/ abc 0: abc /ab?bc/ /ab?c/ abc 0: abc /ab{0,1}c/ abc 0: abc /^abc$/ abc 0: abc \= Expect no match abbbbc No match abcc No match /^abc/ abcc 0: abc /^abc$/ /abc$/ aabc 0: abc \= Expect no match aabcd No match /^/ abc 0: /$/ abc 0: /a.c/ abc 0: abc axc 0: axc /a.*c/ axyzc 0: axyzc /a[bc]d/ abd 0: abd \= Expect no match axyzd No match abc No match /a[b-d]e/ ace 0: ace /a[b-d]/ aac 0: ac /a[-b]/ a- 0: a- /a[b-]/ a- 0: a- /a]/ a] 0: a] /a[]]b/ a]b 0: a]b /a[^bc]d/ aed 0: aed \= Expect no match abd No match abd No match /a[^-b]c/ adc 0: adc /a[^]b]c/ adc 0: adc a-c 0: a-c \= Expect no match a]c No match /\ba\b/ a- 0: a -a 0: a -a- 0: a /\by\b/ \= Expect no match xy No match yz No match xyz No match /\Ba\B/ \= Expect no match a- No match -a No match -a- No match /\By\b/ xy 0: y /\by\B/ yz 0: y /\By\B/ xyz 0: y /\w/ a 0: a /\W/ - 0: - \= Expect no match a No match /a\sb/ a b 0: a b /a\Sb/ a-b 0: a-b \= Expect no match a b No match /\d/ 1 0: 1 /\D/ - 0: - \= Expect no match 1 No match /[\w]/ a 0: a /[\W]/ - 0: - \= Expect no match a No match /a[\s]b/ a b 0: a b /a[\S]b/ a-b 0: a-b \= Expect no match a b No match /[\d]/ 1 0: 1 /[\D]/ - 0: - \= Expect no match 1 No match /ab|cd/ abc 0: ab abcd 0: ab /()ef/ def 0: ef 1: /$b/ /a\(b/ a(b 0: a(b /a\(*b/ ab 0: ab a((b 0: a((b /a\\b/ a\\b 0: a\b /((a))/ abc 0: a 1: a 2: a /(a)b(c)/ abc 0: abc 1: a 2: c /a+b+c/ aabbabc 0: abc /a{1,}b{1,}c/ aabbabc 0: abc /a.+?c/ abcabc 0: abc /(a+|b)*/ ab 0: ab 1: b /(a+|b){0,}/ ab 0: ab 1: b /(a+|b)+/ ab 0: ab 1: b /(a+|b){1,}/ ab 0: ab 1: b /(a+|b)?/ ab 0: a 1: a /(a+|b){0,1}/ ab 0: a 1: a /[^ab]*/ cde 0: cde /abc/ \= Expect no match b No match /a*/ \ 0: /([abc])*d/ abbbcd 0: abbbcd 1: c /([abc])*bcd/ abcd 0: abcd 1: a /a|b|c|d|e/ e 0: e /(a|b|c|d|e)f/ ef 0: ef 1: e /abcd*efg/ abcdefg 0: abcdefg /ab*/ xabyabbbz 0: ab xayabbbz 0: a /(ab|cd)e/ abcde 0: cde 1: cd /[abhgefdc]ij/ hij 0: hij /^(ab|cd)e/ /(abc|)ef/ abcdef 0: ef 1: /(a|b)c*d/ abcd 0: bcd 1: b /(ab|ab*)bc/ abc 0: abc 1: a /a([bc]*)c*/ abc 0: abc 1: bc /a([bc]*)(c*d)/ abcd 0: abcd 1: bc 2: d /a([bc]+)(c*d)/ abcd 0: abcd 1: bc 2: d /a([bc]*)(c+d)/ abcd 0: abcd 1: b 2: cd /a[bcd]*dcdcde/ adcdcde 0: adcdcde /a[bcd]+dcdcde/ \= Expect no match abcde No match adcdcde No match /(ab|a)b*c/ abc 0: abc 1: ab /((a)(b)c)(d)/ abcd 0: abcd 1: abc 2: a 3: b 4: d /[a-zA-Z_][a-zA-Z0-9_]*/ alpha 0: alpha /^a(bc+|b[eh])g|.h$/ abh 0: bh /(bc+d$|ef*g.|h?i(j|k))/ effgz 0: effgz 1: effgz ij 0: ij 1: ij 2: j reffgz 0: effgz 1: effgz \= Expect no match effg No match bcdd No match /((((((((((a))))))))))/ a 0: a 1: a 2: a 3: a 4: a 5: a 6: a 7: a 8: a 9: a 10: a /((((((((((a))))))))))\10/ aa 0: aa 1: a 2: a 3: a 4: a 5: a 6: a 7: a 8: a 9: a 10: a /(((((((((a)))))))))/ a 0: a 1: a 2: a 3: a 4: a 5: a 6: a 7: a 8: a 9: a /multiple words of text/ \= Expect no match aa No match uh-uh No match /multiple words/ multiple words, yeah 0: multiple words /(.*)c(.*)/ abcde 0: abcde 1: ab 2: de /\((.*), (.*)\)/ (a, b) 0: (a, b) 1: a 2: b /[k]/ /abcd/ abcd 0: abcd /a(bc)d/ abcd 0: abcd 1: bc /a[-]?c/ ac 0: ac /(abc)\1/ abcabc 0: abcabc 1: abc /([a-c]*)\1/ abcabc 0: abcabc 1: abc /(a)|\1/ a 0: a 1: a ab 0: a 1: a \= Expect no match x No match /(([a-c])b*?\2)*/ ababbbcbc 0: ababb 1: bb 2: b /(([a-c])b*?\2){3}/ ababbbcbc 0: ababbbcbc 1: cbc 2: c /((\3|b)\2(a)x)+/ aaaxabaxbaaxbbax 0: bbax 1: bbax 2: b 3: a /((\3|b)\2(a)){2,}/ bbaababbabaaaaabbaaaabba 0: bbaaaabba 1: bba 2: b 3: a /abc/i ABC 0: ABC XABCY 0: ABC ABABC 0: ABC \= Expect no match aaxabxbaxbbx No match XBC No match AXC No match ABX No match /ab*c/i ABC 0: ABC /ab*bc/i ABC 0: ABC ABBC 0: ABBC /ab*?bc/i ABBBBC 0: ABBBBC /ab{0,}?bc/i ABBBBC 0: ABBBBC /ab+?bc/i ABBC 0: ABBC /ab+bc/i \= Expect no match ABC No match ABQ No match /ab{1,}bc/i /ab+bc/i ABBBBC 0: ABBBBC /ab{1,}?bc/i ABBBBC 0: ABBBBC /ab{1,3}?bc/i ABBBBC 0: ABBBBC /ab{3,4}?bc/i ABBBBC 0: ABBBBC /ab{4,5}?bc/i \= Expect no match ABQ No match ABBBBC No match /ab??bc/i ABBC 0: ABBC ABC 0: ABC /ab{0,1}?bc/i ABC 0: ABC /ab??bc/i /ab??c/i ABC 0: ABC /ab{0,1}?c/i ABC 0: ABC /^abc$/i ABC 0: ABC \= Expect no match ABBBBC No match ABCC No match /^abc/i ABCC 0: ABC /^abc$/i /abc$/i AABC 0: ABC /^/i ABC 0: /$/i ABC 0: /a.c/i ABC 0: ABC AXC 0: AXC /a.*?c/i AXYZC 0: AXYZC /a.*c/i AABC 0: AABC \= Expect no match AXYZD No match /a[bc]d/i ABD 0: ABD /a[b-d]e/i ACE 0: ACE \= Expect no match ABC No match ABD No match /a[b-d]/i AAC 0: AC /a[-b]/i A- 0: A- /a[b-]/i A- 0: A- /a]/i A] 0: A] /a[]]b/i A]B 0: A]B /a[^bc]d/i AED 0: AED /a[^-b]c/i ADC 0: ADC \= Expect no match ABD No match A-C No match /a[^]b]c/i ADC 0: ADC /ab|cd/i ABC 0: AB ABCD 0: AB /()ef/i DEF 0: EF 1: /$b/i \= Expect no match A]C No match B No match /a\(b/i A(B 0: A(B /a\(*b/i AB 0: AB A((B 0: A((B /a\\b/i A\\b 0: A\b a\\B 0: a\B /((a))/i ABC 0: A 1: A 2: A /(a)b(c)/i ABC 0: ABC 1: A 2: C /a+b+c/i AABBABC 0: ABC /a{1,}b{1,}c/i AABBABC 0: ABC /a.+?c/i ABCABC 0: ABC /a.*?c/i ABCABC 0: ABC /a.{0,5}?c/i ABCABC 0: ABC /(a+|b)*/i AB 0: AB 1: B /(a+|b){0,}/i AB 0: AB 1: B /(a+|b)+/i AB 0: AB 1: B /(a+|b){1,}/i AB 0: AB 1: B /(a+|b)?/i AB 0: A 1: A /(a+|b){0,1}/i AB 0: A 1: A /(a+|b){0,1}?/i AB 0: /[^ab]*/i CDE 0: CDE /([abc])*d/i ABBBCD 0: ABBBCD 1: C /([abc])*bcd/i ABCD 0: ABCD 1: A /a|b|c|d|e/i E 0: E /(a|b|c|d|e)f/i EF 0: EF 1: E /abcd*efg/i ABCDEFG 0: ABCDEFG /ab*/i XABYABBBZ 0: AB XAYABBBZ 0: A /(ab|cd)e/i ABCDE 0: CDE 1: CD /[abhgefdc]ij/i HIJ 0: HIJ /^(ab|cd)e/i \= Expect no match ABCDE No match /(abc|)ef/i ABCDEF 0: EF 1: /(a|b)c*d/i ABCD 0: BCD 1: B /(ab|ab*)bc/i ABC 0: ABC 1: A /a([bc]*)c*/i ABC 0: ABC 1: BC /a([bc]*)(c*d)/i ABCD 0: ABCD 1: BC 2: D /a([bc]+)(c*d)/i ABCD 0: ABCD 1: BC 2: D /a([bc]*)(c+d)/i ABCD 0: ABCD 1: B 2: CD /a[bcd]*dcdcde/i ADCDCDE 0: ADCDCDE /a[bcd]+dcdcde/i /(ab|a)b*c/i ABC 0: ABC 1: AB /((a)(b)c)(d)/i ABCD 0: ABCD 1: ABC 2: A 3: B 4: D /[a-zA-Z_][a-zA-Z0-9_]*/i ALPHA 0: ALPHA /^a(bc+|b[eh])g|.h$/i ABH 0: BH /(bc+d$|ef*g.|h?i(j|k))/i EFFGZ 0: EFFGZ 1: EFFGZ IJ 0: IJ 1: IJ 2: J REFFGZ 0: EFFGZ 1: EFFGZ \= Expect no match ADCDCDE No match EFFG No match BCDD No match /((((((((((a))))))))))/i A 0: A 1: A 2: A 3: A 4: A 5: A 6: A 7: A 8: A 9: A 10: A /((((((((((a))))))))))\10/i AA 0: AA 1: A 2: A 3: A 4: A 5: A 6: A 7: A 8: A 9: A 10: A /(((((((((a)))))))))/i A 0: A 1: A 2: A 3: A 4: A 5: A 6: A 7: A 8: A 9: A /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i A 0: A 1: A /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i C 0: C 1: C /multiple words of text/i \= Expect no match AA No match UH-UH No match /multiple words/i MULTIPLE WORDS, YEAH 0: MULTIPLE WORDS /(.*)c(.*)/i ABCDE 0: ABCDE 1: AB 2: DE /\((.*), (.*)\)/i (A, B) 0: (A, B) 1: A 2: B /[k]/i /abcd/i ABCD 0: ABCD /a(bc)d/i ABCD 0: ABCD 1: BC /a[-]?c/i AC 0: AC /(abc)\1/i ABCABC 0: ABCABC 1: ABC /([a-c]*)\1/i ABCABC 0: ABCABC 1: ABC /a(?!b)./ abad 0: ad /a(?=d)./ abad 0: ad /a(?=c|d)./ abad 0: ad /a(?:b|c|d)(.)/ ace 0: ace 1: e /a(?:b|c|d)*(.)/ ace 0: ace 1: e /a(?:b|c|d)+?(.)/ ace 0: ace 1: e acdbcdbe 0: acd 1: d /a(?:b|c|d)+(.)/ acdbcdbe 0: acdbcdbe 1: e /a(?:b|c|d){2}(.)/ acdbcdbe 0: acdb 1: b /a(?:b|c|d){4,5}(.)/ acdbcdbe 0: acdbcdb 1: b /a(?:b|c|d){4,5}?(.)/ acdbcdbe 0: acdbcd 1: d /((foo)|(bar))*/ foobar 0: foobar 1: bar 2: foo 3: bar /a(?:b|c|d){6,7}(.)/ acdbcdbe 0: acdbcdbe 1: e /a(?:b|c|d){6,7}?(.)/ acdbcdbe 0: acdbcdbe 1: e /a(?:b|c|d){5,6}(.)/ acdbcdbe 0: acdbcdbe 1: e /a(?:b|c|d){5,6}?(.)/ acdbcdbe 0: acdbcdb 1: b /a(?:b|c|d){5,7}(.)/ acdbcdbe 0: acdbcdbe 1: e /a(?:b|c|d){5,7}?(.)/ acdbcdbe 0: acdbcdb 1: b /a(?:b|(c|e){1,2}?|d)+?(.)/ ace 0: ace 1: c 2: e /^(.+)?B/ AB 0: AB 1: A /^([^a-z])|(\^)$/ . 0: . 1: . /^[<>]&/ <&OUT 0: <& /^(a\1?){4}$/ aaaaaaaaaa 0: aaaaaaaaaa 1: aaaa \= Expect no match AB No match aaaaaaaaa No match aaaaaaaaaaa No match /^(a(?(1)\1)){4}$/ aaaaaaaaaa 0: aaaaaaaaaa 1: aaaa \= Expect no match aaaaaaaaa No match aaaaaaaaaaa No match /(?:(f)(o)(o)|(b)(a)(r))*/ foobar 0: foobar 1: f 2: o 3: o 4: b 5: a 6: r /(?<=a)b/ ab 0: b \= Expect no match cb No match b No match /(?<!c)b/ ab 0: b b 0: b b 0: b /(?:..)*a/ aba 0: aba /(?:..)*?a/ aba 0: a /^(?:b|a(?=(.)))*\1/ abc 0: ab 1: b /^(){3,5}/ abc 0: 1: /^(a+)*ax/ aax 0: aax 1: a /^((a|b)+)*ax/ aax 0: aax 1: a 2: a /^((a|bc)+)*ax/ aax 0: aax 1: a 2: a /(a|x)*ab/ cab 0: ab /(a)*ab/ cab 0: ab /(?:(?i)a)b/ ab 0: ab /((?i)a)b/ ab 0: ab 1: a /(?:(?i)a)b/ Ab 0: Ab /((?i)a)b/ Ab 0: Ab 1: A /(?:(?i)a)b/ \= Expect no match cb No match aB No match /((?i)a)b/ /(?i:a)b/ ab 0: ab /((?i:a))b/ ab 0: ab 1: a /(?i:a)b/ Ab 0: Ab /((?i:a))b/ Ab 0: Ab 1: A /(?i:a)b/ \= Expect no match aB No match aB No match /((?i:a))b/ /(?:(?-i)a)b/i ab 0: ab /((?-i)a)b/i ab 0: ab 1: a /(?:(?-i)a)b/i aB 0: aB /((?-i)a)b/i aB 0: aB 1: a /(?:(?-i)a)b/i aB 0: aB \= Expect no match Ab No match AB No match /(?-i:a)b/i ab 0: ab /((?-i:a))b/i ab 0: ab 1: a /(?-i:a)b/i aB 0: aB /((?-i:a))b/i aB 0: aB 1: a /(?-i:a)b/i \= Expect no match AB No match Ab No match /((?-i:a))b/i /(?-i:a)b/i aB 0: aB /((?-i:a))b/i aB 0: aB 1: a /(?-i:a)b/i \= Expect no match Ab No match AB No match /((?-i:a))b/i /((?-i:a.))b/i \= Expect no match AB No match a\nB No match /((?s-i:a.))b/i a\nB 0: a\x0aB 1: a\x0a /(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/ cabbbb 0: cabbbb /(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/ caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb /(ab)\d\1/i Ab4ab 0: Ab4ab 1: Ab ab4Ab 0: ab4Ab 1: ab /foo\w*\d{4}baz/ foobar1234baz 0: foobar1234baz /x(~~)*(?:(?:F)?)?/ x~~ 0: x~~ 1: ~~ /^a(?#xxx){3}c/ aaac 0: aaac /^a (?#xxx) (?#yyy) {3}c/x aaac 0: aaac /(?<![cd])b/ \= Expect no match B\nB No match dbcb No match /(?<![cd])[ab]/ dbaacb 0: a /(?<!(c|d))b/ /(?<!(c|d))[ab]/ dbaacb 0: a /(?<!cd)[ab]/ cdaccb 0: b /^(?:a?b?)*$/ \ 0: a 0: a ab 0: ab aaa 0: aaa \= Expect no match dbcb No match a-- No match aa-- No match /((?s)^a(.))((?m)^b$)/ a\nb\nc\n 0: a\x0ab 1: a\x0a 2: \x0a 3: b /((?m)^b$)/ a\nb\nc\n 0: b 1: b /(?m)^b/ a\nb\n 0: b /(?m)^(b)/ a\nb\n 0: b 1: b /((?m)^b)/ a\nb\n 0: b 1: b /\n((?m)^b)/ a\nb\n 0: \x0ab 1: b /((?s).)c(?!.)/ a\nb\nc\n 0: \x0ac 1: \x0a a\nb\nc\n 0: \x0ac 1: \x0a /((?s)b.)c(?!.)/ a\nb\nc\n 0: b\x0ac 1: b\x0a a\nb\nc\n 0: b\x0ac 1: b\x0a /^b/ /()^b/ \= Expect no match a\nb\nc\n No match a\nb\nc\n No match /((?m)^b)/ a\nb\nc\n 0: b 1: b /(x)?(?(1)a|b)/ \= Expect no match a No match a No match /(x)?(?(1)b|a)/ a 0: a /()?(?(1)b|a)/ a 0: a /()(?(1)b|a)/ /()?(?(1)a|b)/ a 0: a 1: /^(\()?blah(?(1)(\)))$/ (blah) 0: (blah) 1: ( 2: ) blah 0: blah \= Expect no match a No match blah) No match (blah No match /^(\(+)?blah(?(1)(\)))$/ (blah) 0: (blah) 1: ( 2: ) blah 0: blah \= Expect no match blah) No match (blah No match /(?(?!a)a|b)/ /(?(?!a)b|a)/ a 0: a /(?(?=a)b|a)/ \= Expect no match a No match a No match /(?(?=a)a|b)/ a 0: a /(?=(a+?))(\1ab)/ aaab 0: aab 1: a 2: aab /^(?=(a+?))\1ab/ /(\w+:)+/ one: 0: one: 1: one: /$(?<=^(a))/ a 0: 1: a /(?=(a+?))(\1ab)/ aaab 0: aab 1: a 2: aab /^(?=(a+?))\1ab/ \= Expect no match aaab No match aaab No match /([\w:]+::)?(\w+)$/ abcd 0: abcd 1: <unset> 2: abcd xy:z:::abcd 0: xy:z:::abcd 1: xy:z::: 2: abcd /^[^bcd]*(c+)/ aexycd 0: aexyc 1: c /(a*)b+/ caab 0: aab 1: aa /([\w:]+::)?(\w+)$/ abcd 0: abcd 1: <unset> 2: abcd xy:z:::abcd 0: xy:z:::abcd 1: xy:z::: 2: abcd \= Expect no match abcd: No match abcd: No match /^[^bcd]*(c+)/ aexycd 0: aexyc 1: c /(>a+)ab/ /(?>a+)b/ aaab 0: aaab /([[:]+)/ a:[b]: 0: :[ 1: :[ /([[=]+)/ a=[b]= 0: =[ 1: =[ /([[.]+)/ a.[b]. 0: .[ 1: .[ /((?>a+)b)/ aaab 0: aaab 1: aaab /(?>(a+))b/ aaab 0: aaab 1: aaa /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x 0: abc(ade)ufh()()x 1: x /a\Z/ \= Expect no match aaab No match a\nb\n No match /b\Z/ a\nb\n 0: b /b\z/ /b\Z/ a\nb 0: b /b\z/ a\nb 0: b /^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ a 0: a 1: abc 0: abc 1: a-b 0: a-b 1: 0-9 0: 0-9 1: a.b 0: a.b 1: 5.6.7 0: 5.6.7 1: the.quick.brown.fox 0: the.quick.brown.fox 1: a100.b200.300c 0: a100.b200.300c 1: 12-ab.1245 0: 12-ab.1245 1: \= Expect no match \ No match .a No match -a No match a- No match a. No match a_b No match a.- No match a.. No match ab..bc No match the.quick.brown.fox- No match the.quick.brown.fox. No match the.quick.brown.fox_ No match the.quick.brown.fox+ No match /(?>.*)(?<=(abcd|wxyz))/ alphabetabcd 0: alphabetabcd 1: abcd endingwxyz 0: endingwxyz 1: wxyz \= Expect no match a rather long string that doesn't end with one of them No match /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword \= Expect no match word cat dog elephant mussel cow horse canary baboon snake shark No match /word (?>[a-zA-Z0-9]+ ){0,30}otherword/ \= Expect no match word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope No match /(?<=\d{3}(?!999))foo/ 999foo 0: foo 123999foo 0: foo \= Expect no match 123abcfoo No match /(?<=(?!...999)\d{3})foo/ 999foo 0: foo 123999foo 0: foo \= Expect no match 123abcfoo No match /(?<=\d{3}(?!999)...)foo/ 123abcfoo 0: foo 123456foo 0: foo \= Expect no match 123999foo No match /(?<=\d{3}...)(?<!999)foo/ 123abcfoo 0: foo 123456foo 0: foo \= Expect no match 123999foo No match /<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 0: <a href=abcd 1: <unset> 2: <unset> 3: abcd <a href=\"abcd xyz pqr\" cats 0: <a href="abcd xyz pqr" 1: " 2: abcd xyz pqr <a href=\'abcd xyz pqr\' cats 0: <a href='abcd xyz pqr' 1: ' 2: abcd xyz pqr /<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 0: <a href=abcd 1: <unset> 2: <unset> 3: abcd <a href=\"abcd xyz pqr\" cats 0: <a href="abcd xyz pqr" 1: " 2: abcd xyz pqr <a href = \'abcd xyz pqr\' cats 0: <a href = 'abcd xyz pqr' 1: ' 2: abcd xyz pqr /<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 0: <a href=abcd 1: <unset> 2: <unset> 3: abcd <a href=\"abcd xyz pqr\" cats 0: <a href="abcd xyz pqr" 1: " 2: abcd xyz pqr <a href = \'abcd xyz pqr\' cats 0: <a href = 'abcd xyz pqr' 1: ' 2: abcd xyz pqr /((Z)+|A)*/ ZABCDEFG 0: ZA 1: A 2: Z /(Z()|A)*/ ZABCDEFG 0: ZA 1: A 2: /(Z(())|A)*/ ZABCDEFG 0: ZA 1: A 2: 3: /((?>Z)+|A)*/ ZABCDEFG 0: ZA 1: A /((?>)+|A)*/ ZABCDEFG 0: 1: /^[\d-a]/ abcde 0: a -things 0: - 0digit 0: 0 \= Expect no match bcdef No match /[\s]+/ > \x09\x0a\x0c\x0d\x0b< 0: \x09\x0a\x0c\x0d\x0b /\s+/ > \x09\x0a\x0c\x0d\x0b< 0: \x09\x0a\x0c\x0d\x0b /ab/x ab 0: ab /(?!\A)x/m a\nxb\n 0: x /(?!^)x/m \= Expect no match a\nxb\n No match #/abc\Qabc\Eabc/ # abcabcabc # 0: abcabcabc #/abc\Q(*+|\Eabc/ # abc(*+|abc # 0: abc(*+|abc #/ abc\Q abc\Eabc/x # abc abcabc # 0: abc abcabc #\= Expect no match # abcabcabc #No match #/abc#comment # \Q#not comment # literal\E/x # abc#not comment\n literal # 0: abc#not comment\x0a literal #/abc#comment # \Q#not comment # literal/x # abc#not comment\n literal # 0: abc#not comment\x0a literal #/abc#comment # \Q#not comment # literal\E #more comment # /x # abc#not comment\n literal # 0: abc#not comment\x0a literal #/abc#comment # \Q#not comment # literal\E #more comment/x # abc#not comment\n literal # 0: abc#not comment\x0a literal #/\Qabc\$xyz\E/ # abc\\\$xyz # 0: abc\$xyz #/\Qabc\E\$\Qxyz\E/ # abc\$xyz # 0: abc$xyz /\Gabc/ abc 0: abc \= Expect no match xyzabc No match /a(?x: b c )d/ XabcdY 0: abcd \= Expect no match Xa b c d Y No match /((?x)x y z | a b c)/ XabcY 0: abc 1: abc AxyzB 0: xyz 1: xyz /(?i)AB(?-i)C/ XabCY 0: abC \= Expect no match XabcY No match /((?i)AB(?-i)C|D)E/ abCE 0: abCE 1: abC DE 0: DE 1: D \= Expect no match abcE No match abCe No match dE No match De No match /(.*)\d+\1/ abc123abc 0: abc123abc 1: abc abc123bc 0: bc123bc 1: bc /(.*)\d+\1/s abc123abc 0: abc123abc 1: abc abc123bc 0: bc123bc 1: bc /((.*))\d+\1/ abc123abc 0: abc123abc 1: abc 2: abc abc123bc 0: bc123bc 1: bc 2: bc # 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 0: a123::a123 1: a123:b342::abcd 0: a123:b342::abcd 1: a123:b342::324e:abcd 0: a123:b342::324e:abcd 1: a123:ddde:b342::324e:abcd 0: a123:ddde:b342::324e:abcd 1: a123:ddde:b342::324e:dcba:abcd 0: a123:ddde:b342::324e:dcba:abcd 1: a123:ddde:9999:b342::324e:dcba:abcd 0: a123:ddde:9999:b342::324e:dcba:abcd 1: \= Expect no match 1:2:3:4:5:6:7:8 No match a123:bce:ddde:9999:b342::324e:dcba:abcd No match a123::9999:b342::324e:dcba:abcd No match abcde:2:3:4:5:6:7:8 No match ::1 No match abcd:fee0:123:: No match :1 No match 1: No match #/[z\Qa-d]\E]/ # z # 0: z # a # 0: a # - # 0: - # d # 0: d # ] # 0: ] #\= Expect no match # b #No match #TODO: PCRE has an optimization to make this workable, .NET does not #/(a+)*b/ #\= Expect no match # aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa #No match # All these had to be updated because we understand unicode # and this looks like it's expecting single byte matches # .NET generates \xe4...not sure what's up, might just be different code pages /(?i)reg(?:ul(?:[aä]|ae)r|ex)/ REGular 0: REGular regulaer 0: regulaer Regex 0: Regex regulär 0: regul\xc3\xa4r #/Åæåä[à-ÿÀ-ß]+/ # Åæåäà # 0: \xc5\xe6\xe5\xe4\xe0 # Åæåäÿ # 0: \xc5\xe6\xe5\xe4\xff # ÅæåäÀ # 0: \xc5\xe6\xe5\xe4\xc0 # Åæåäß # 0: \xc5\xe6\xe5\xe4\xdf /(?<=Z)X./ \x84XAZXB 0: XB /ab cd (?x) de fg/ ab cd defg 0: ab cd defg /ab cd(?x) de fg/ ab cddefg 0: ab cddefg \= Expect no match abcddefg No match /(?<![^f]oo)(bar)/ foobarX 0: bar 1: bar \= Expect no match boobarX No match /(?<![^f])X/ offX 0: X \= Expect no match onyX No match /(?<=[^f])X/ onyX 0: X \= Expect no match offX No match /(?:(?(1)a|b)(X))+/ bXaX 0: bXaX 1: X /(?:(?(1)\1a|b)(X|Y))+/ bXXaYYaY 0: bXXaYYaY 1: Y bXYaXXaX 0: bX 1: X # TODO: I think this is a difference caused by the # collision of group numbers, but not sure #/()()()()()()()()()(?:(?(10)\10a|b)(X|Y))+/ # bXXaYYaY # 0: bX # 1: # 2: # 3: # 4: # 5: # 6: # 7: # 8: # 9: #10: X /[[,abc,]+]/ abc] 0: abc] a,b] 0: a,b] [a,b,c] 0: [a,b,c] /(?-x: )/x A\x20B 0: "(?x)(?-x: \s*#\s*)" A # B 0: # \= Expect no match # No match "(?x-is)(?:(?-ixs) \s*#\s*) include" A #include 0: #include \= Expect no match A#include No match A #Include No match /a*b*\w/ aaabbbb 0: aaabbbb aaaa 0: aaaa a 0: a /a*b?\w/ aaabbbb 0: aaabb aaaa 0: aaaa a 0: a /a*b{0,4}\w/ aaabbbb 0: aaabbbb aaaa 0: aaaa a 0: a /a*b{0,}\w/ aaabbbb 0: aaabbbb aaaa 0: aaaa a 0: a /a*\d*\w/ 0a 0: 0a a 0: a /a*b *\w/x a 0: a /a*b#comment *\w/x a 0: a /a* b *\w/x a 0: a /^\w+=.*(\\\n.*)*/ abc=xyz\\\npqr 0: abc=xyz\ /(?=(\w+))\1:/ abcd: 0: abcd: 1: abcd /^(?=(\w+))\1:/ abcd: 0: abcd: 1: abcd #/^\Eabc/ # abc # 0: abc #/^[\Eabc]/ # a # 0: a #\= Expect no match # E #No match #/^[a-\Ec]/ # b # 0: b #\= Expect no match # - #No match # E #No match #/^[a\E\E-\Ec]/ # b # 0: b #\= Expect no match # - #No match # E #No match #/^[\E\Qa\E-\Qz\E]+/ # b # 0: b #\= Expect no match # - #No match #/^[a\Q]bc\E]/ # a # 0: a # ] # 0: ] # c # 0: c #/^[a-\Q\E]/ # a # 0: a # - # 0: - /^(a()*)*/ aaaa 0: aaaa 1: a 2: /^(?:a(?:(?:))*)*/ aaaa 0: aaaa /^(a()+)+/ aaaa 0: aaaa 1: a 2: /^(?:a(?:(?:))+)+/ aaaa 0: aaaa /(a){0,3}(?(1)b|(c|))*D/ abbD 0: abbD 1: a ccccD 0: ccccD 1: <unset> 2: D 0: D 1: <unset> 2: # this is really long with debug -- removing for now #/(a|)*\d/ # aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 # 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 # 1: #\= Expect no match # aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa #No match /(?>a|)*\d/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 \= Expect no match aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa No match /(?:a|)*\d/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 \= Expect no match aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa No match /^(?s)(?>.*)(?<!\n)/ abc 0: abc \= Expect no match abc\n No match /^(?![^\n]*\n\z)/ abc 0: \= Expect no match abc\n No match /\z(?<!\n)/ abc 0: \= Expect no match abc\n No match /(.*(.)?)*/ abcd 0: abcd 1: /( (A | (?(1)0|) )* )/x abcd 0: 1: 2: /( ( (?(1)0|) )* )/x abcd 0: 1: 2: /( (?(1)0|)* )/x abcd 0: 1: /[[:abcd:xyz]]/ a] 0: a] :] 0: :] /[abc[:x\]pqr]/ a 0: a [ 0: [ : 0: : ] 0: ] p 0: p /.*[op][xyz]/ \= Expect no match fooabcfoo No match /(?(?=.*b)b|^)/ adc 0: abc 0: b /(?(?=^.*b)b|^)/ adc 0: \= Expect no match abc No match /(?(?=.*b)b|^)*/ adc 0: abc 0: /(?(?=.*b)b|^)+/ adc 0: abc 0: b /(?(?=b).*b|^d)/ abc 0: b /(?(?=.*b).*b|^d)/ abc 0: ab /^%((?(?=[a])[^%])|b)*%$/ %ab% 0: %ab% 1: /(?i)a(?-i)b|c/ XabX 0: ab XAbX 0: Ab CcC 0: c \= Expect no match XABX No match /[\x00-\xff\s]+/ \x0a\x0b\x0c\x0d 0: \x0a\x0b\x0c\x0d /(abc)\1/i \= Expect no match abc No match /(abc)\1/ \= Expect no match abc No match /[^a]*/i 12abc 0: 12 12ABC 0: 12 #Posses /[^a]*/i 12abc 0: 12 12ABC 0: 12 /[^a]*?X/i \= Expect no match 12abc No match 12ABC No match /[^a]+?X/i \= Expect no match 12abc No match 12ABC No match /[^a]?X/i 12aXbcX 0: X 12AXBCX 0: X BCX 0: CX /[^a]??X/i 12aXbcX 0: X 12AXBCX 0: X BCX 0: CX /[^a]{2,3}/i abcdef 0: bcd ABCDEF 0: BCD /[^a]{2,3}?/i abcdef 0: bc ABCDEF 0: BC /((a|)+)+Z/ Z 0: Z 1: 2: /(a)b|(a)c/ ac 0: ac 1: <unset> 2: a /(?>(a))b|(a)c/ ac 0: ac 1: <unset> 2: a /(?=(a))ab|(a)c/ ac 0: ac 1: <unset> 2: a /((?>(a))b|(a)c)/ ac 0: ac 1: ac 2: <unset> 3: a /(?=(?>(a))b|(a)c)(..)/ ac 0: ac 1: <unset> 2: a 3: ac /(?>(?>(a))b|(a)c)/ ac 0: ac 1: <unset> 2: a /((?>(a+)b)+(aabab))/ aaaabaaabaabab 0: aaaabaaabaabab 1: aaaabaaabaabab 2: aaa 3: aabab /(?>a+|ab)+?c/ \= Expect no match aabc No match /(?>a+|ab)+c/ \= Expect no match aabc No match /(?:a+|ab)+c/ aabc 0: aabc /^(?:a|ab)+c/ aaaabc 0: aaaabc /(?=abc){0}xyz/ xyz 0: xyz /(?=abc){1}xyz/ \= Expect no match xyz No match /(?=(a))?./ ab 0: a 1: a bc 0: b /(?=(a))??./ ab 0: a bc 0: b /^(?!a){0}\w+/ aaaaa 0: aaaaa /(?<=(abc))?xyz/ abcxyz 0: xyz 1: abc pqrxyz 0: xyz /^[g<a>]+/ ggg<<<aaa>>> 0: ggg<<<aaa>>> \= Expect no match \\ga No match /^[ga]+/ gggagagaxyz 0: gggagaga /[:a]xxx[b:]/ :xxx: 0: :xxx: /(?<=a{2})b/i xaabc 0: b \= Expect no match xabc No match /(?<!a{2})b/i xabc 0: b \= Expect no match xaabc No match /(?<=[^a]{2})b/ axxbc 0: b aAAbc 0: b \= Expect no match xaabc No match /(?<=[^a]{2})b/i axxbc 0: b \= Expect no match aAAbc No match xaabc No match #/(?|(abc)|(xyz))\1/ # abcabc # 0: abcabc # 1: abc # xyzxyz # 0: xyzxyz # 1: xyz #\= Expect no match # abcxyz #No match # xyzabc #No match #/(?|(abc)|(xyz))(?1)/ # abcabc # 0: abcabc # 1: abc # xyzabc # 0: xyzabc # 1: xyz #\= Expect no match # xyzxyz #No match #/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/ # XYabcdY # 0: XYabcdY # 1: a # 2: b # 3: c # 4: d # 5: Y #/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/ # XYabcdY # 0: XYabcdY # 1: a # 2: b # 3: <unset> # 4: <unset> # 5: c # 6: d # 7: Y #/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/ # XYabcdY # 0: XYabcdY # 1: a # 2: b # 3: <unset> # 4: <unset> # 5: c # 6: d # 7: Y /(?'abc'\w+):\k<abc>{2}/ a:aaxyz 0: a:aa 1: a ab:ababxyz 0: ab:abab 1: ab \= Expect no match a:axyz No match ab:abxyz No match /^(?<ab>a)? (?(ab)b|c) (?(ab)d|e)/x abd 0: abd 1: a ce 0: ce # .NET has more consistent grouping numbers with these dupe groups for the two options /(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?(quote)[a-z]+|[0-9]+)/x,dupnames a\"aaaaa 0: a"aaaaa 1: " 2: <unset> 3: " b\"aaaaa 0: b"aaaaa 1: " 2: <unset> 3: " \= Expect no match b\"11111 No match #/(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/ # 0 # 0: 0 # 1: 0 # 00 # 0: 00 # 1: 00 # 2: 0 # 0000 # 0: 0000 # 1: 0000 # 2: 0 #/(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/ # 0 # 0: 0 # 1: 0 # 2: 0 # 00 # 0: 0 # 1: 0 # 2: 0 # 0000 # 0: 0 # 1: 0 # 2: 0 # Check the use of names for failure # Check opening parens in comment when seeking forward reference. #/(?P<abn>(?P=abn)xxx|)+/ # xxx # 0: # 1: #Posses /^(a)?(\w)/ aaaaX 0: aa 1: a 2: a YZ 0: Y 1: <unset> 2: Y #Posses /^(?:a)?(\w)/ aaaaX 0: aa 1: a YZ 0: Y 1: Y /\A.*?(a|bc)/ ba 0: ba 1: a /\A.*?(?:a|bc|d)/ ba 0: ba # -------------------------- /(another)?(\1?)test/ hello world test 0: test 1: <unset> 2: /(another)?(\1+)test/ \= Expect no match hello world test No match /((?:a?)*)*c/ aac 0: aac 1: /((?>a?)*)*c/ aac 0: aac 1: /(?>.*?a)(?<=ba)/ aba 0: ba /(?:.*?a)(?<=ba)/ aba 0: aba /(?>.*?a)b/s aab 0: ab /(?>.*?a)b/ aab 0: ab /(?>^a)b/s \= Expect no match aab No match /(?>.*?)(?<=(abcd)|(wxyz))/ alphabetabcd 0: 1: abcd endingwxyz 0: 1: <unset> 2: wxyz /(?>.*)(?<=(abcd)|(wxyz))/ alphabetabcd 0: alphabetabcd 1: abcd endingwxyz 0: endingwxyz 1: <unset> 2: wxyz "(?>.*)foo" \= Expect no match abcdfooxyz No match "(?>.*?)foo" abcdfooxyz 0: foo # 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. /a(?=bc).|abd/ abd 0: abd abc 0: ab /a(?>bc)d|abd/ abceabd 0: abd # These tests were formerly in test 2, but changes in PCRE and Perl have # made them compatible. /^(a)?(?(1)a|b)+$/ \= Expect no match a No match # ---- /^\d*\w{4}/ 1234 0: 1234 \= Expect no match 123 No match /^[^b]*\w{4}/ aaaa 0: aaaa \= Expect no match aaa No match /^[^b]*\w{4}/i aaaa 0: aaaa \= Expect no match aaa No match /^a*\w{4}/ aaaa 0: aaaa \= Expect no match aaa No match /^a*\w{4}/i aaaa 0: aaaa \= Expect no match aaa No match /(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames foofoo 0: foofoo 1: foo barbar 0: barbar 1: bar # A notable difference between PCRE and .NET. According to # the PCRE docs: # If you make a subroutine call to a non-unique named # subpattern, the one that corresponds to the first # occurrence of the name is used. In the absence of # duplicate numbers (see the previous section) this is # the one with the lowest number. # .NET takes the most recently captured number according to MSDN: # A backreference refers to the most recent definition of # a group (the definition most immediately to the left, # when matching left to right). When a group makes multiple # captures, a backreference refers to the most recent capture. #/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames # AfooA # 0: AfooA # 1: A # 2: foo # AbarA # 0: AbarA # 1: A # 2: <unset> # 3: bar #\= Expect no match # Afoofoo #No match # Abarbar #No match /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ 1 IN SOA non-sp1 non-sp2( 0: 1 IN SOA non-sp1 non-sp2( 1: 1 2: non-sp1 3: non-sp2 # TODO: .NET's group number ordering here in the second example is a bit odd /^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?(A)x) (?(B)y)$/x,dupnames Ax 0: Ax 1: A BAxy 0: BAxy 1: A 2: B / ^ a + b $ /x aaaab 0: aaaab / ^ a + #comment b $ /x aaaab 0: aaaab / ^ a + #comment #comment b $ /x aaaab 0: aaaab / ^ (?> a + ) b $ /x aaaab 0: aaaab / ^ ( a + ) + \w $ /x aaaab 0: aaaab 1: aaaa /(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/ \= Expect no match acb No match #Posses #/\A(?:[^\"]+|\"(?:[^\"]*|\"\")*\")+/ # NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED # 0: NON QUOTED "QUOT""ED" AFTER #Posses #/\A(?:[^\"]+|\"(?:[^\"]+|\"\")*\")+/ # NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED # 0: NON QUOTED "QUOT""ED" AFTER #Posses #/\A(?:[^\"]+|\"(?:[^\"]+|\"\")+\")+/ # NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED # 0: NON QUOTED "QUOT""ED" AFTER #Posses #/\A([^\"1]+|[\"2]([^\"3]*|[\"4][\"5])*[\"6])+/ # NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED # 0: NON QUOTED "QUOT""ED" AFTER # 1: AFTER # 2: /^\w+(?>\s*)(?<=\w)/ test test 0: tes #/(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/ # acl # 0: acl # 1: a # bdl # 0: bdl # 1: <unset> # 2: b # adl # 0: dl # bcl # 0: l /\sabc/ \x0babc 0: \x0babc #/[\Qa]\E]+/ # aa]] # 0: aa]] #/[\Q]a\E]+/ # aa]] # 0: aa]] /A((((((((a))))))))\8B/ AaaB 0: AaaB 1: a 2: a 3: a 4: a 5: a 6: a 7: a 8: a /A(((((((((a)))))))))\9B/ AaaB 0: AaaB 1: a 2: a 3: a 4: a 5: a 6: a 7: a 8: a 9: a /(|ab)*?d/ abd 0: abd 1: ab xyd 0: d /(\2|a)(\1)/ aaa 0: aa 1: a 2: a /(\2)(\1)/ "Z*(|d*){216}" /((((((((((((x))))))))))))\12/ xx 0: xx 1: x 2: x 3: x 4: x 5: x 6: x 7: x 8: x 9: x 10: x 11: x 12: x #"(?|(\k'Pm')|(?'Pm'))" # abcd # 0: # 1: #/(?|(aaa)|(b))\g{1}/ # aaaaaa # 0: aaaaaa # 1: aaa # bb # 0: bb # 1: b #/(?|(aaa)|(b))(?1)/ # aaaaaa # 0: aaaaaa # 1: aaa # baaa # 0: baaa # 1: b #\= Expect no match # bb #No match #/(?|(aaa)|(b))/ # xaaa # 0: aaa # 1: aaa # xbc # 0: b # 1: b #/(?|(?'a'aaa)|(?'a'b))\k'a'/ # aaaaaa # 0: aaaaaa # 1: aaa # bb # 0: bb # 1: b #/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames # aaaccccaaa # 0: aaaccccaaa # 1: aaa # 2: cccc # bccccb # 0: bccccb # 1: b # 2: cccc # End of testinput1