Regex dinâmico para formatos de data e hora
-
09-06-2019 - |
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.
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