Regular Expression giving catastrophic backtracking issue in NodeJs?

Viewed 32

I have a sentence like below,

  let sentence = "Your A/c {#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}.,{#val#} Bal.Rs.{#val#}. Req Date: {#val#}.THE XXX CO OP BANK LTD"

 let usermsg = "Your A/c 12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345.,12345 Bal.Rs.12345. Req Date: 12345.THE XXX CO OP BANK LTD"

and we have formed a regular expression as below,

  let regex = /^YourAc.{0,30}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,60}BalRs.{0,30}ReqDate.{0,30}THEXXXCOOPBANKLTD$/i

Normally it is working for most of the expressions, but mentioned sentence not executing the regex test, it is stuck with that line and CPU utilization goes 100%.

Our script is like below,

  let sentence1 = sentence.replace(/(^|.)\s($|.)/g, (x, g1, g2) => (x == "} {" ? x : g1 + "" + g2));
  sentence1 = sentence1.replace(/\s*(\{#val#}(?:\s*\{#val#})*)/gi, (x, y) => 
                 '.{0,' + ((y.match(/\{#val#}/gi) || ['']).length * 30 + (y.match(/\s/g) || '').length) + '}')
  sentence1 = sentence1.replace(/[~\]\^|!%&()*+,\-–.\/:;<=>?_!$*:;<>/?!‘’“\”\’\`\'\"%&/\\]/gi, "")
  let usermsg1= usermsg.replace(/[~\]\^|!%&()*+,\-–.\/:;<=>?_!$*:;<>/?!‘’“\”\’\`\'\"%&/\\]/gi, "")
  sentence1 = sentence1.replace(/[ ]/g, '');
  usermsg1 = usermsg1.replace(/[ ]/g, '');
  let regex1 = RegExp("^" + sentence1 + "$", "i"); 
  let Status = "Ok"
  if (!regex1.test(usermsg1)) {
        Status = "Fail"
  }
  console.log("Status  :",Status)
  

Here {#val#} portion is dynamic one where usermsg(user) can substitute upto 30 chars max and 0 min and pass. Is there any way to make this sentence matched with usermsg. Can anyone please let me knw how to proceed with this?

0 Answers
Related