Como validar a data ISO8601 usando expressão regular? [duplicado]

Sep 27 2020

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

AngelZlatanov Sep 27 2020 at 00:04

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;
};