2009-06-30 1 views
1

Ich bekomme Reisebestätigungen, die wie folgt aussehen: "SQ 966 E 27JUL SINCGK" = "Airline Space Flight Space BookingClass Space Date_with_Month_as_name Space 3LetterFrom 2LetterTo". Ich kann all das in Stücke schneiden mit einem Regex, um es auf einer Website einzureichen. Aber die Website würde statt 27. Juli 27/07/2009 oder mindestens 27/07 erwarten. Gibt es eine Möglichkeit, ein Regex-Ergebnis basierend auf einem Stück in der Eingabe zu transformieren? Jan -> 01, Februar -> 02 ... Dec -> 12.Ein Datum mit einem regulären Ausdruck von 24Dec zu 24/12 oder 24/12/2009 transformieren

(Regex Geschmack ist Java)

+0

Ist es nicht ein '3LetterTo' anstatt ein '2LetterTo'? Andernfalls haben Sie im Stichprobenstrang einen Buchstaben, der nicht angegeben ist. –

+0

Sie haben Recht 3LetterTo – stwissel

Antwort

1

In Perl-Syntax (s{pattern}{replacement}):

s{([0-9][0-9])JAN}{\1/01} 
s{([0-9][0-9])FEB}{\1/02} 
s{([0-9][0-9])MAR}{\1/03} 
s{([0-9][0-9])APR}{\1/04} 
s{([0-9][0-9])MAY}{\1/05} 
s{([0-9][0-9])JUN}{\1/06} 
s{([0-9][0-9])JUL}{\1/07} 
s{([0-9][0-9])AUG}{\1/08} 
s{([0-9][0-9])SEP}{\1/09} 
s{([0-9][0-9])OCT}{\1/10} 
s{([0-9][0-9])NOV}{\1/11} 
s{([0-9][0-9])DEC}{\1/12} 

(Ja, das ist lang und hässlich, aber es funktionieren würde wahrscheinlich).

+0

wäre es nicht eher s {([0-3] [0-9]) Monthname} {....? – stwissel

+0

die S {} {} ID von Perl? (Ich kenne Perl nicht). Also würde es keine "native" Maskierung/Ersetzen in RegEx geben? – stwissel

+0

Ja, das sind 12 separate Suchen-und-Ersetzen-Operationen. Jeder macht einen Monat. – user9876

5

DateFormat ist eine geeignetere Klasse:

DateFormat output = new SimpleDateFormat("dd/MM", Locale.US); 
DateFormat input = new SimpleDateFormat("dd MMM", Locale.US); 
System.out.println(output.format(input.parse("24 Dec"))); 

Ausgabe:

 
24/12 
+0

Ich kenne das Dateformat von Java. Leider kann ich die Java-Teile des Systems nicht ändern und alles, was ich kann die Regex manipulieren, die die Daten extrahiert. – stwissel

+0

wie Sie sehen können Ich habe DateFormat verwendet, um zu analysieren (als Regex) – dfa

0

Es ist keine Regex-Lösung, aber Sie könnten SimpleDateFormat verwenden, um Ihnen bei der endgültigen Formatierung zu helfen. Sie sollten in JavaDoc beachten, dass dies keine standardmäßige thread-sichere Option ist.

Alternativ können Sie DateFormatSymbols.getShortMonths() verwenden und über die Monate iterieren, um den Index * zu identifizieren und Ihre Zeichenfolge manuell zu formatieren.

* nicht vergessen 1 hinzuzufügen;)

edit:

Ich bin nicht sicher, was Sie suchen in Java Regex ohne ablility möglich ist, Code-Änderungen vornehmen. Die von Perl unterstützten bedingten Konstrukte werden von Java nicht unterstützt, da Java Unterstützung für if-then-else als Sprachfeature bietet.

+0

Entschuldigung. Ich kann die Java-Teile dieses Systems nicht berühren, nur die Regex kann konfiguriert werden. – stwissel

+0

Schade. Sofern es sich nicht um eine Anwendung mit versiegelten Gläsern handelt, sollten Sie in der Lage sein, ein Glas vor dem Klassenpfad zu platzieren, mit einer neu definierten Version der problematischen Klasse. Nur um Ihnen eine weitere Waffe gegen die schlechten Daten zu geben :) –

0

Ich würde sehr vorsichtig mit regulären Ausdrücken tun, da sie Ihnen nicht sagen, wie die Konvertierung ging.

Alle Informationen manuell extrahieren. Überprüfen Sie alles und überprüfen Sie dann Verwenden Sie den SimpleDateFormat-Parser, um ein Date-Objekt abzurufen, das Sie von dort aus verwenden können.

+0

yep. Regex machen Spaß. Sie könnten den Welthunger wahrscheinlich lösen, wenn eine ausreichende Anzahl von Menschen sie verstehen würde. Meine Herausforderung: Die Regex befindet sich in einer Konfigurationseinstellung eines Systems, das ich sonst nicht anfassen kann. – stwissel

+0

Regexps kann den Rekursionszustand nicht beibehalten. Probieren Sie einfach HTML-Validierung mit einem. Aber um Ihre Frage richtig zu beantworten, müssen Sie sehr genau angeben, WAS Sie zur Verfügung haben und wie dies behoben werden kann.Bemerkenswerterweise ist die Regexp-Engine-Implementierung wichtig - die in der Laufzeitbibliothek ist viel weniger leistungsfähig als eine voll entwickelte Perl-Regexp-Engine. –

+0

@ Thorbjørn: Es ist ein Produkt in Java geschrieben (und ich habe keinen Zugriff auf den Quellcode). Was ich tun kann, ist eine Regex zu konfigurieren und die resultierenden Gruppen auf Felder in den Zielsystemen (z. B. ein Webformular oder eine Datenbanktabelle) zuzuordnen. Also alles, was ich tun kann, muss in der Regex-Zeichenfolge passieren. ... und thx Zeit damit verbringen. – stwissel