Domanda

Esiste una soluzione esistente per creare espressioni regolari in modo dinamico al di fuori di un determinato modello di formato data/ora?Il modello di formato data/ora supportato non ha importanza (Joda DateTimeFormat, java.text.SimpleDateTimeFormat o altri).

cioè.per un determinato formato data-ora (ad esempio "gg/MM/aaaa hh:mm"), genererà l'espressione regolare corrispondente per far corrispondere le date-ora nei formati specificati.

È stato utile?

Soluzione

Immagino che tu abbia un alfabeto limitato con cui puoi costruire i tuoi formati temporali.Questo significa, "HH" sarebbero sempre "ore" nell'orologio a 24 ore, "dd" sempre il giorno con lo zero iniziale e così via.

A causa della natura sequenziale del formato dell'ora, potresti provare a tokenizzare una stringa di formato di "dd/mm/yyyy HH:nn" in un array ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"].Quindi vai avanti e forma una stringa di pattern da quell'array sostituendo "HH" con "([01][0-9]|2[0-3])" e così via.Precostruire questi atomi del modello in una tabella/array di ricerca.Tutte le parti dell'array che non sono nella tabella di ricerca sono letterali.Sfuggili secondo le regole regex e aggiungili alla stringa del modello.


MODIFICARE:Come effetto collaterale per una soluzione basata su regex, quando inserisci tutti gli "atomi" di regex della tua tabella di ricerca tra parentesi e tieni traccia del loro ordine in una determinata stringa di formato, sarai in grado di utilizzare le sotto-corrispondenze per estrarre i componenti richiesti da una corrispondenza e inserirli in una funzione CreateDate, saltando così del tutto la parte ParseDate.

Altri suggerimenti

Se stai cercando un controllo di base della data.questo codice corrisponde a questi dati.

\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

Codice tramite regexbuddy

SimpleDateFormat lo fa già con il parse() metodo.

Se devi analizzare più date da una singola stringa, inizia con una regex (anche se corrisponde in modo troppo indulgente) e utilizza parse() su tutte le potenziali corrispondenze trovate dalla regex.

Di seguito è riportato il codice js/jQuery per la generazione dinamica di espressioni regolari solo per il formato data, non per la data e l'ora (versione di sviluppo non ancora completamente testata.)

Il formato della data deve essere "GG M A"

per esempio.
GG-MM-AA,
GG-MM-AAAA,
AAAA-MM-GG,
AAAA-GG-MM,
MM-GG-AAAA,
MM-GG-AA,
GG/MM/AA,
GG/MM/AAAA,
AAAA/MM/GG,
AAAA/GG/MM,
MM/GG/AAAA,
MM/GG/AA
Oppure altri formati ma creati con il carattere [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: non esiste un controllo di convalida per mesi / giorni ad es.il mese dovrebbe essere compreso tra 01-12 oppure la data dovrebbe essere compreso tra 01-31

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top