简体   繁体   中英

regex replace for multiple string array javascript

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM