Obtengo la fecha completa del campo de date . Quería, si se encuentra la fulldate de fecha completa, usarla de lo contrario, usar el mes con palabras, en este caso el 29 de noviembre. En mi código a continuación, 2019 ya está allí, por lo que debe usarse.
La salida esperada debería ser como POR EJEMPLO
2019-11-29T12:00:00.000Z let date = "0 Hi Nov 29 HELLO - 29112019"; let months = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"; let regex = new RegExp(months + " \\d{1,2}(?: \\d{4})?"); const result = date.match(regex).match(/ \d{4}$/) ? date.match(regex).match(/ \d{4}$/) : moment( date.match(regex) + " " + new Date().getFullYear() ).toDate() || ""; console.log(result); <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>Debe pasar la fecha en el formato reconocible .
Aquí hay una posible solución:
let date = "0 Hi Nov 29 HELLO - 21112019"; let months = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"; let regex = new RegExp("(?:.*\\D)?((?:0?[1-9]|[12]\\d|3[01])(?:0?[1-9]|1[0-2])(?:19|20)\\d{2})|" + months + "\\s+(\\d{1,2})(?:\\s+(\\d{4}))?"); let match = date.match(regex); if (match) { if (match[1]) { console.log(moment(match[1], "DDMMYYYY").format("YYYY-MM-DD[T]HH:mm:ss[Z]")); } else { if (match[4] === undefined) { match[4] = new Date().getFullYear() } console.log(moment(`${match[2]} ${match[3]} ${match[4]}`, "MMM DD YYYY").format("YYYY-MM-DD[T]HH:mm:ss[Z]")); } } <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> Tenga en cuenta que el patrón se verá como (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{1,2})(?:\s+(\d{4}))? , y coincidirá con el nombre del mes en el Grupo 1, el día en el Grupo 2 y el año, si está presente, en el Grupo 3. \s+ coincide con uno o más espacios en blanco. Si el Grupo 3 no coincide, match[2] no estará definido y podrá reemplazarlo con el año actual.
El MMM significa el nombre del mes en la configuración regional establecida por moment.locale() .
Tenga en cuenta que el patrón que está utilizando no tiene límites en ambos lados y puede coincidir como parte de una subcadena más larga. Por lo tanto, tiene sentido hacerlo más preciso al menos con límites de palabras:
let regex = new RegExp("\\b" + months + "\\s+(\\d{1,2})(?:\\s+(\\d{4}))?\\b"); O bien, con un límite de palabra al principio y un (?!\d) anticipado al final (para asegurarse de que no haya otros dígitos después del día/año):
let regex = new RegExp("\\b" + months + "\\s+(\\d{1,2})(?:\\s+(\\d{4}))?(?!\\d)");