Question

Existe-t-il une solution existante pour créer dynamiquement des expressions régulières à partir d'un modèle de format date/heure donné ?Le modèle de format de date et d'heure pris en charge n'a pas d'importance (Joda DateTimeFormat, java.text.SimpleDateTimeFormat ou autres).

c'est à dire.pour un format date-heure donné (par exemple "jj/MM/aaaa hh:mm"), il générera l'expression régulière correspondante pour faire correspondre les date-heures dans les formats spécifiés.

Était-ce utile?

La solution

Je suppose que vous disposez d'un alphabet limité à partir duquel vos formats d'heure peuvent être construits.Cela signifie, "HH" serait toujours "heures" sur l'horloge de 24 heures, "dd" toujours le jour avec zéro en tête, et ainsi de suite.

En raison de la nature séquentielle d'un format d'heure, vous pouvez essayer de tokeniser une chaîne de format de "dd/mm/yyyy HH:nn" dans un tableau ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"].Ensuite, formez une chaîne de modèle à partir de ce tableau en remplaçant "HH" avec "([01][0-9]|2[0-3])" et ainsi de suite.Préconstruisez ces atomes de modèle dans une table/un tableau de recherche.Toutes les parties de votre tableau qui ne figurent pas dans la table de recherche sont des littéraux.Échappez-les selon les règles d'expression régulière et ajoutez-les à votre chaîne de modèle.


MODIFIER:Comme effet secondaire pour une solution basée sur les expressions régulières, lorsque vous placez tous les "atomes" d'expressions régulières de votre table de recherche entre parenthèses et que vous suivez leur ordre dans une chaîne de format donnée, vous pourrez utiliser des sous-correspondances pour extraire les composants requis. à partir d'une correspondance et les introduisez dans une fonction CreateDate, ignorant ainsi complètement la partie ParseDate.

Autres conseils

Si vous recherchez une vérification de date de base.ce code correspond à ces données.

\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

Code via regexbuddy

SimpleDateFormat le fait déjà avec le parse() méthode.

Si vous devez analyser plusieurs dates à partir d'une seule chaîne, commencez par une expression régulière (même si elle correspond de manière trop indulgente) et utilisez parse() sur toutes les correspondances potentielles trouvées par la regex.

Ci-dessous, le code js/jQuery pour Dynamic génère une expression régulière pour le format de date uniquement, pas pour la date et l'heure (la version de développement n'est pas encore entièrement testée.)

Le format de la date doit être au format « J M Y »

par exemple.
JJ-MM-AA,
JJ-MM-AAAA,
AAAA-MM-JJ,
AAAA-JJ-MM,
MM-JJ-AAAA,
MM-JJ-AA,
JJ/MM/AA,
JJ/MM/AAAA,
AAAA/MM/JJ,
AAAA/JJ/MM,
MM/JJ/AAAA,
MM/JJ/AA
Ou d'autres formats mais créés avec le caractère [ 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);

Remarque - il n'y a pas de vérification de validation pendant des mois / jours, par exemple.le mois doit être entre 01 et 12 ou la date doit être entre 01 et 31

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top