Pergunta

Existe uma solução existente para criar expressões regulares dinamicamente fora de um determinado padrão de formato de data e hora?O padrão de formato de data e hora suportado não importa (Joda DateTimeFormat, java.text.SimpleDateTimeFormat ou outros).

ou sejapara um determinado formato de data e hora (por exemplo "dd/MM/aaaa hh:mm"), ele gerará uma expressão regular correspondente para corresponder às datas e horas nos formatos especificados.

Foi útil?

Solução

Eu acho que você tem um alfabeto limitado a partir do qual seus formatos de hora podem ser construídos.Que significa, "HH" seriam sempre "horas" no relógio de 24 horas, "dd" sempre o dia com zero à esquerda e assim por diante.

Devido à natureza sequencial de um formato de hora, você pode tentar tokenizar uma sequência de formato de "dd/mm/yyyy HH:nn" em uma matriz ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"].Então vá em frente e forme uma string padrão a partir dessa matriz, substituindo "HH" com "([01][0-9]|2[0-3])" e assim por diante.Pré-construa esses átomos de padrão em uma tabela/matriz de pesquisa.Todas as partes do seu array que não estão na tabela de pesquisa são literais.Escape-os de acordo com as regras de regex e anexe-os à sua string de padrão.


EDITAR:Como efeito colateral para uma solução baseada em regex, quando você coloca todos os "átomos" de regex da sua tabela de pesquisa entre parênteses e acompanha sua ordem em uma determinada string de formato, você poderá usar subcorrespondências para extrair os componentes necessários de uma correspondência e alimentá-los em uma função CreateDate, ignorando completamente a parte ParseDate.

Outras dicas

Se você está procurando uma verificação básica de datas.este código corresponde a esses dados.

\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b

10/07/2008  
10.07.2008
1-01/2008
10/07/08    
10.07.2008
1-01/08

Código via regexbuddy

SimpleDateFormat já faz isso com o parse() método.

Se você precisar analisar várias datas a partir de uma única string, comece com uma regex (mesmo que corresponda muito brandamente) e use parse() em todas as possíveis correspondências encontradas pela regex.

Abaixo é fornecido o código js/jQuery para geração dinâmica de regex apenas para formato de data, não para data e hora (a versão de desenvolvimento ainda não foi totalmente testada.)

O formato da data deve estar em "D M Y"

por exemplo.
DD-MM-AA,
DD-MM-AAAA,
AAAA-MM-DD,
AAAA-DD-MM,
MM-DD-AAAA,
MM-DD-AA,
DD/MM/AA,
DD/MM/AAAA,
AAAA/MM/DD,
AAAA/DD/MM,
MM/DD/AAAA,
MM/DD/AA
Ou outros formatos, mas criados com o caractere [D M Y]

var dateFormat = "DD-MM-YYYY";
var order = [];
    var position = {"D":dateFormat.search('D'),"M":dateFormat.search('M'),"Y":dateFormat.search('Y')};
    var count = {"D":dateFormat.split("D").length - 1,"M":dateFormat.split("M").length - 1,"Y":dateFormat.split("Y").length - 1};
    var seprator ='';
    for(var i=0; i<dateFormat.length; i++){
  if(["Y","M","D"].indexOf(dateFormat.charAt(i))<0){
    seprator = dateFormat.charAt(i);
  }else{
    if(order.indexOf(dateFormat.charAt(i)) <0 ){
        order.push(dateFormat.charAt(i));
    }
  }
    }
    var regEx  = "^";
    $(order).each(function(ok,ov){
    regEx  += '(\d{'+count[ov]+'})'+seprator;
    });
    regEx = regEx.substr(0,(regEx.length)-1);
  regEx  +="$";
  var re = new RegExp(regEx);
  console.log(re);

Nota- Não há verificação de validação por meses / dias, por exemplo.o mês deve estar entre 01 e 12 ou a data deve estar entre 01 e 31

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top