2008-09-09 26 views
4

Gibt es eine bestehende Lösung, um reguläre Ausdrücke dynamisch aus einem vorgegebenen Datumsformat zu erstellen? Das unterstützte Datum/Uhrzeit-Format spielt keine Rolle (Joda DateTimeFormat, java.text.SimpleDateTimeFormat oder andere).Dynamische Regex für Datumsformate

d. H. Für ein gegebenes Datum-Zeit-Format (zum Beispiel "TT/MM/JJJJ hh: mm") wird ein entsprechender regulärer Ausdruck erzeugt, um die Datumszeiten innerhalb der angegebenen Formate zu entsprechen.

Antwort

3

Ich glaube, Sie haben eine begrenzte Alphabet haben, die Ihre Zeitformate aufgebaut sein können. Das heißt, "HH" wäre immer "Stunden" auf der 24-Stunden-Uhr, "dd" immer der Tag mit führender Null, und so weiter.

Aufgrund der sequentiellen Art eines Zeitformats könnten Sie versuchen, eine Formatzeichenfolge von "dd/mm/yyyy HH:nn" in ein Array ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"] zu tokenisieren. Dann gehen Sie weiter und bilden Sie eine Muster-String von diesem Array durch Ersetzen "HH" durch "([01][0-9]|2[0-3])" und so weiter. Preconstruct diese Muster Atome in eine Nachschlagetabelle/Array. Alle Teile Ihres Arrays, die nicht in der Nachschlagetabelle enthalten sind, sind Literale. Entkomme sie nach den entsprechenden Regex-Regeln und füge sie an deine Musterzeichenfolge an.


EDIT: Als Nebeneffekt für eine regex-basierte Lösung, wenn Sie all regex „Atom“ der Lookup-Tabelle in Pars setzen und zu verfolgen, deren Reihenfolge in einem Format-String gegeben, wäre in der Lage sein, Verwenden Sie Unterübereinstimmungen, um die erforderlichen Komponenten aus einer Übereinstimmung zu extrahieren und sie in eine CreateDate-Funktion einzufügen, wodurch der ParseDate-Teil vollständig übersprungen wird.

+0

Das funktioniert anständig, aber es ist eher englisch-zentriert . "ddd" könnte dann auf (mon | tue | wed | thu | fri | sat | sun) abgebildet werden, aber Sie benötigen eine locale-abhängige Zuordnung. Sie wird schlechter, wenn das Datumsformat Nicht-ASCII-Ziffern erzeugt M.Kaplan's Blog für weit mehr Details zu i18n. – MSalters

+0

Ja, genau das brauche ich. Ich dachte, etwas ähnliches zu tun, da ich nichts finden konnte, was bereits existiert. Zum Analysieren von dateTimeFormat habe ich jflex verwendet. Also, wenn es "d" ist, sollte es 1 oder 2 Ziffern entsprechen oder wenn es "ddd" ist, sollte es 3 Ziffern usw. entsprechen. Jedoch muss ich es noch für i18n verbessern. – hakan

+0

@MSalter. Könnten Sie den Link für den von Ihnen erwähnten Blog angeben? Danke – hakan

0

SimpleDateFormat tut dies bereits mit der parse() Methode.

Wenn Sie mehrere Daten von einer einzelnen Zeichenfolge analysieren müssen, beginnen Sie mit einer Regex (auch wenn es zu nachsichtig entspricht), und verwenden Sie parse() für alle potenziellen Übereinstimmungen, die von der Regex gefunden werden.

+0

sein, es wird nur analysiert, wenn der angegebene Text dem Muster entspricht, und gibt die Date-Objektdarstellung dieser Zeichenfolge zurück. Es wird nicht analysiert, wenn sich die Datumsinformation irgendwo innerhalb der anderen Texte befindet. wie "sometext 12/03/2004 sometext. – hakan

+0

Das könnte unentscheidbar sein. Was ist, wenn der Text zwei Daten enthält, zB" Zwischen A und B, blah "wo A und B Daten sind ... –

+0

naja, dann werden sie sie finden als zwei Gruppen, genau wie eine Regex-Suche – hakan

1

Wenn Sie nach grundlegenden Datum Überprüfung suchen. Dieser Code stimmt mit diesen Daten überein.

\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

+0

was ich brauche, ist ein Regex-Generator für das angegebene DateTimeFormat.Ich weiß nicht das Datumsformat in dem gegebenen Korpus verwendet.Daher sollte der Benutzer zuerst durch bereitstellen sag sowas wie DDMM hh: mm und ich finde diese Datumswerte im Text. Ich habe mit JFlex etw erstellt. Ich werde es hier auch posten, nachdem ich es aufgeräumt habe. – hakan

0

unten js/jQuery-Code für dynamische generieren regex für Datumsformat, nicht für das Datum Zeit (Entwicklerversion noch nicht vollständig getestet.)

Datumsformat in "D M Y" sein sollte

zB.
DD-MM-YY,
DD-MM-YYYY,
YYYY-MM-DD,
YYYY-DD-MM,
MM-DD-YYYY,
MM-DD-YY,
TT/MM/JJ
, TT/MM/YYYY,
YYYY/MM/DD,
YYYY/TT/MM,
MM/DD/YYYY,
MM/TT/JJ
oder andere Formate, sondern erstellt mit [DMY] Character

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 in 01-12 sein. Oder das Datum sollte in 01-31

Verwandte Themen