regex replace for multiple string array javascript

Solution 1:

I suggest matching # optionally at the start of string, and then capture one or more digits before - + a digit to later pad those digits with leading zeros and omit the leading # in the result:

st.replace(/#?\b(\d+)(?=-\d)/g, (_,$1) => $1.padStart(2,"0"))

See the JavaScript demo:

let arrstr=["#12-1676","#02-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988", "380100 6-764","380100 #6-764","380100 #06-764"]

for(let st of arrstr)
 console.log(st,'=>', st.replace(/#?\b(\d+)(?=-\d)/g, (_,$1) => $1.padStart(2,"0") ))

The /#?\b(\d+)(?=-\d)/g regex matches all occurrences of

  • #? - an optional # char
  • \b - word boundary
  • (\d+) - Capturing group 1: one or more digits...
  • (?=-\d) - that must be followed with a - and a digit (this is a positive lookahead that only checks if its pattern matches immediately to the right of the current location without actually consuming the matched text).

Solution 2:

Using the unary operator, here's a two liner replacer function.

const testValues = ["#162-7878", "#12-4598866", "#1-7878", "1-7878"];
const re = /#?(\d+?)-(\d+)/;

for(const str of testValues) {
  console.log(str.replace(re, replacer));
}

function replacer(match, p1, p2) {
  p1 = +p1 < 10 ? `0${p1}` : p1;
  return `${p1}-${p2}`; 
}