• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/*
17 * @tc.name:regexp
18 * @tc.desc:test Regexp
19 * @tc.type: FUNC
20 * @tc.require: issueI5NO8G
21 */
22
23{
24  let reg= /ab|cd||/
25  assert_equal(JSON.stringify(reg.exec("cd")),'["cd"]')
26}
27{
28  let reg= /ab||/
29  assert_equal(JSON.stringify(reg.exec("cd")),'[""]')
30}
31{
32  let reg= /ab|cd|ef/
33  assert_equal(JSON.stringify(reg.exec("cd")),'["cd"]')
34}
35
36{
37  let str = "��";
38  let regexp = /[��]/;
39  assert_equal(JSON.stringify(str.replace(regexp,"b")),JSON.stringify("b\ude00"));
40}
41{
42  let str = "��";
43  let regexp = /[��]/g;
44  assert_equal(JSON.stringify(str.replace(regexp,"b")),JSON.stringify("bb"));
45}
46{
47  let str = "��";
48  let regexp = /[��]/u;
49  assert_equal(JSON.stringify(str.replace(regexp,"b")),JSON.stringify("b"));
50}
51{
52  let str = "��";
53  let regexp = /[\��]/;
54  assert_equal(JSON.stringify(str.replace(regexp,"b")),JSON.stringify("b\ude00"));
55}
56
57
58var reg = /[\x5d-\x7e]/i;
59var result = reg.test("a");
60assert_equal(result,true);
61
62var reg1 = new RegExp("^[-+]?([0-9]+)?(\\٫[0-9]{1,})?$");
63var result1 = reg1.test('0٫0000000000001');
64assert_equal(result1,true);
65
66var reg2 = /^[Α-ώ]+$/i
67assert_equal(reg2.test('άέήίΰϊϋόύώ'),true);
68
69assert_equal(reg2.test('ΆΈΉΊΪΫΎΏ'),true);
70
71assert_equal(reg2.test('αβγδεζηθικλμνξοπρςστυφχψω'),true);
72
73assert_equal(reg2.test('ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'),true);
74
75let reg3 =/^[A-Z0-9_\-]*$/i
76assert_equal(reg3.test(''),true)
77
78let reg4 =   new RegExp("^(?<urlStrIndex>.*?)(?<urlStr>https?[::]//[^/]+/svn(?:/[a-z0-9.,;?'*:+&%$#=~_ \\u4E00-\\u9FA5-]*)*).*$", "i")
79assert_equal(reg4.test('a'),false);
80
81let reg5 =   new RegExp("^(?<urlStrIndex>.*?)(?<urlStr>(?:(?:ht|f)tps?[::]//)?(?:[a-z0-9-]+\\.)+" + "(?:com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|cn|cc|tw|de|au|sg|hk|ei|fr|me|im)(?![a-z])" + "(?:\\:[0-9][0-9]*)?(?:\\.?/[a-z0-9.,;?'\\|*:\\\\+&%$#=~_-]*)*).*$", "i")
82assert_equal(reg5.test('a'),false);
83
84let reg6 =   new RegExp("^(?<urlStrIndex>.*?)(?<urlStr>(?:ht|f)tps?[::]//(?:[a-z0-9-]+\\.)*[a-z0-9-]+(?:/[a-z0-9]+)*[/a-z0-9.,;?'\\|*:\\\\+&%$#=~_-]*).*$", "i")
85assert_equal(reg6.test('a'),false);
86
87let reg7 =   new RegExp("^(?<urlStrIndex>.*?)(?<urlStr>(?:https?[::]//)?(?:[a-z0-9-\\\\]+\\.)+" + "(?:com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|cn|cc|tw|de|au|sg|hk|ei|fr|me|im)(?![a-z])" + "(?:\\:\\d{4})?(?:/[a-z0-9.,;?'\\|*:\\\\+&%$#=~_-]*)*\\?(?:[a-z0-9]*=[a-z0-9.,;?'*:+%$#=~_\\u4E00-\\u9FA5-]*&?)*).*$", "i")
88assert_equal(reg7.test('a'),false);
89
90let arr = []
91let temp = true
92var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;
93arr.push(quotedEmailUserUtf8.test(" foo m端ller "))
94
95let reg8 = /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i
96arr.push(reg8.test('palíndromo'))
97arr.push(reg8.test('órgão'))
98arr.push(reg8.test('qwértyúão'))
99arr.push(reg8.test('àäãcëüïÄÏÜ'))
100
101let reg9 = /^[A-ZÀÉÈÌÎÓÒÙ]+$/i
102arr.push(reg9.test('àéèìîóòù'))
103arr.push(reg9.test('metró'))
104arr.push(reg9.test('pèsca'))
105arr.push(reg9.test('genî'))
106
107let reg10 = /^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i
108arr.push(reg10.test('thiến'))
109arr.push(reg10.test('nghiêng'))
110arr.push(reg10.test('chào'))
111arr.push(reg10.test('thế'))
112arr.push(reg10.test('giới'))
113
114let reg11 = /^[A-ZÅÄÖ]+$/i
115arr.push(reg11.test('äiti'))
116
117let reg12 = /^[A-ZÆØÅ]+$/i
118arr.push(reg12.test('aøå'))
119
120let reg13 = /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i
121arr.push(reg13.test('kreską'))
122arr.push(reg13.test('zamknięte'))
123arr.push(reg13.test('zwykłe'))
124arr.push(reg13.test('kropką'))
125arr.push(reg13.test('przyjęły'))
126arr.push(reg13.test('święty'))
127arr.push(reg13.test('Pozwól'))
128
129let reg14 = /^[А-ЯЂЈЉЊЋЏ]+$/i
130arr.push(reg14.test('ШћжЂљЕ'))
131
132let reg15 = /^[A-ZČĆŽŠĐ]+$/i
133arr.push(reg15.test('ŠAabčšđćž'))
134arr.push(reg15.test('ŠATROĆčđš'))
135
136let reg16 = /^[A-ZÁÉÍÑÓÚÜ]+$/i
137arr.push(reg16.test('ábcó'))
138arr.push(reg16.test('dormís'))
139arr.push(reg16.test('volvés'))
140arr.push(reg16.test('español'))
141
142let reg17 = /^[A-ZÅÄÖ]+$/i
143arr.push(reg17.test('religiös'))
144arr.push(reg17.test('stjäla'))
145arr.push(reg17.test('västgöte'))
146
147let reg18 = /^[A-ZÇĞİıÖŞÜ]+$/i
148arr.push(reg18.test('AİıÖöÇ窺ĞğÜüZ'))
149
150let reg19 = /^[Α-ώ]+$/i
151arr.push(reg19.test('άέήίΰϊϋόύώ'))
152arr.push(reg19.test('ΆΈΉΊΪΫΎΏ'))
153
154let reg20 = /^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i
155arr.push(reg20.test('Azərbaycan'))
156arr.push(reg20.test('abcç2'))
157arr.push(reg20.test('3kərə4kərə'))
158
159let reg21 = /^[0-9А-Я]+$/i
160arr.push(reg21.test('абв1'))
161arr.push(reg21.test('жаба'))
162arr.push(reg21.test('яГоДа2'))
163arr.push(reg21.test('йЮя'))
164
165let reg22 = /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i
166arr.push(reg22.test('řiť123'))
167
168let reg23 = /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i
169arr.push(reg23.test('1môj'))
170arr.push(reg23.test('2ľúbím'))
171arr.push(reg23.test('3mäkčeň'))
172arr.push(reg23.test('5vŕba'))
173arr.push(reg23.test('6ňorimberk'))
174arr.push(reg23.test('7ťava'))
175arr.push(reg23.test('8žanéta'))
176arr.push(reg23.test('9Ďábelské'))
177arr.push(reg23.test('10ódy'))
178
179let reg24 = /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i
180arr.push(reg24.test('Kán123'))
181arr.push(reg24.test('één354'))
182
183let reg25 = /^[0-9A-ZÅÄÖ]+$/i
184arr.push(reg25.test('äiti124'))
185arr.push(reg25.test('451åå23'))
186
187let reg26 = /^[0-9A-ZÄÖÜß]+$/i
188arr.push(reg26.test('äbc123'))
189
190let reg27 = /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i
191arr.push(reg27.test('0árvíztűrőtükörfúrógép123'))
192
193let reg28 = /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i
194arr.push(reg28.test('palíndromo'))
195arr.push(reg28.test('2órgão'))
196arr.push(reg28.test('qwértyúão9'))
197arr.push(reg28.test('àäãcë4üïÄÏÜ'))
198
199let reg29 = /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i
200arr.push(reg29.test('123àéèìîóòù'))
201arr.push(reg29.test('met23ró'))
202arr.push(reg29.test('pès56ca'))
203arr.push(reg29.test('gen45î'))
204
205let reg30 = /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i
206arr.push(reg30.test('ábcó123'))
207
208let reg31 = /^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i
209arr.push(reg31.test('Thầy3'))
210arr.push(reg31.test('3Gà'))
211
212let reg32 = /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i
213arr.push(reg32.test('kre123ską'))
214arr.push(reg32.test('zam21knięte'))
215arr.push(reg32.test('zw23ykłe'))
216arr.push(reg32.test('prz23yjęły'))
217arr.push(reg32.test('świ23ęty'))
218arr.push(reg32.test('Poz1322wól'))
219
220let reg33 = /^[0-9А-ЯЂЈЉЊЋЏ]+$/i
221arr.push(reg33.test('ШћжЂљЕ123'))
222
223let reg34 = /^[0-9A-ZČĆŽŠĐ]+$/i
224arr.push(reg34.test('ŠAabčšđćž123'))
225arr.push(reg34.test('ŠATRO11Ćčđš'))
226
227let reg35 = /^[0-9A-ZÅÄÖ]+$/i
228arr.push(reg35.test('religiös13'))
229arr.push(reg35.test('st23jäla'))
230arr.push(reg35.test('västgöte123'))
231
232let reg36 = /^[0-9A-ZÇĞİıÖŞÜ]+$/i
233arr.push(reg36.test('AİıÖöÇ窺ĞğÜüZ123'))
234
235let reg37 = new RegExp("^[-+]?([0-9]+)?(\\٫[0-9]{1,})?$")
236arr.push(reg37.test('0٫0000000000001'))
237
238let reg38 = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\٫[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$")
239arr.push(reg38.test('123٫'))
240arr.push(reg38.test('123٫123'))
241arr.push(reg38.test('-123٫123'))
242
243let reg39 =/^[A-Z0-9_\-]*$/i
244arr.push(reg39.test(''))
245
246let reg40 = RegExp("^(?!-? )(?=.*\\d)(\\¥)?-?(0|[1-9]\\d|[1-9]\\d{0,2}(\\,\\d{3})*)?(\\.(\\d{2}))?$")
247arr.push(reg40.test('¥6,954,231'))
248arr.push(reg40.test('¥-6,954,231'))
249
250var reg41 = /^[A-VXYZÇƏĞİıÖŞÜ]+$/i;
251arr.push(reg41.test('Azərbaycan'))
252arr.push(reg41.test('üöğıəçş'))
253arr.push(reg41.test('sizAzərbaycanlaşdırılmışlardansınızmı'))
254arr.push(reg41.test('dahaBirDüzgünString'))
255arr.push(reg41.test('abcçdeəfgğhxıijkqlmnoöprsştuüvyz'))
256
257let reg42 = /^[А-Я]+$/i
258arr.push(reg42.test('абв'))
259arr.push(reg42.test('жаба'))
260arr.push(reg42.test('яГоДа'))
261
262let reg43 = /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i
263arr.push(reg43.test('žluťoučký'))
264arr.push(reg43.test('Pěl'))
265arr.push(reg43.test('Ďábelské'))
266arr.push(reg43.test('ódy'))
267
268let reg44 = /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i
269arr.push(reg44.test('môj'))
270arr.push(reg44.test('ľúbím'))
271arr.push(reg44.test('mäkčeň'))
272arr.push(reg44.test('vŕba'))
273arr.push(reg44.test('ňorimberk'))
274
275let reg45 = /^[A-ZÆØÅ]+$/i
276arr.push(reg45.test('aøå'))
277
278let reg46 = /^[A-ZÁÉËÏÓÖÜÚ]+$/i
279arr.push(reg46.test('Kán'))
280arr.push(reg46.test('één'))
281arr.push(reg46.test('vóór'))
282arr.push(reg46.test('nú'))
283arr.push(reg46.test('héél'))
284
285let reg47 = /^[A-ZÄÖÜß]+$/i
286arr.push(reg47.test('äbc'))
287arr.push(reg47.test('FöÖbär'))
288
289let reg48 = /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i
290arr.push(reg48.test('árvíztűrőtükörfúrógép'))
291
292arr.forEach((item)=>{
293  if(!item){
294    temp = false
295  }
296})
297assert_equal(temp,true)
298
299let arr1 = []
300let temp1 = false
301let reg49 = /[^A-Z0-9+\/=]/i;
302arr1.push(reg49.test("Zg=="));
303arr1.push(reg49.test("Zm8="));
304arr1.push(reg49.test("Zm9v"));
305arr1.push(reg49.test("Zm9vYg=="));
306arr1.push(reg49.test("Zm9vYmE="));
307arr1.push(reg49.test("Zm9vYmFy"));
308arr1.push(reg49.test(
309  "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4="
310));
311arr1.push(reg49.test("Vml2YW11cyBmZXJtZW50dW0gc2VtcGVyIHBvcnRhLg=="));
312arr1.push(reg49.test("U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw=="));
313arr1.forEach((item)=>{
314  if(item){
315    temp1 = true
316  }
317})
318assert_equal(temp1,false)
319let str1 = 'SC52BAHL01031234567890123456USD'
320assert_equal(str1.replace(/[^A-Z0-9]+/gi, ''),"SC52BAHL01031234567890123456USD")
321
322let reg50 = /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i
323
324let regabc = /abc/g;
325let strabcd = "abcdabcdabcd";
326let exceptArr = [true,true,true,false,true,true,true,false,true,true]
327let resultArr = []
328for (let i = 0; i < 10; i++) {
329  // cache is used in this case
330  resultArr.push(regabc.test(strabcd))
331}
332assert_equal(exceptArr,resultArr);
333
334let str2 = "aaaabbBbcccC";
335for (let i = 0; i < 2; i++) {
336  assert_equal(str2,'aaaabbBbcccC');
337  let t1 = str2.replace(/([A-Z])/g, function(e) {
338    return "_" + e;
339  });
340  assert_equal(t1,'aaaabb_Bbccc_C');
341  let t2 = str2.replace(/([A-Z])/g, "_$1");
342  assert_equal(t2,'aaaabb_Bbccc_C');
343  assert_equal(t1.replace(/([a-z]+)/g, "_xy"),'_xy_B_xy_C');
344  assert_equal(t2.replace(/_/g, ""),'aaaabbBbcccC');
345}
346
347// regexp cache test
348let mediaReg = "\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)\([^\)]+\)";
349let string = '(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s';
350const regex1 = new RegExp(mediaReg);
351let matchArray = string.match(regex1);
352assert_equal(matchArray.toString(),'(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s,(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(,s,(,s,(,s,(,s,(,s,(,s,(,s,(,s');
353
354// Test regexp.test fastpath
355var protoExec = RegExp.prototype.exec
356RegExp.prototype.exec = function () {
357  return null
358}
359var reg = /a/
360assert_equal(reg.test("aaaaa"),false);
361
362delete RegExp.prototype.exec
363assert_equal(reg.test("aaaaa"),true);
364
365Object.prototype.exec = function () {
366  return null
367}
368assert_equal(reg.test("aaaaa"),false);
369
370delete Object.prototype.exec
371RegExp.prototype.exec = protoExec
372assert_equal(reg.test("aaaaa"),true);
373
374var protoTest = RegExp.prototype.test
375RegExp.prototype.test = function () {
376    return false
377}
378var reg2 = /foo*/
379assert_equal(reg2.test("fooooooo"),false);
380
381RegExp.prototype.test = protoTest
382assert_equal(reg2.test("fooooooo"),true);
383
384// Same hash in cached result, but different flags.
385var regexp1 = /a*/gs;
386var regexp2 = /a*/g;
387regexp2.lastIndex = 8;
388assert_equal(regexp1.exec('aaa').toString(),'aaa');
389assert_equal(regexp2.exec('aaa'),null);
390
391// Same hash in cached result, and same flags, but different lastIndex.
392var regexp3 = /a*/g;
393var regexp4 = /a*/g;
394regexp4.lastIndex = 1;
395assert_equal(regexp3.exec('aaabab').toString(),'aaa');
396assert_equal(regexp4.exec('aaabaa').toString(),'aa');
397
398const v43 = /V[\d-\d]/ys;
399const o54 = {
400    __proto__: v43,
401};
402try {
403    o54.test(Map);
404    assert_unreachable();
405} catch (error) {
406  assert_equal("Caught an error: "+ error.message, "Caught an error: this does not have [[RegExpMatcher]]");
407}
408
409// Testing regexp.prototype.replace after optimization
410{
411  const re1 = /[Cz]/;
412  const re2 = /[Cz]/g;
413  const re3 = /([Cz])/;
414  const re4 = /([Cz])/g;
415
416  let replace_str = "abCdefgzabCdefgzabCdefgz";
417  let replace_result = replace_str.replace(re1, "");
418  assert_equal(re1.lastIndex,0);
419  let cached_reuslt = replace_str.replace(re1, "");
420  assert_equal(replace_result === cached_reuslt,true);
421  assert_equal(re1.lastIndex,0);
422
423  replace_result = replace_str.replace(re2, "xyz");
424  assert_equal(re2.lastIndex,0);
425  cached_reuslt = replace_str.replace(re2, "xyz");
426  assert_equal(replace_result === cached_reuslt,true);
427  assert_equal(re2.lastIndex,0);
428
429  replace_result = replace_str.replace(re3, "x$1yz");
430  assert_equal(re3.lastIndex,0);
431  cached_reuslt = replace_str.replace(re3, "x$1yz");
432  assert_equal(replace_result === cached_reuslt,true);
433  assert_equal(re3.lastIndex,0);
434
435  replace_result = replace_str.replace(re4, String);
436  assert_equal(re4.lastIndex,0);
437  cached_reuslt = replace_str.replace(re4, String);
438  assert_equal(replace_result === cached_reuslt,true);
439  assert_equal(re4.lastIndex,0);
440}
441
442// test RegExp.prototype.xx
443assert_equal(RegExp.prototype.dotAll,undefined)
444assert_equal(RegExp.prototype.global,undefined)
445assert_equal(RegExp.prototype.hasIndices,undefined)
446assert_equal(RegExp.prototype.ignoreCase,undefined)
447assert_equal(RegExp.prototype.multiline,undefined)
448assert_equal(RegExp.prototype.sticky,undefined)
449assert_equal(RegExp.prototype.unicode,undefined)
450assert_equal(RegExp.prototype.lastIndex,undefined)
451assert_equal(RegExp.prototype.flags,"")
452assert_equal(RegExp.prototype.source,"(?:)")
453try {
454    RegExp.prototype.test("abc")
455    assert_unreachable();
456} catch (error) {
457  assert_equal(error instanceof TypeError,true)
458}
459try {
460    RegExp.prototype.exec("abc")
461    assert_unreachable();
462} catch (error) {
463  assert_equal(error instanceof TypeError,true)
464}
465assert_equal(RegExp.prototype.toString(),'/(?:)/')
466
467let inputString = "/vedio/av{avid}{cid}";
468let extractedContent = inputString.match(/\{([^{}]+)\}/g);
469let replacedString = inputString.replace(/\{([^{}]+)\}/g, '(uuu)').replace(/\//g, "\\/");
470assert_equal(replacedString,'\\/vedio\\/av(uuu)(uuu)');
471
472let str = "beep boop   afff测试样本one1";
473assert_equal(str.split(/([{}:;,]|\s+)/).toString(),'beep, ,boop,   ,afff测试样本one1');
474
475function verifyRegExp(text) {
476  text = text.replace(new RegExp('[\\s]', 'g'), ' ');
477  let emRegExp = new RegExp('<em>.*?</em>', 'ig');
478  let results = text.split(emRegExp);
479  text.match(emRegExp);
480  return results;
481}
482
483const srcTextA = '<em>a</em>bcdefghijklmnopqrstuvwxyz<em>a</em>bcdefghijklmnopqrstuvwxyz<em>a</em>bcdefghijklmnopqrstuvwxyz<em>a</em>bcdefghijklmnopqrstuvwxyz'
484const srcTextAbcd = '<em>abcd</em>efghijklmnopqrstuvwxyz<em>abcd</em>efghijklmnopqrstuvwxyz<em>abcd</em>efghijklmnopqrstuvwxyz<em>abcd</em>efghijklmnopqrstuvwxyz'
485
486var s =`verifyRegExp_1: ${verifyRegExp(srcTextA)}`
487assert_equal(s,'verifyRegExp_1: ,bcdefghijklmnopqrstuvwxyz,bcdefghijklmnopqrstuvwxyz,bcdefghijklmnopqrstuvwxyz,bcdefghijklmnopqrstuvwxyz');
488var s =`verifyRegExp_2: ${verifyRegExp(srcTextAbcd)}`
489assert_equal(s,'verifyRegExp_2: ,efghijklmnopqrstuvwxyz,efghijklmnopqrstuvwxyz,efghijklmnopqrstuvwxyz,efghijklmnopqrstuvwxyz');
490var s = `verifyRegExp_3: ${verifyRegExp(srcTextAbcd)}`
491assert_equal(s,'verifyRegExp_3: ,efghijklmnopqrstuvwxyz,efghijklmnopqrstuvwxyz,efghijklmnopqrstuvwxyz,efghijklmnopqrstuvwxyz');
492
493//regexp unicode property
494const ans1 = /\p{Alphabetic}/u.test("æ");
495const ans2 = /\p{Alpha}/u.test("2");
496const ans3 = /^[\p{Lu}\p{Ll}]+$/u.test("ASDFasdf");
497const ans4 = /^[\P{Lu}\p{Ll}]+$/u.test("ASDFasdf");
498const ans5 = /\P{Ll}/iu.test("b");
499const ans6 = /\p{Ll}/iu.test("b");
500const ans7 = /[^\P{Any}]+/u.test(456);
501const ans8 = /\p{Assigned}+/u.test("������");
502const ans9 = /[\p{P}\p{S}]/u.test("!");
503const ans10 = /\p{General_Category=Math_Symbol}/u.test("+");
504assert_equal(ans1,true);
505assert_equal(ans2,false);
506assert_equal(ans3,true);
507assert_equal(ans4,false);
508assert_equal(ans5,true);
509assert_equal(ans6,true);
510assert_equal(ans7,true);
511assert_equal(ans8,true);
512assert_equal(ans9,true);
513assert_equal(ans10,true);
514try {
515  const ans11 = RegExp("/[\\p{}]/u");
516  assert_unreachable();
517} catch(error) {
518  assert_equal(error instanceof SyntaxError, true);
519}
520const str3 = "a-b-c";
521const re = /-/y;
522assert_equal(str3.split(re).toString(),'a,b,c');
523
524re.lastIndex = 1;
525assert_equal(str3.split(re).toString(),'a,b,c');
526
527re.lastIndex = -1;
528assert_equal(str3.split(re).toString(),'a,b,c');
529
530re.lastIndex = 3;
531assert_equal(str3.split(re).toString(),'a,b,c');
532
533assert_equal(re.test(str3),true);
534
535assert_equal(str3.split(/-/g).toString(),'a,b,c');
536
537// search
538const str4 = "abc";
539let re1 = /b/;
540re1.lastIndex = 2;
541assert_equal(str4.search(re1),1);
542assert_equal(str4.search(/b/y),-1);
543assert_equal(str4.search(re1),1);
544assert_equal(re1.lastIndex,2);
545
546// check cache
547const str5 = "a-bc";
548let re2 = /-/;
549re2.lastIndex = 2;
550assert_equal(str5.split(re2).toString(),'a,bc');
551assert_equal(re2.lastIndex,2);
552assert_equal(str5.split(re2).toString(),'a,bc');
553assert_equal(re2.lastIndex,2);
554
555const str6 = "abcabc";
556let re3 = /abc/;
557re3.lastIndex = 2;
558assert_equal(str6.match(re3).toString(),'abc');
559assert_equal(re3.lastIndex,2);
560assert_equal(str6.match(re3).toString(),'abc');
561assert_equal(re3.lastIndex,2);
562
563let re4 = /abc/g;
564re4.lastIndex = 2;
565assert_equal(str6.match(re4).toString(),'abc,abc');
566assert_equal(re4.lastIndex,0);
567assert_equal(str6.match(re4).toString(),'abc,abc');
568assert_equal(re4.lastIndex,0);
569Object.defineProperty(RegExp.prototype, "global", {
570  value: true
571})
572var flags = RegExp.prototype.flags;
573Object.defineProperty(RegExp.prototype, "global", {
574  value: false
575})
576assert_equal(flags,"g");
577assert_equal(str6.match(re4).toString(),'abc');
578assert_equal(re4.lastIndex,3);
579assert_equal(str6.match(re4).toString(),'abc');
580assert_equal(re4.lastIndex,6);
581
582let myExp = new RegExp("a+b+c");
583Object.defineProperty(myExp, "sticky", {
584    value: true
585  })
586assert_equal(myExp.toString(),'/a+b+c/y');
587
588// Testing regexp.prototype.replace after optimization
589{
590  const re1 = /[Cz]/;
591  const re2 = /[Cz]/g;
592  const re3 = /([Cz])/;
593  const re4 = /([Cz])/g;
594
595  let replace_str = "abCdefgzabCdefgzabCdefgz";
596  let replace_result = replace_str.replace(re1, "");
597  assert_equal(re1.lastIndex,0);
598  let cached_reuslt = replace_str.replace(re1, "");
599  assert_equal(replace_result === cached_reuslt,true);
600  assert_equal(re1.lastIndex,0);
601
602  replace_result = replace_str.replace(re2, "xyz");
603  assert_equal(re2.lastIndex,3);
604  cached_reuslt = replace_str.replace(re2, "xyz");
605  assert_equal(replace_result === cached_reuslt,false);
606  assert_equal(re2.lastIndex,8);
607
608  replace_result = replace_str.replace(re3, "x$1yz");
609  assert_equal(re3.lastIndex,0);
610  cached_reuslt = replace_str.replace(re3, "x$1yz");
611  assert_equal(replace_result === cached_reuslt,true);
612  assert_equal(re3.lastIndex,0);
613
614  replace_result = replace_str.replace(re4, String);
615  assert_equal(re4.lastIndex,3);
616  cached_reuslt = replace_str.replace(re4, String);
617  assert_equal(replace_result === cached_reuslt,true);
618  assert_equal(re4.lastIndex,8);
619}
620
621const regex = /(?:)+/;
622const str10 = "abcabcabc";
623const matches = regex.test(str10);
624assert_equal(matches,true);
625const matches1 = regex.exec(str10);
626assert_equal(matches1.toString(),"");
627
628try {
629  let matchReg = new RegExp("@【哈哈】*^o^*|@小米(kk)",'g');
630  assert_unreachable();
631} catch (error) {
632  assert_equal("Caught an error: "+ error.message, "Caught an error: nothing to repeat");
633}
634
635let e = /./;
636e.exec = function() {
637    return [];
638}
639"".replace(e, "");
640delete e.exec;
641
642{
643  const v0 = /qeu(?<a>.)\k<a>(x)(x)(x)\1*xyz{93}/ugysd;
644  const v4 = typeof Date === "string";
645  v0[Symbol.match] = v4;
646  assert_equal(v0["exec"](),null);
647}
648
649{
650  ("65535").split(/(?!\1(a\1)\1)\1/g);
651  const o4 = {
652    ...RegExp,
653  };
654  assert_equal(o4.toString(),"[object Object]");
655}
656
657{
658  const v2 = /e\8Z(x)(x)(x)(x)(x)(x)(x)(x)(x)(x)\10*/misd;
659  v2[1073741824] = -194290175n;
660  for (let v3 = 0; v3 < 2; v3++) {
661    assert_equal(v2.test(-194290175n),false);
662  }
663}
664
665function f(...args) {
666  return {};
667}
668let reg51 = new RegExp("a");
669f.exec = f;
670let relpfun = reg51[Symbol.replace];
671relpfun.apply(f, [1, 2, 3, 4]);
672var s = "success"
673assert_equal(s,"success");
674
675{
676  let str = /^\s*([^;\s]*)/;
677  str.test("text/html");
678  assert_equal(RegExp.$1,'text/html');
679  str.test("text/plain");
680  assert_equal(RegExp.$1,'text/plain');
681  str.test("text/html");
682  assert_equal(RegExp.$1,'text/html');
683}
684
685{
686  let reg52 = /abc/;
687  let count = 0;
688  assert_equal(reg52.ignoreCase,false);
689  assert_equal(reg52.global,false);
690  assert_equal(reg52.flags,"");
691  Object.defineProperty(reg52, "global", {
692    get: function() { count++; return true; }
693  });
694  Object.defineProperty(reg52, "ignoreCase", {
695    get: function() { count++; return true; }
696  });
697
698  assert_equal(reg52.ignoreCase,true);
699  assert_equal(count,1);
700  assert_equal(reg52.global,true);
701  assert_equal(count,2);
702  assert_equal(reg52.flags,"gi");
703  assert_equal(count,4);
704}
705
706// The above test case in false environment did not reset the environment
707Object.defineProperty(RegExp.prototype, "global", {
708  value: true
709})
710string = 'aaa\n789\r\nccc\r\n345';
711var pattern = /\d$/gm;
712result = string.match(pattern);
713assert_equal(2 == result.length,true);
714assert_equal('9' == result[0],true);
715assert_equal('5' == result[1],true);
716
717string = 'aaa\n789\r\nccc\r\nddd';
718pattern = /\d$/gm;
719result = string.match(pattern);
720assert_equal(1 == result.length,true);
721assert_equal('9' == result[0],true);
722
723// test getFlags
724Object.defineProperty(RegExp.prototype, "global", {
725  value: true
726})
727const res = /abc/giymsud;
728res.lastIndex = -1;
729assert_equal(res.flags,'dgimsuy');
730const res1 = /abc/g;
731res1.lastIndex = -1;
732assert_equal(res1.flags,'g');
733const res2 = /abc/i;
734res2.lastIndex = -1;
735assert_equal(res2.flags,'gi');
736const res3 = /abc/y;
737res3.lastIndex = -1;
738assert_equal(res3.flags,'gy');
739const res4 = /abc/m;
740res4.lastIndex = -1;
741assert_equal(res4.flags,'gm');
742const res5 = /abc/s;
743res5.lastIndex = -1;
744assert_equal(res5.flags,'gs');
745const res6 = /abc/u;
746res6.lastIndex = -1;
747assert_equal(res6.flags,'gu');
748const res7 = /abc/d;
749res7.lastIndex = -1;
750assert_equal(res7.flags,'dg');
751const res8 = /abc/;
752res8.lastIndex = -1;
753assert_equal(res8.flags,'g');
754
755{
756  let str = "<style>test</style>"
757  let reg = new RegExp("/");
758  assert_equal(reg.source + ' ' + JSON.stringify(reg.exec(str)), '\\/ ["/"]');
759
760  reg = new RegExp("\/[a-z]*>");
761  assert_equal(reg.source + ' ' + JSON.stringify(reg.exec(str)),'\\/[a-z]*> ["/style>"]');
762
763  reg = new RegExp("\\/[a-z]*>");
764  assert_equal(reg.source + ' ' + JSON.stringify(reg.exec(str)),'\\/[a-z]*> ["/style>"]');
765
766  reg = new RegExp("\\\/[a-z]*>");
767  assert_equal(reg.source + ' ' + JSON.stringify(reg.exec(str)),'\\/[a-z]*> ["/style>"]');
768
769  str="<style>test<\\\\/style>"
770  reg = new RegExp("\\\\/[a-z]*>");
771  assert_equal(reg.source + ' ' + JSON.stringify(reg.exec(str)),'\\\\\\/[a-z]*> ["\\\\/style>"]');
772
773  reg = new RegExp("\\\\\/[a-z]*>");
774  assert_equal(reg.source + ' ' +  JSON.stringify(reg.exec(str)),'\\\\\\/[a-z]*> ["\\\\/style>"]');
775
776  reg = new RegExp("\\\\\\/[a-z]*>");
777  assert_equal(reg.source + ' ' +  JSON.stringify(reg.exec(str)),'\\\\\\/[a-z]*> ["\\\\/style>"]');
778
779  reg = new RegExp("\\\\\\\/[a-z]*>");
780  assert_equal(reg.source + ' ' +  JSON.stringify(reg.exec(str)),'\\\\\\/[a-z]*> ["\\\\/style>"]');
781}
782{
783  let str="\\\\\\\\[aaa"
784  try {
785    let pattern="[";
786    let reg = new RegExp(pattern);
787    assert_unreachable();
788  } catch (error) {
789    assert_equal(error instanceof SyntaxError,true);
790  }
791  try {
792    let pattern="\[";
793    let reg = new RegExp(pattern);
794    assert_unreachable();
795  } catch (error) {
796    assert_equal(error instanceof SyntaxError,true);
797  }
798  try {
799    let pattern="\\[";
800    let reg = new RegExp(pattern);
801    assert_equal(pattern+" "+JSON.stringify(reg.exec(str)),'\\[ ["["]')
802  } catch (error) {
803    assert_unreachable();
804  }
805  try {
806    let pattern="\\\[";
807    let reg = new RegExp(pattern);
808    assert_equal(pattern+" "+JSON.stringify(reg.exec(str)),'\\[ ["["]')
809  } catch (error) {
810    assert_unreachable();
811  }
812  try {
813    let pattern="\\\\[";
814    let reg = new RegExp(pattern);
815    assert_unreachable();
816  } catch (error) {
817    assert_equal(error instanceof SyntaxError,true);
818  }
819  try {
820    let pattern="\\\\\[";
821    let reg = new RegExp(pattern);
822    assert_unreachable();
823  } catch (error) {
824    assert_equal(error instanceof SyntaxError,true);
825  }
826  try {
827    let pattern="\\\\\\[";
828    let reg = new RegExp(pattern);
829    assert_equal(pattern+" "+JSON.stringify(reg.exec(str)),'\\\\\\[ ["\\\\["]')
830  } catch (error) {
831    assert_unreachable();
832  }
833  try {
834    let pattern="\\\\\\\[";
835    let reg = new RegExp(pattern);
836    assert_equal(pattern+" "+JSON.stringify(reg.exec(str)),'\\\\\\[ ["\\\\["]')
837  } catch (error) {
838    assert_unreachable();
839  }
840}
841
842{
843  Object.defineProperty(RegExp.prototype, "global", {
844    value: false
845  })
846  let str1;
847  let result;
848  const re1 = /[Cz]/;
849  const re2 = /[Cz]/g;
850  const re3 = /([Cz])/;
851  const re4 = /([Cz])/g;
852
853  function createHaystack() {
854    let s = "abCdefgz";
855    for (let i = 0; i < 3; i++) s += s;
856    return s;
857  }
858  str1 = createHaystack();
859  function String1Replace(re) {
860    result = re[Symbol.replace](str1, ".");
861  }
862  function String2Replace(re) {
863    result = re[Symbol.replace](str1, "xyz");
864  }
865  function String3Replace(re) {
866    result = re[Symbol.replace](str1, "x$1yz");
867  }
868  function Function1Replace(re) {
869    result = re[Symbol.replace](str1, String);
870  }
871  String1Replace(re1);
872  assert_equal(result,"ab.defgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
873  String1Replace(re2);
874  assert_equal(result,"ab.defgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
875  String2Replace(re2);
876  assert_equal(result,"abCdefgxyzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
877  String2Replace(re1);
878  assert_equal(result,"abxyzdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
879  String3Replace(re3);
880  assert_equal(result,"abxCyzdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
881  String3Replace(re4);
882  assert_equal(result,"abxCyzdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
883  Function1Replace(re3);
884  assert_equal(result,"abCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
885  Function1Replace(re4);
886  assert_equal(result,"abCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz");
887
888  // subStringIsUtf8 branch canbecompressed
889  str1 = 'utf83c这要替换"!';
890  let regexp = /([0-9])([a-z])/g
891  let newStr1 = str1.replace(regexp, "$1" );
892  assert_equal(newStr1,'utf83这要替换"!');
893
894  // subStringIsUtf8 branch length=0;
895  str1 = '3c这要替换"!';
896  regexp = /([0-9])([a-z])/g
897  newStr1 = str1.replace(regexp, "$1" );
898  assert_equal(newStr1,'3这要替换"!');
899
900  // subStringIsUtf8 branch src isUtf8;
901  str1 = 'abcdefg3chigk"!';
902  regexp = /([0-9])([a-z])/g
903  newStr1 = str1.replace(regexp, "$1" );
904  assert_equal(newStr1,'abcdefg3higk"!');
905}
906
907{
908  let s1 = 'abc';
909  let s2 = '\ud834\udf06';
910  let reg = new RegExp(s1.repeat(10000));
911  let str = s1.repeat(10000);
912  let res = str.replace(reg, s2);
913  assert_equal(res == s2, true);
914
915  reg = new RegExp(s2.repeat(10000));
916  str = s2.repeat(10000);
917  res = str.replace(reg, s1);
918  assert_equal(res == s1, true);
919}
920
921// This case aims to check overflow of error message while parsing regular expression
922{
923  let patternPart1 = "^(\\p{g}+)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
924  let patternPart2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
925  let pattern = patternPart1 + patternPart2;
926  try {
927    let r = new RegExp(pattern);
928    assert_unreachable();
929  } catch (e) {
930    assert_equal(e instanceof SyntaxError, true);
931  }
932}
933
934{
935  class C3 extends Array {
936  }
937  const o7 = {
938    get(a5, a6) {
939      return 1942;
940    },
941  };
942  const v9 = new Proxy(C3, o7);
943  try {
944    RegExp(v9).toString();
945    assert_unreachable();
946  } catch (e) {
947    assert_equal(e instanceof SyntaxError, true);
948  }
949}
950
951test_end();