Java - Auszug Datum aus string mittels regex - versagt
Ich versuche zu extrahieren 2 stammt aus einem string mittels regex - und für einige Grund - die regex nicht entpacken Termine - das ist mein code:
private String[] getDate(String desc) {
int count=0;
String[] allMatches = new String[2];
Matcher m = Pattern.compile("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d(?:,)").matcher(desc);
while (m.find()) {
allMatches[count] = m.group();
}
return allMatches;
}
Meine string - desc is: "coming from the 11/25/2009 to the 11/30/2009"
und ich bekomme wieder ein null-array...
- Dein regex ist für das format
dd-MM-yyyy
, und der string hatMM-dd-yyyy
. Lösung: Sie brauchen eine konsistente formatieren überall, das ist nicht immer möglich, mit user-input. Sie können nicht akzeptieren, denn Sie würde nicht wissen, was01-02-2013
stellt... - +1 Kobi. Sie sollten auch nicht vergessen zu erhöhen
count
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie den Monat und den Tag des Monats nach hinten, und
(?:,)
wird, verlangt ein Komma am Ende eines jeden date. Versuchen Sie dies:Deine regex passt ersten Tag und dann den Monat (TT/MM/JJJJ), während Sie Ihre Eingaben beginnen mit Monat und dann der Tag (TT/MM/JJJJ).
Darüber hinaus Ihre Termine werden muss, gefolgt von einem Komma ergänzt werden (die
(?:,)
Teil).Sollte man dieses an Ihre Bedürfnisse anpassen:
Diagramm von Debuggex.
3 Probleme :
1) Sie versuchen, zu analysieren, Datum mit format
dd/MM/YYYY
wo, wie dein regex hat formatMM/dd/YYYY
.2) Du hast vergessen zu erhöhen
count
in der while-Schleife.3) Die
(?:,)
Teil am Ende des regex ist nutzlos.Dieser codes funktioniert auf meinem computer :
Test :
Ausgabe :
Einem date pattern-recognition-Algorithmus, um nicht nur zu identifizieren, Datum Muster, aber holt auch voraussichtliches Datum in Java date format. Dieser Algorithmus ist sehr schnell und leicht. Die Verarbeitung ist die Zeit linear und alle Termine sind identifiziert, in einem Arbeitsgang. Algorithmus löst Datum mit Baum-traverse-Mechanismus. Baum-Datenstrukturen sind speziell entwickelt, um unterstützte Datum, Zeit und Monat mustern.
Der Algorithmus erkennt auch an mehrere Leerzeichen zwischen Datum-Literale. E. g. DD DD DD DD DD DD werden als gültige Daten.
Folgenden Datum-Muster werden als gültig betrachtet und sind erkennbar mit diesem Algorithmus.
dd-MM(MM) yy - (yy) yy - (yy) MM(MM) dd-MM(MM) dd-yy(yy)
Wobei M für Monat literal alphabet format wie Jan oder Januar
Erlaubt Trennzeichen zwischen Daten sind '/', '\', ' ', ',', '|', '-', ' '
Er erkennt auch trailing-Zeit-Muster im format hh(24):mm:ss.SSS am /pm hh(24):mm:ss am /pm hh(24):mm:ss am /pm
Auflösung ist die Zeit linear, kein pattern-matching oder brute-force verwendet wird. Dieser Algorithmus basiert auf Baum-traversal-und kehrt zurück, der Liste der Datum mit folgenden drei Komponenten - Datums-Zeichenfolge identifiziert die in text konvertiert & formatierte Datums-Zeichenfolge - " = SimpleDateFormat
Verwenden von Datums-string und format-string sind die Benutzer frei, konvertieren Sie die Zeichenfolge in Objekte basierend auf Ihren Anforderungen.
Den Algorithmus-Bibliothek ist verfügbar in maven central.
Den sample-code zu verwenden, dieser ist unten.
Ausgabe: [LocalDateModel{originalText=2015-Januar-10 18:00:01.704, dateTimeString=2015-1-10 18:00:01.704, conDateFormat=yyyy-MM-dd HH:mm:ss.SSS, start=18, Ende=46}]
Ausführliche blog unter http://coffeefromme.blogspot.com/2015/10/how-to-extract-date-object-from-given.html
Der vollständige Quellcode ist verfügbar auf GitHub unter https://github.com/vbhavsingh/DateParser
code
markup zu bewahren, Räume und Formate?LocalTime.parse
statt regexRegex kann overkill für so ein problem.
Könnte man teilt den string auf LEERZEICHEN, und versuchen Sie zu analysieren, jedes element als
LocalDate
. Wenn das Parsen fehlschlägt, gehen Sie zum nächsten element.Sehen diese code ausführen, live auf IdeOne.com.