/(?<!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 *** Failers Ab 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 /^(?(?=abc)\w{3}:|\d\d)$/ abc: 12 *** Failers 123 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 case of aaaaaa is missed out below because I think Perl 5.005_02 gets/ /it wrong; it sets $1 to aaa rather than aa. Compare the following test,/ /where it does set $1 to aa when matching aaaaaa./ /^(a\1?){4}$/ a aa aaa aaaa 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))/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?)*$/ *** Failers dbcb a-- /((?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 /(?(1)a|b)/ /(?(1)b|a)/ a /(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 / End of test input /