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}`;
}