2010-12-03 8 views
-1

Gibt es eine Möglichkeit, eine Java-Regex zu verwenden, um eine Zeichenfolge in ein bestimmtes Format zu ändern? Zum Beispiel habe ich eine Eingabe String mit einem Datum & Zeit, die mit einer Vielzahl von Trennzeichen eingegeben werden kann, kann ich eine Regex verwenden, um es zu ändern, um ein bestimmtes Trennzeichen zu verwenden? Wenn ich kann, wie kann ich es tun? Zur Zeit bin ich gerade überprüft die Eingabe mit einem regulären Ausdruck und dann eine neue String zusammen mit den gewünschten Trennzeichen wie verketten so:Gibt es eine Möglichkeit, eine Java-Zeichenfolge mit regulären Ausdrücken neu zu formatieren?

Pattern dtPatt = Pattern.compile("\\d\\d\\d\\d[/\\-.]\\d\\d[/\\-.]\\d\\d[tT/\\-.]\\d\\d[:.]\\d\\d[:.]\\d\\d"); 
Matcher m = dtPatt.matcher(dtIn); 
if (m.matches()) { 
    String dtOut = dtIn.substring(0, 4) + "/" + dtIn.substring(5, 7) + "/" + 
        dtIn.substring(8, 10) + "-" + dtIn.substring(11, 13) + ":" + 
        dtIn.substring(14, 16) + ":" + dtIn.substring(17, 19); 
    // do processing with dtOut 
} else { 
    System.out.println("Error! Bad date/time entry."); 
} 

Es scheint, wie sollte ich in der Lage sein, dies mit einem regulären Ausdruck zu tun, aber viele googeln, lesen und experimentieren hat nichts ergeben, was funktioniert.

+0

Als eine Randnotiz, je nachdem, wo Sie dies setzen, könnte es furchtbar ineffizient wegen der Erstellung des Musters werden. – Woot4Moo

+0

@ Woot4Moo: Danke für den Gedanken. In der Produktion würde ich eine unbekannte - und theoretisch unbegrenzte - Anzahl von Datum/Zeit-Strings bearbeiten. – GreenMatt

+0

@GreenMatt in diesem Fall sollten Sie vielleicht von der Verwendung des Java Regex abweichen und es an eine separate Sprache wie Perl oder Python weitergeben. Ich mag mich irren, aber ich glaube, dass keine dieser Sprachen kompiliert wird und das Öffnen eines Datenstroms weniger intensiv ist, als das Biest jedes Mal neu zu kompilieren. – Woot4Moo

Antwort

3

Versuchen Sie, die folgende

Pattern dtPatt = Pattern.compile("(\\d\\d\\d\\d)[/\\-.](\\d\\d)[/\\-.](\\d\\d)[tT/\\-.](\\d\\d)[:.](\\d\\d)[:.](\\d\\d)"); 
    Matcher m = dtPatt.matcher(str); 

    if (m.matches()) 
    { 
     StringBuffer sb = new StringBuffer(); 
     m.appendReplacement(sb, "$1/$2/$3-$4:$5:$6"); 

     String result = sb.toString(); 
    } 
    else 
    { 
     System.out.println("Error! Bad date/time entry."); 
    } 

Zwei Änderungen

  • Ändern der RegexMuster Gruppierungen haben, mit()
  • Verwendung appendReplacement mit ein Ersetzungsmuster, bei dem $ x eine bestimmte Gruppe verwendet, die dem Muster entspricht.
+0

Nice one! Ich bin es so gewöhnt, 'appendReplacement()' "korrekt" zu benutzen, dass ich ein paar Minuten brauchte, um mich davon zu überzeugen, dass das sicher war. Das entscheidende Element ist, dass Sie 'matches()' anstelle von 'find()' verwenden. –

2

würde ich

DateFormat DF = new SimpleDateFormat("yyyy/MM/dd-HH:mm:dd"); 

String dtIn2 = String.format("%s/%s/%s-%s:%s:%s", dtIn.split("\\D+")); 
DF.parse(dtIn2); // to validate the date produced. 
+0

Danke. Ja, der springende Punkt ist, den String Datum/Uhrzeit zu etwas zu machen, das ein SimpleDateFormat verarbeiten kann. – GreenMatt

+0

BTW, ich denke, Sie meinen "ss" (anstelle von "dd") am Ende Ihres SimpleDateFormat Konstruktor Aufrufs. – GreenMatt

1

Versuchen Matcher die appendReplacement() und appendTail() Methoden versuchen. Es ist ein gutes Beispiel in appendReplacement():

Pattern p = Pattern.compile("cat"); 
Matcher m = p.matcher("one cat two cats in the yard"); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    m.appendReplacement(sb, "dog"); 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); 
+0

OK, aber was ist der Unterschied zu '" einer Katze zwei Katzen im Hof ​​".replace (" Katze "," Hund ")'? Abgesehen davon, dass Ihre Version Regex verwendet und länger ist? –

+0

Danke für den Vorschlag. Ich hatte schon so etwas gesehen, aber es hat nicht funktioniert (nett) mit meinen Umständen. – GreenMatt

Verwandte Themen