2012-04-04 3 views
3

Ich muss den Wert meines Geburtsdatum Eingabefeldes überprüfen. Es sollte mehrere Möglichkeiten geben: dd.MM.yyyy, dd.M.yyyy, d.MM.yyyy, d.m.yyyy und auch dd.MM.yy, dd.M.yy, d.MM.yy, d.m.yy. Zum Beispiel können Sie 07.03.1993, 7.3.93 oder was auch immer eingeben.jsf - validate date mit Ausdruck Sprache

Die folgende Regex Beispiel wird überprüft nur die Formatprüfung, aber es funktioniert nicht, wenn das Datum existiert

(zB 2011.02.29 oder 47.02.2011 wird erlaubt sein) bearbeiten
String s = (String) arg2; 
     String pattern = "^(\\d{2}|\\d{1})\\.(\\d{2}|\\d{1})\\.(\\d{2}|\\d{4})$"; 
     Pattern p = Pattern.compile(pattern); 
     Matcher m = p.matcher(s); 

     if (m.matches()) { 
      System.out.println(("date correct")); 
     } else { 
      System.out.println("date incorrect"); 
     } 

Ich, der gerade erstellt folgende regex Anweisung, nun überprüft, ob der Monat größer als 12 ist und der Tag ist größer als 31. ich glaube, ich Regex zuerst verwenden sollte, und dann das Datum bestätige mit SimpleDateFormat

String s = "^((0?[1-9]|[12][0-9]|3[01])\\.(0?[1-9]|1[012])\\.((19|20)\\d{2})$"; 

Antwort

2

wenn regex kein muss ist, Sie können versuchen, Ihre Zeichenfolge in ein Datum zu konvertieren die parse Methode von java.text.SimpleDateFormat und sehen, ob es gelingt.

Wenn dies der Fall ist (Sie erhalten ein gültiges Objekt Date), haben Sie ein gültiges Datum in Ihrem Formular (oder Eingabe) eingegeben. Wenn es nicht erfolgreich ist, gibt die parse Funktion null zurück und die Eingabe String war ungültig.

Here ist das Javadoc für die parse Methode.

EDIT: Für die zusätzliche Validierung, falls Sie nicht setLenient verwenden möchten, können Sie die Date verwenden, die Sie von parse erhalten und wandeln es wieder in eine String das gleiche Format verwenden. Dann vergleichen Sie einfach die String aus der Konvertierung mit der, die Sie als Eingabe liefern. Wenn sie übereinstimmen, haben Sie eine gültige Eingabe.

+0

Die Analyse-Methode ermöglicht ein 29.02-Datum für ein Nicht-Schaltjahr – Simeon

+2

'SimpleDateFormat.parse' führt keine Validierung durch. Z.B. Wenn Sie das tun \t \t 'Datum d = neu SimpleDateFormat (" yyyy-MM-dd "). parse (" 2012-01-32 ");', dann bezieht sich das Datum d auf den 1. Februar: st, weil die Tage " Überlauf "in den Monat. – Alderath

+3

Das ist nicht wahr Alderath, verwenden Sie 'setLenient (false)', dann gibt Ihr Datum eine Ausnahme –

0

Sie können es teilen, um Tag und Monat Teile des Datums zu erhalten.

Dann können Sie so etwas wie:

final int dayToCheck = 32; // user input 
final int month = 2; // user input 
final int year = 1981; // user input   

final Calendar cal = Calendar.getInstance(); 
cal.set(year, month, 1); // day doesn't need to be the user input, it can be any day in the month you want to check 

if (cal.getActualMaximum(Calendar.DAY_OF_MONTH) > dayToCheck) { 

    // the day is invalid 
} 
if (cal.getActualMinimum(Calendar.DAY_OF_MONTH) < dayToCheck) { 

    // again, the day is invalid 
} 

Sie die gleiche Prüfung mit Calendar.MONTH Feld tun können.

Ich habe nicht überprüft, ob dies kompiliert, aber Sie sollten die Idee bekommen.

+0

Es wird keinen Fehler geben, wenn Sie 'cal.set (2011,02,29)' schreiben. Also bevorzuge ich die Lösung von @ lucian.pantelimon und kombiniere sie mit meiner Arbeit. –

+0

@YvesBeutler Wie ich in der Antwort sagte: Sie müssen nicht die komplette Benutzereingabe einstellen, wenn Sie den Kalender erstellen. Sie müssen nur das Jahr und den Monat einstellen (Sie können immer 1 für den Tag einstellen). Verwenden Sie dann 'cal.getActualMaximum (Calendar.DAY_OF_MONTH)', um es mit der Benutzereingabe für den Tag zu vergleichen. – Simeon

+0

Ja, das stimmt. Aber ich denke, es ist ein besserer Weg, das 'SimpleDateFormat' überprüfen zu lassen, ob das Datum korrekt ist, als eine selbstgemachte Lösung wie Ihre. –