Tengo dos formatos dateString como :date-f1:+2 y :date-f2:-1 , si la cadena entrante está en formato date-f1:+2 , necesito consola.log como procesadoDate.format("YYYY- MM-DD"), pero si la cadena entrante está en formato :date-f2:-1 , necesito console.log comoprocessedDate.format("DD/MM/YYYY"). Intenté lo siguiente, pero obtuve una excepción Cannot read properties of null (reading '1')" , alguien podría aconsejarme;
let dateString = ":date-f1:+2"; // or ":date-f2:-1" function datesParse(dateString) { let matchFormat = dateString.match(/^:date-f1:(|):date-f2:(?:([\-\+])([0-9]+)+)?$/); let processedDate = moment(); if (matchFormat[1] === "-") { processedDate = processedDate.subtract(matchFormat[2], 'days'); console.log("Date::"+processedDate.format("DD/MM/YYYY")); } else if (matchFormat[1] === "+") { processedDate = processedDate.add(matchFormat[2], 'days'); console.log("Date::"+processedDate.format("DD/MM/YYYY")); } else if (matchFormat[1] === "-") { processedDate = processedDate.subtract(matchFormat[2], 'days'); console.log("Date::"+processedDate.format("YYYY-MM-DD")); } else if (matchFormat[1] === "+") { processedDate = processedDate.add(matchFormat[2], 'days'); console.log("Date::"+processedDate.format("YYYY-MM-DD")); } } datesParse(dateString);Modifiqué su expresión regular y también agregué grupos de captura con nombre, pruebe esto: /^:date-(?<word>f[12]):(?:(?<operator>[-+])(?<number>[0-9]+)+)?$/gm
Prueba aquí: https://regex101.com/r/cNNHA5/1
Con los grupos de captura puedes acceder fácilmente a cada uno de esos elementos capturados:
let line = ':date-f1:+2'; let pattern = /^:date-(?<word>f[12]):(?:(?<operator>[-+])(?<number>[0-9]+)+)?$/gm let match = pattern.exec(line) console.log('word', match.groups.word) console.log('operator', match.groups.operator) console.log('number', match.groups.number)y utilícelos para verificar como:
if (dateString.includes(match.groups.word) && dateString.includes(match.groups.operator)) por lo que no tiene que crear vars word y operator adicionales.