| OLD | NEW |
| (Empty) |
| 1 description("This page tests handling of parentheses subexpressions."); | |
| 2 | |
| 3 var regexp1 = /(a|A)(b|B)/; | |
| 4 shouldBe("regexp1.exec('abc')", "['ab','a','b']"); | |
| 5 | |
| 6 var regexp2 = /(a((b)|c|d))e/; | |
| 7 shouldBe("regexp2.exec('abacadabe')", "['abe','ab','b','b']"); | |
| 8 | |
| 9 var regexp3 = /(a(b|(c)|d))e/; | |
| 10 shouldBe("regexp3.exec('abacadabe')", "['abe','ab','b',undefined]"); | |
| 11 | |
| 12 var regexp4 = /(a(b|c|(d)))e/; | |
| 13 shouldBe("regexp4.exec('abacadabe')", "['abe','ab','b',undefined]"); | |
| 14 | |
| 15 var regexp5 = /(a((b)|(c)|(d)))e/; | |
| 16 shouldBe("regexp5.exec('abacadabe')", "['abe','ab','b','b',undefined,undefined]"
); | |
| 17 | |
| 18 var regexp6 = /(a((b)|(c)|(d)))/; | |
| 19 shouldBe("regexp6.exec('abcde')", "['ab','ab','b','b',undefined,undefined]"); | |
| 20 | |
| 21 var regexp7 = /(a(b)??)??c/; | |
| 22 shouldBe("regexp7.exec('abc')", "['abc','ab','b']"); | |
| 23 | |
| 24 var regexp8 = /(a|(e|q))(x|y)/; | |
| 25 shouldBe("regexp8.exec('bcaddxqy')" , "['qy','q','q','y']"); | |
| 26 | |
| 27 var regexp9 = /((t|b)?|a)$/; | |
| 28 shouldBe("regexp9.exec('asdfjejgsdflaksdfjkeljghkjea')", "['a','a',undefined]"); | |
| 29 | |
| 30 var regexp10 = /(?:h|e?(?:t|b)?|a?(?:t|b)?)(?:$)/; | |
| 31 shouldBe("regexp10.exec('asdfjejgsdflaksdfjkeljghat')", "['at']"); | |
| 32 | |
| 33 var regexp11 = /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/; | |
| 34 shouldBeNull("regexp11.exec('Developing with JavaScript is dangerous, do not try
it without assistance')"); | |
| 35 | |
| 36 var regexp12 = /(?:(.+), )?(.+), (..) to (?:(.+), )?(.+), (..)/; | |
| 37 shouldBe("regexp12.exec('Seattle, WA to Buckley, WA')", "['Seattle, WA to Buckle
y, WA', undefined, 'Seattle', 'WA', undefined, 'Buckley', 'WA']"); | |
| 38 | |
| 39 var regexp13 = /(A)?(A.*)/; | |
| 40 shouldBe("regexp13.exec('zxcasd;fl\ ^AaaAAaaaf;lrlrzs')", "['AaaAAaaaf;lrlrzs',u
ndefined,'AaaAAaaaf;lrlrzs']"); | |
| 41 | |
| 42 var regexp14 = /(a)|(b)/; | |
| 43 shouldBe("regexp14.exec('b')", "['b',undefined,'b']"); | |
| 44 | |
| 45 var regexp15 = /^(?!(ab)de|x)(abd)(f)/; | |
| 46 shouldBe("regexp15.exec('abdf')", "['abdf',undefined,'abd','f']"); | |
| 47 | |
| 48 var regexp16 = /(a|A)(b|B)/; | |
| 49 shouldBe("regexp16.exec('abc')", "['ab','a','b']"); | |
| 50 | |
| 51 var regexp17 = /(a|d|q|)x/i; | |
| 52 shouldBe("regexp17.exec('bcaDxqy')", "['Dx','D']"); | |
| 53 | |
| 54 var regexp18 = /^.*?(:|$)/; | |
| 55 shouldBe("regexp18.exec('Hello: World')", "['Hello:',':']"); | |
| 56 | |
| 57 var regexp19 = /(ab|^.{0,2})bar/; | |
| 58 shouldBe("regexp19.exec('barrel')", "['bar','']"); | |
| 59 | |
| 60 var regexp20 = /(?:(?!foo)...|^.{0,2})bar(.*)/; | |
| 61 shouldBe("regexp20.exec('barrel')", "['barrel','rel']"); | |
| 62 shouldBe("regexp20.exec('2barrel')", "['2barrel','rel']"); | |
| 63 | |
| 64 var regexp21 = /([a-g](b|B)|xyz)/; | |
| 65 shouldBe("regexp21.exec('abc')", "['ab','ab','b']"); | |
| 66 | |
| 67 var regexp22 = /(?:^|;)\s*abc=([^;]*)/; | |
| 68 shouldBeNull("regexp22.exec('abcdlskfgjdslkfg')"); | |
| 69 | |
| 70 var regexp23 = /"[^<"]*"|'[^<']*'/; | |
| 71 shouldBe("regexp23.exec('<html xmlns=\"http://www.w3.org/1999/xhtml\"')", "['\"h
ttp://www.w3.org/1999/xhtml\"']"); | |
| 72 | |
| 73 var regexp24 = /^(?:(?=abc)\w{3}:|\d\d)$/; | |
| 74 shouldBeNull("regexp24.exec('123')"); | |
| 75 | |
| 76 var regexp25 = /^\s*(\*|[\w\-]+)(\b|$)?/; | |
| 77 shouldBe("regexp25.exec('this is a test')", "['this','this',undefined]"); | |
| 78 shouldBeNull("regexp25.exec('!this is a test')"); | |
| 79 | |
| 80 var regexp26 = /a(b)(a*)|aaa/; | |
| 81 shouldBe("regexp26.exec('aaa')", "['aaa',undefined,undefined]"); | |
| 82 | |
| 83 var regexp27 = new RegExp( | |
| 84 "^" + | |
| 85 "(?:" + | |
| 86 "([^:/?#]+):" + /* scheme */ | |
| 87 ")?" + | |
| 88 "(?:" + | |
| 89 "(//)" + /* authorityRoot */ | |
| 90 "(" + /* authority */ | |
| 91 "(?:" + | |
| 92 "(" + /* userInfo */ | |
| 93 "([^:@]*)" + /* user */ | |
| 94 ":?" + | |
| 95 "([^:@]*)" + /* password */ | |
| 96 ")?" + | |
| 97 "@" + | |
| 98 ")?" + | |
| 99 "([^:/?#]*)" + /* domain */ | |
| 100 "(?::(\\d*))?" + /* port */ | |
| 101 ")" + | |
| 102 ")?" + | |
| 103 "([^?#]*)" + /*path*/ | |
| 104 "(?:\\?([^#]*))?" + /* queryString */ | |
| 105 "(?:#(.*))?" /*fragment */ | |
| 106 ); | |
| 107 shouldBe("regexp27.exec('file:///Users/Someone/Desktop/HelloWorld/index.html')",
"['file:///Users/Someone/Desktop/HelloWorld/index.html','file','//','',undefine
d,undefined,undefined,'',undefined,'/Users/Someone/Desktop/HelloWorld/index.html
',undefined,undefined]"); | |
| 108 | |
| 109 var regexp28 = new RegExp( | |
| 110 "^" + | |
| 111 "(?:" + | |
| 112 "([^:/?#]+):" + /* scheme */ | |
| 113 ")?" + | |
| 114 "(?:" + | |
| 115 "(//)" + /* authorityRoot */ | |
| 116 "(" + /* authority */ | |
| 117 "(" + /* userInfo */ | |
| 118 "([^:@]*)" + /* user */ | |
| 119 ":?" + | |
| 120 "([^:@]*)" + /* password */ | |
| 121 ")?" + | |
| 122 "@" + | |
| 123 ")" + | |
| 124 ")?" | |
| 125 ); | |
| 126 shouldBe("regexp28.exec('file:///Users/Someone/Desktop/HelloWorld/index.html')",
"['file:','file',undefined,undefined,undefined,undefined,undefined]"); | |
| 127 | |
| 128 var regexp29 = /^\s*((\[[^\]]+\])|(u?)("[^"]+"))\s*/; | |
| 129 shouldBeNull("regexp29.exec('Committer:')"); | |
| 130 | |
| 131 var regexp30 = /^\s*((\[[^\]]+\])|m(u?)("[^"]+"))\s*/; | |
| 132 shouldBeNull("regexp30.exec('Committer:')"); | |
| 133 | |
| 134 var regexp31 = /^\s*(m(\[[^\]]+\])|m(u?)("[^"]+"))\s*/; | |
| 135 shouldBeNull("regexp31.exec('Committer:')"); | |
| 136 | |
| 137 var regexp32 = /\s*(m(\[[^\]]+\])|m(u?)("[^"]+"))\s*/; | |
| 138 shouldBeNull("regexp32.exec('Committer:')"); | |
| 139 | |
| 140 var regexp33 = RegExp('^(?:(?:(a)(xyz|[^>"\'\s]*)?)|(/?>)|.[^\w\s>]*)'); | |
| 141 shouldBe("regexp33.exec('> <head>')","['>',undefined,undefined,'>']"); | |
| 142 | |
| 143 var regexp34 = /(?:^|\b)btn-\S+/; | |
| 144 shouldBeNull("regexp34.exec('xyz123')"); | |
| 145 shouldBe("regexp34.exec('btn-abc')","['btn-abc']"); | |
| 146 shouldBeNull("regexp34.exec('btn- abc')"); | |
| 147 shouldBeNull("regexp34.exec('XXbtn-abc')"); | |
| 148 shouldBe("regexp34.exec('XX btn-abc')","['btn-abc']"); | |
| 149 | |
| 150 var regexp35 = /^((a|b)(x|xxx)|)$/; | |
| 151 shouldBe("regexp35.exec('ax')", "['ax','ax','a','x']"); | |
| 152 shouldBeNull("regexp35.exec('axx')"); | |
| 153 shouldBe("regexp35.exec('axxx')", "['axxx','axxx','a','xxx']"); | |
| 154 shouldBe("regexp35.exec('bx')", "['bx','bx','b','x']"); | |
| 155 shouldBeNull("regexp35.exec('bxx')"); | |
| 156 shouldBe("regexp35.exec('bxxx')", "['bxxx','bxxx','b','xxx']"); | |
| 157 | |
| 158 var regexp36 = /^((\/|\.|\-)(\d\d|\d\d\d\d)|)$/; | |
| 159 shouldBe("regexp36.exec('/2011')", "['/2011','/2011','/','2011']"); | |
| 160 shouldBe("regexp36.exec('/11')", "['/11','/11','/','11']"); | |
| 161 shouldBeNull("regexp36.exec('/123')"); | |
| 162 | |
| 163 var regexp37 = /^([1][0-2]|[0]\d|\d)(\/|\.|\-)([0-2]\d|[3][0-1]|\d)((\/|\.|\-)(\
d\d|\d\d\d\d)|)$/; | |
| 164 shouldBe("regexp37.exec('7/4/1776')", "['7/4/1776','7','/','4','/1776','/','1776
']"); | |
| 165 shouldBe("regexp37.exec('07-04-1776')", "['07-04-1776','07','-','04','-1776','-'
,'1776']"); | |
| 166 | |
| 167 var regexp38 = /^(z|(x|xx)|b|)$/; | |
| 168 shouldBe("regexp38.exec('xx')", "['xx','xx','xx']"); | |
| 169 shouldBe("regexp38.exec('b')", "['b','b',undefined]"); | |
| 170 shouldBe("regexp38.exec('z')", "['z','z',undefined]"); | |
| 171 shouldBe("regexp38.exec('')", "['','',undefined]"); | |
| 172 | |
| 173 var regexp39 = /(8|((?=P)))?/; | |
| 174 shouldBe("regexp39.exec('')", "['',undefined,undefined]"); | |
| 175 shouldBe("regexp39.exec('8')", "['8','8',undefined]"); | |
| 176 shouldBe("regexp39.exec('zP')", "['',undefined,undefined]"); | |
| 177 | |
| 178 var regexp40 = /((8)|((?=P){4}))?()/; | |
| 179 shouldBe("regexp40.exec('')", "['',undefined,undefined,undefined,'']"); | |
| 180 shouldBe("regexp40.exec('8')", "['8','8','8',undefined,'']"); | |
| 181 shouldBe("regexp40.exec('zPz')", "['',undefined,undefined,undefined,'']"); | |
| 182 shouldBe("regexp40.exec('zPPz')", "['',undefined,undefined,undefined,'']"); | |
| 183 shouldBe("regexp40.exec('zPPPz')", "['',undefined,undefined,undefined,'']"); | |
| 184 shouldBe("regexp40.exec('zPPPPz')", "['',undefined,undefined,undefined,'']"); | |
| 185 | |
| 186 var regexp41 = /(([\w\-]+:\/\/?|www[.])[^\s()<>]+(?:([\w\d]+)|([^\[:punct:\]\s()
<>\W]|\/)))/; | |
| 187 shouldBe("regexp41.exec('Here is a link: http://www.acme.com/our_products/index.
html. That is all we want!')", "['http://www.acme.com/our_products/index.html','
http://www.acme.com/our_products/index.html','http://','l',undefined]"); | |
| 188 | |
| 189 var regexp42 = /((?:(4)?))?/; | |
| 190 shouldBe("regexp42.exec('')", "['',undefined,undefined]"); | |
| 191 shouldBe("regexp42.exec('4')", "['4','4','4']"); | |
| 192 shouldBe("regexp42.exec('4321')", "['4','4','4']"); | |
| 193 | |
| 194 shouldBeTrue("/(?!(?=r{0}){2,})|((z)?)?/gi.test('')"); | |
| 195 | |
| 196 var regexp43 = /(?!(?:\1+s))/; | |
| 197 shouldBe("regexp43.exec('SSS')", "['']"); | |
| 198 | |
| 199 var regexp44 = /(?!(?:\3+(s+?)))/g; | |
| 200 shouldBe("regexp44.exec('SSS')", "['',undefined]"); | |
| 201 | |
| 202 var regexp45 = /((?!(?:|)v{2,}|))/; | |
| 203 shouldBeNull("regexp45.exec('vt')"); | |
| 204 | |
| 205 var regexp46 = /(w)(?:5{3}|())|pk/; | |
| 206 shouldBeNull("regexp46.exec('5')"); | |
| 207 shouldBe("regexp46.exec('pk')", "['pk',undefined,undefined]"); | |
| 208 shouldBe("regexp46.exec('Xw555')", "['w555','w',undefined]"); | |
| 209 shouldBe("regexp46.exec('Xw55pk5')", "['w','w','']"); | |
| 210 | |
| 211 var regexp47 = /(.*?)(?:(?:\?(.*?)?)?)(?:(?:#)?)$/; | |
| 212 shouldBe("regexp47.exec('/www.acme.com/this/is/a/path/file.txt')", "['/www.acme.
com/this/is/a/path/file.txt','/www.acme.com/this/is/a/path/file.txt',undefined]"
); | |
| 213 | |
| 214 var regexp48 = /^(?:(\w+):\/*([\w\.\-\d]+)(?::(\d+)|)(?=(?:\/|$))|)(?:$|\/?(.*?)
(?:\?(.*?)?|)(?:#(.*)|)$)/; | |
| 215 /* The regexp on the prior line confuses Xcode syntax highlighting, this coment
fixes it! */ | |
| 216 shouldBe("regexp48.exec('http://www.acme.com/this/is/a/path/file.txt')", "['http
://www.acme.com/this/is/a/path/file.txt','http','www.acme.com',undefined,'this/i
s/a/path/file.txt',undefined,undefined]"); | |
| 217 | |
| 218 var regexp49 = /(?:([^:]*?)(?:(?:\?(.*?)?)?)(?:(?:#)?)$)|(?:^(?:(\w+):\/*([\w\.\
-\d]+)(?::(\d+)|)(?=(?:\/|$))|)(?:$|\/?(.*?)(?:\?(.*?)?|)(?:#(.*)|)$))/; | |
| 219 /* The regexp on the prior line confuses Xcode syntax highlighting, this coment
fixes it! */ | |
| 220 shouldBe("regexp49.exec('http://www.acme.com/this/is/a/path/file.txt')", "['http
://www.acme.com/this/is/a/path/file.txt',undefined,undefined,'http','www.acme.co
m',undefined,'this/is/a/path/file.txt',undefined,undefined]"); | |
| 221 | |
| 222 var regexp50 = /((a)b{28,}c|d)x/; | |
| 223 shouldBeNull("regexp50.exec('((a)b{28,}c|d)x')"); | |
| 224 shouldBe("regexp50.exec('abbbbbbbbbbbbbbbbbbbbbbbbbbbbcx')", "['abbbbbbbbbbbbbbb
bbbbbbbbbbbbbcx', 'abbbbbbbbbbbbbbbbbbbbbbbbbbbbc', 'a']"); | |
| 225 shouldBe("regexp50.exec('dx')", "['dx', 'd', undefined]"); | |
| 226 | |
| 227 var s = "((.\s{-}).{28,}\P{Yi}?{,30}\|.)\x9e{-,}\P{Any}"; | |
| 228 var regexp51 = new RegExp(s); | |
| 229 shouldBeNull("regexp51.exec('abc')"); | |
| 230 shouldBe("regexp51.exec(s)", "[')\x9e{-,}P{Any}',')',undefined]"); | |
| 231 | |
| 232 var regexp52 = /(Rob)|(Bob)|(Robert)|(Bobby)/; | |
| 233 shouldBe("'Hi Bob'.match(regexp52)", "['Bob',undefined,'Bob',undefined,undefined
]"); | |
| 234 | |
| 235 // Test cases discovered by fuzzing that crashed the compiler. | |
| 236 var regexp53 = /(?=(?:(?:(gB)|(?!cs|<))((?=(?!v6){0,})))|(?=#)+?)/m; | |
| 237 shouldBe("regexp53.exec('#')", "['',undefined,'']"); | |
| 238 var regexp54 = /((?:(?:()|(?!))((?=(?!))))|())/m; | |
| 239 shouldBe("regexp54.exec('#')", "['','',undefined,undefined,'']"); | |
| 240 var regexp55 = /(?:(?:(?:a?|(?:))((?:)))|a?)/m; | |
| 241 shouldBe("regexp55.exec('#')", "['','']"); | |
| 242 | |
| 243 // Test evaluation order of empty subpattern alternatives. | |
| 244 var regexp56 = /(|a)/; | |
| 245 shouldBe("regexp56.exec('a')", "['','']"); | |
| 246 var regexp57 = /(a|)/; | |
| 247 shouldBe("regexp57.exec('a')", "['a','a']"); | |
| 248 | |
| 249 // Tests that non-greedy repeat quantified parentheses will backtrack through mu
ltiple frames of subpattern matches. | |
| 250 var regexp58 = /a|b(?:[^b])*?c/; | |
| 251 shouldBe("regexp58.exec('badbc')", "['a']"); | |
| 252 var regexp59 = /(X(?:.(?!X))*?Y)|(Y(?:.(?!Y))*?Z)/g; | |
| 253 shouldBe("'Y aaa X Match1 Y aaa Y Match2 Z'.match(regexp59)", "['X Match1 Y','Y
Match2 Z']"); | |
| 254 | |
| OLD | NEW |