I have a array of string and the patterns like #number-number anywhere inside a string.
Requirements:
If the # and single digit number before by hyphen then replace # and add 0. For example,
#162-7878=>162-7878,#12-4598866=>12-4598866If the # and two or more digit number before by hyphen then replace remove #. For example,
#1-7878=>01-7878.If there is no # and single digit number before by hyphen then add 0. For example,
1-7878=>01-7878.
I got stuck and how to do in JavaScript. Here is the code I used:
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.replace(/#?(d)?(d-)/g ,replacer))
function replacer(match, p1, p2, offset, string){
let replaceSubString = p1 || "0";
replaceSubString += p2;
return replaceSubString;
}
Advertisement
Answer
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#charb– 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).