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-4598866
If 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;
}
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}`; }
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). Something like this could work.
let arrstr = ["#12-1676","#02-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988"] for (const st of arrstr) { console.log(st.replace(/(^#?)(\d+)(?=-)/,replacer)) } function replacer(match, p1, p2) { if (p2.length === 1) { return '0' + p2; } else { return p2; } }
let list_of_numbers =["#1-7878", "#162-7878", "#12-1676","#02-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988"]
const solution = () => {
let result = ''
for (let number of list_of_numbers) {
let nums = number.split('-')
if (nums[0][0] == '#' && nums[0].length > 2) {
result = `${nums[0].slice(1, number.length-1)}-${nums[1]}`
console.log(result)
} else if (nums[0][0] == '#' && nums[0].length == 2) {
result = `${nums[0][0] = '0'}${nums[0][1]}-${nums[1]}`
console.log(result)
} else {
console.log(number)
}
}
}
I think a simple check is what you should do with the match function.
let arrstr=["#12-1676","#0-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988"]; const regex = /#\d-/g; for(i in arrstr){ var found = arrstr[i].match(regex); if(found){ arrstr[i]=arrstr[i].replace("#","0") }else{ arrstr[i]=arrstr[i].replace("#","") } } console.log(arrstr);
or if you really want to stick with the way you have it.
let arrstr=["#12-1676","#02-8989898","#6-98908098","12-232","02-898988","676-98098","2-898988"] 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; }
remove the '?' from the regex so its not #? but just #
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.