Frage

Gibt es eine bestehende Lösung, um reguläre Ausdrücke dynamisch aus einem bestimmten Datums-/Uhrzeitformatmuster zu erstellen?Das unterstützte Formatmuster für Datum und Uhrzeit spielt keine Rolle (Joda DateTimeFormat, java.text.SimpleDateTimeFormat oder andere).

d.h.Für ein bestimmtes Datums-/Uhrzeitformat (z. B. „TT/MM/JJJJ hh:mm“) wird ein entsprechender regulärer Ausdruck generiert, der mit den Datums- und Uhrzeitangaben innerhalb der angegebenen Formate übereinstimmt.

War es hilfreich?

Lösung

Ich vermute, Sie haben ein begrenztes Alphabet, aus dem Ihre Zeitformate erstellt werden können.Das bedeutet, "HH" wäre immer „Stunden“ auf der 24-Stunden-Uhr, "dd" immer der Tag mit führender Null usw.

Aufgrund der sequentiellen Natur eines Zeitformats könnten Sie versuchen, eine Formatzeichenfolge von zu tokenisieren "dd/mm/yyyy HH:nn" in ein Array ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"].Fahren Sie dann fort und bilden Sie durch Ersetzen eine Musterzeichenfolge aus diesem Array "HH" mit "([01][0-9]|2[0-3])" und so weiter.Konstruieren Sie diese Musteratome vorab in einer Nachschlagetabelle/einem Nachschlagefeld.Alle Teile Ihres Arrays, die nicht in der Nachschlagetabelle enthalten sind, sind Literale.Entführen Sie sie entsprechend den Regex-Regeln und hängen Sie sie an Ihre Musterzeichenfolge an.


BEARBEITEN:Als Nebeneffekt einer auf Regex basierenden Lösung könnten Sie, wenn Sie alle Regex-„Atome“ Ihrer Nachschlagetabelle in Klammern setzen und ihre Reihenfolge in einer bestimmten Formatzeichenfolge verfolgen, Unterübereinstimmungen verwenden, um die erforderlichen Komponenten zu extrahieren aus einer Übereinstimmung und füttere sie in eine CreateDate-Funktion ein, wodurch der ParseDate-Teil vollständig übersprungen wird.

Andere Tipps

Wenn Sie nach einer einfachen Datumsüberprüfung suchen.Dieser Code entspricht diesen Daten.

\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 über regexbuddy

SimpleDateFormat macht das schon mit dem parse() Methode.

Wenn Sie mehrere Datumsangaben aus einer einzelnen Zeichenfolge analysieren müssen, beginnen Sie mit einem regulären Ausdruck (auch wenn dieser zu wenig übereinstimmt) und verwenden Sie parse() auf alle potenziellen Übereinstimmungen, die von der Regex gefunden werden.

Unten angegebener js/jQuery-Code für die dynamische Generierung von Regex nur für das Datumsformat, nicht für Datum und Uhrzeit (Entwicklungsversion noch nicht vollständig getestet).)

Das Datumsformat sollte „D M Y“ sein.

z.B.
TT-MM-JJ,
DD / MM / JJJJ,
JJJJ-MM-TT,
JJJJ-TT-MM,
MM-TT-JJJJ,
MM-TT-JJ,
TT/MM/JJ,
DD / MM / JJJJ,
JJJJ/MM/TT,
JJJJ/TT/MM,
MM/TT/JJJJ,
MM/TT/JJ
Oder andere Formate, jedoch mit dem Zeichen [D M Y] erstellt

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);

Hinweis- Es gibt keine Validierungsprüfung für Monate / Tage, z.Der Monat sollte zwischen 12.01. und das Datum zwischen 31.01. liegen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top