Pregunta

¿Existe una solución para crear expresiones regulares dinámicamente a partir de un patrón de formato de fecha y hora determinado?El patrón de formato de fecha y hora admitido no importa (Joda DateTimeFormat, java.text.SimpleDateTimeFormat u otros).

es decir.para un formato de fecha y hora determinado (por ejemplo, "dd/MM/yyyy hh:mm"), generará la expresión regular correspondiente para que coincida con las fechas y horas dentro de los formatos especificados.

¿Fue útil?

Solución

Supongo que tienes un alfabeto limitado con el que se pueden construir tus formatos de tiempo.Eso significa, "HH" siempre serían "horas" en el reloj de 24 horas, "dd" siempre el día con cero a la izquierda, etc.

Debido a la naturaleza secuencial de un formato de hora, podría intentar tokenizar una cadena de formato de "dd/mm/yyyy HH:nn" en una matriz ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"].Luego continúa y forma una cadena de patrón a partir de esa matriz reemplazando "HH" con "([01][0-9]|2[0-3])" etcétera.Preconstruya estos átomos de patrón en una tabla/matriz de búsqueda.Todas las partes de su matriz que no están en la tabla de búsqueda son literales.Escápelos según las reglas de expresiones regulares y agréguelos a su cadena de patrón.


EDITAR:Como efecto secundario de una solución basada en expresiones regulares, cuando coloca todos los "átomos" de expresiones regulares de su tabla de búsqueda en pares y realiza un seguimiento de su orden en una cadena de formato determinada, podrá usar subcoincidencias para extraer los componentes necesarios. de una coincidencia e introducirlos en una función CreateDate, omitiendo así la parte ParseDate por completo.

Otros consejos

Si buscas una verificación básica de fechas.este código coincide con estos datos.

\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 a través de regexbuddy

SimpleDateFormat ya hace esto con el parse() método.

Si necesita analizar varias fechas de una sola cadena, comience con una expresión regular (incluso si coincide demasiado indulgentemente) y use parse() en todas las posibles coincidencias encontradas por la expresión regular.

A continuación se proporciona el código js/jQuery para generar expresiones regulares dinámicas solo para el formato de fecha, no para la fecha y hora (la versión de desarrollo aún no se ha probado completamente).)

El formato de fecha debe estar en "D M Y"

p.ej.
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,
DD/MM/AAAA,
DD/MM/AA
U otros formatos pero creados con carácter [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: no hay verificación de validación durante meses / días, por ejemplo.el mes debe estar en 01-12 o la fecha debe estar en 01-31

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top