Estaba seguro de que algo como esto había sido respondido antes de alguna manera, sin embargo, solo logré encontrar versiones invertidas como MM/DD/YYYY, etc. o caracteres especiales como / - y tuve poca suerte al convertirlos ya que mi conocimiento de expresiones regulares es terrible.
El hilo más cercano que encontré fue este
¿Estoy luchando por encontrar un enfoque limpio usando expresiones regulares y javascript para agregar ceros finales al formato de cadena a continuación?
dd.mm.yyyyPor ejemplo, 1.1.1998 => 01.01.1998 || 10.1.1998 => 10.01.1998
mi enfoque actual está en la línea de
const addLeadingZeros = (input: string) => { return input.replace(/.([1-9])(?!\d)/g, '.0$1'); }Qué tal si:
input.replace(/(?<=^|\.)(\d)(?=\.|$)/g, '0$1');Significa: "reemplazar todos los dígitos precedidos por el comienzo de una línea o un punto y seguidos por un punto o el final de la línea". Este ejemplo solo funciona para las partes de día y mes.
Ejemplo (salidas de la consola del navegador):
"01.01.1998".replace(/(?<=^|\.)(\d)(?=\.|$)/g, '0$1'); ← "01.01.1998" "1.01.1998".replace(/(?<=^|\.)(\d)(?=\.|$)/g, '0$1'); ← "01.01.1998" "1.1.1998".replace(/(?<=^|\.)(\d)(?=\.|$)/g, '0$1'); ← "01.01.1998"( Nota: esta no es una solución que recomiendo particularmente, solo me concentré en el punto solicitado).
Mi solución:
const addLeadingZeros = (input: string) => { return input.replaceAll(/\d*(?<![\d])[\d](?=[.])/g, '0$&'); } La expresión regular: \d*(?<![\d])[\d](?=[.])
Puedes encontrar la explicación al respecto aquí .
const addLeadingZeros = (input) => { return input.replaceAll(/\d*(?<![\d])[\d](?=[.])/g, '0$&'); } console.log(addLeadingZeros('01.02.3456')) console.log(addLeadingZeros('1.2.2001')) console.log(addLeadingZeros('01.2.1234')) console.log(addLeadingZeros('1.12.1998')) console.log(addLeadingZeros('3.04.2021')) console.log(addLeadingZeros('5.6.01')) console.log(addLeadingZeros('5.06.01')) console.log(addLeadingZeros('05.6.01')) console.log(addLeadingZeros('7.8.1')) console.log(addLeadingZeros('7.08.1')) console.log(addLeadingZeros('07.8.1'))También puede usar esta expresión regular /^\d\.|(?<=\.)\d\./g seleccionará el primer número y el número después del primer punto, por lo que solo seleccionará la fecha y el mes en su formato.
Puedes usar esto como el siguiente código
let regex = /^\d\.|(?<=\.)\d\./g; console.log("8.8.2014".replace(regex, str => `0${str}`)); console.log("25.06.2014".replace(regex, str => `0${str}`)); console.log("9.06.2014".replace(regex, str => `0${str}`)); console.log("08.7.2014".replace(regex, str => `0${str}`)); console.log("1.1.1998".replace(regex, str => `0${str}`));ahora te lo explico parte por parte
La expresión regular está rota por un | que le dice que coincida con la expresión anterior o posterior.
La primera parte es ^\d\. , si conoce los conceptos básicos de expresiones regulares, sabrá que significa ver si hay un número justo después del cual hay un punto al principio, selecciona la fecha si solo hay un dígito que la represente.
La segunda parte es (?<=\.)\d\. , esta parte primero ve si hay un punto antes de la cadena que se va a seleccionar, luego ve si solo hay un número después y luego un punto. Seleccionará el mes si solo hay un dígito que lo represente.
Aquí la primera parte (?<=.) le dice a Java que busque el punto pero no lo seleccione, si no hay un punto antes del número, no seleccionará la cadena.
Ahora, la última parte g hace que seleccione cada instancia de cadena que coincida.
Entonces, para el primer ejemplo, selecciona las cadenas "8". y "8".
.replace es una función de cadena que toma dos argumentos, primero la cadena/regex para hacer coincidir, en mi código es una expresión regular.
El segundo es una cadena o una devolución de llamada que devuelve una cadena, en mi código es una devolución de llamada.
La devolución de llamada puede obtener un argumento que es la cadena coincidente.
Luego agrego el "0" antes de la cadena coincidente con una cadena de plantilla.
Entonces la salida final es
08.08.2014 25.06.2014 09.06.2014 08.07.2014 01.01.1998Espero que mi explicación haya ayudado. Es posible que me equivoque en algunos lugares, ya que todavía estoy aprendiendo y uso expresiones regulares o incluso la devolución de llamada de reemplazar con poca frecuencia. Espero que no haya habido muchos errores. Si me equivoco en alguna parte, por favor háganmelo saber.