Como validar a data ISO8601 usando expressão regular? [duplicado]
Estou tendo problemas com minha atribuição de classe de programação web, devo usar uma expressão regular em javascript para validar uma entrada de data, o meu está voltando no formato ISO8601.
Esta é a expressão que estou usando /^(\d{4})-(\d{2})-(\d{2})$/
Até agora, ele ainda retorna como uma data inválida, mesmo quando a data está correta. aqui está a expressão regular conforme aparece dentro do notepad ++.
O valor para a data de entrada está voltando como "2020-09-26" de acordo com o console
estou a usar
var order_date = "2020-09-26"
var regDate = new RegExp('^(\d{4})-(\d{2})-(\d{2})$');
if (!regDate.test(order_date)){
valid = false;
document.getElementById("err5").innerHTML = "** Not a valid date";
}
para verificar o valor do campo de entrada e, se não for válido, definir a variável válida como falsa e adicionar uma mensagem de erro a um intervalo de erro no HTML. Aqui está uma captura de tela do próprio código em meu editor também.
Antes de tentar usar uma expressão regular, a instrução era
if(order_date === "" || order_date.length < 8 || order_date.length > 10)){
valid = false;
document.getElementById("err5").innerHTML = "** Not a valid date";
}
e funcionou tecnicamente, ele poderia aceitar um formato de data ISO8601 e dizer se cabia ou não e retornar válido, mas obviamente esta verificação pode aceitar uma data inválida, então nos disseram para usar uma expressão regular para melhorar a verificação.
Só preciso de ajuda para saber por que isso não estaria funcionando. Pelo que posso dizer, não há nada de errado com o regex em si, então talvez seja o resto do meu javascript ou algum outro problema? quaisquer sugestões são úteis
Respostas
O formato 2020-09-26 deve ser validado com /^\d{4}-\d{2}-\d{2}$/Certifique-se de cortar a data primeiro.
const validateDate = (dateString) => {
const regex = /^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})$/;
const result = regex.exec(dateString || '2020-09-26');
if (!result) {
return false;
}
const { y, m, d } = result.groups;
console.log(y, m, d);
if (false /* write your days per months checks here */) {
return false;
}
return true;
};