Date Validation mit Regex

Adi_M

Grünschnabel
Hallo Leute, bin ganz neu hier und hoffe das ihr mir helfen könnt.
Ich versuche einen DateValidator zu schreiben, und zwar mit einem regex-pattern. Dieses hab ich mir von regexlib geholt. Allerdings krieg ichs nicht hin, dieses in meinem eclipse richtig zu escapen.

Code:
private static final String _DATUM_PATTERN = "^((0?[13578]|10|12)[\.\-\/](([1-9])|(0[1-9])|([12])([0-9]?)|(3[01]?))[\.\-\/]((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1}))|(0?[2469]|11)[\.\-\/](([1-9])|(0[1-9])|([12])([0-9]?)|(3[0]?))[\.\-\/]((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1})))$";
wenn ich das im eclipse eingebe, dann bekomm ich "Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )"

Hab schon eine Menge gegoogled, aber irgendwie versteh ichs einfach nicht. Könnte einer von euch Experten das richtig escapen und erklären was ich falsch gemacht hab. Bitte!
 
Das ist ein typischer Anfängerfehler in Sachen RegEx.
In Java musst du die Escape-Sequenzen selbst escapen. So wird dann z.B. für einen einfachen Punkt aus "." *für JEDES Zeichen* ein "\\." da "\." keine gültige Escape-Sequenz darstellt.
Du musst jetzt also in deinem Pattern einfach nur vor jeden Backslash "\" einen zweiten setzen.
 
woah, vielen Dank für die schnelle Antwort!
Hab mich auf div. Seiten durch HowTo's gekämpft, aber das die Lösung so einfach ist... :/ Entweder muss ich mein English verbessern, oder ich bin doch noch etwas zu doof für regex.
Falls es den Forumregeln entspricht, würde ich diesen Thread gerne noch offen lassen und nicht als "Solved" markieren. Hab so das Gefühl, dass noch ein paar Fragen mehr auftauchen werden.

Danke nochmals für die schnelle Hilfe
 
Nein ... das Problem ist das du diesen Hinweis auch nicht in der offiziellen Java-Doc findest.
Es steht zwar in der Beschreibung von Pattern was man alles für Escape-Sequenzen hat, aber es fehlt der Hinweise das diese Escape-Sequenzen ebenfalls zu escapen sind da es sich ja immer noch um einen simplen String handelt.

Also bestes Beispiel eignet sich ein Backslash "\". Wenn du in einer RegEx auf einen einfachen Backslash "\" prüfen willst wäre die "normale" Darstellung in einem String folglich "\\". Da aber "\\" in RegEx gerade mal eine Escape-Sequenz einleitet musst du dahinter natürlich noch die Sequenz angeben. Da du jetzt aber auch den zweiten Backslash escapen musste um einen Backslash zu bekommen und keine neue Escape-Sequenz des nächsten Zeichens musst du also um EINEN Backslash mit einer RegEx zu finden das hier schreiben : "\\\\". Stell dir dann noch vor das du z.B. eine smb://-Adresse parsen willst die ja mit zwei Backslashes beginnt ... dann müsstest du um diese ZWEI Backslashes zu parsen ACHT in die RegEx schreiben.
 
Zurück