Tengo una matriz de cadenas y los patrones como #number-number en cualquier lugar dentro de una cadena.
Requisitos :
Si # y el número de un solo dígito antes del guión, reemplace # y agregue 0. Por ejemplo, #162-7878 => 162-7878 , #12-4598866 => 12-4598866
Si el # y un número de dos o más dígitos antes del guión, reemplace elimine #. Por ejemplo, #1-7878 => 01-7878 .
Si no hay # y un número de un solo dígito antes del guión, agregue 0. Por ejemplo, 1-7878 => 01-7878 .
Me quedé atascado y cómo hacerlo en JavaScript. Aquí está el código que usé :
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; }Usando el unary operator , aquí hay una función de replacer de dos líneas.
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}`; }Sugiero hacer coincidir # opcionalmente al comienzo de la cadena, y luego capturar uno o más dígitos antes - + un dígito para luego rellenar esos dígitos con ceros iniciales y omitir el # inicial en el resultado:
st.replace(/#?\b(\d+)(?=-\d)/g, (_,$1) => $1.padStart(2,"0"))Vea la demostración de JavaScript:
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") )) La expresión regular /#?\b(\d+)(?=-\d)/g coincide con todas las apariciones de
#? - un # carácter opcional\b - límite de palabras(\d+) - Grupo de captura 1: uno o más dígitos...(?=-\d) - que debe ir seguido de - y un dígito (esta es una búsqueda anticipada positiva que solo verifica si su patrón coincide inmediatamente a la derecha de la ubicación actual sin consumir realmente el texto coincidente).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) } } }