Frage von Dollarboy51, 21

Kann mir jemand weiterhelfen zwecks regulärem Ausdrucks verstehe das garnicht?

c) Erstellen Sie einen regulären Ausdruck oder einen endlichen Automaten, der ein Geburtsdatum von Studierenden erkennt, das in deutscher Schreibweise angegeben und von Leerzeichen umgeben ist. Folgende Zeichenketten sollten z.B. erkannt werden: • 03.05.1992 1.9.1988 03.05.95 Folgende Zeichenketten sollten nicht erkannt werden: • 03/04/1995 192.168.2.1 3.05.195 05.1992

Antwort
von Hochith, 9

So sollte es gehen. In C# gibts die Klasse Regex() dafür:

[0-3]{0,1}[0-9]\.[0-1]{0,1}[0-9]\.[0-9]{4,2}
Kommentar von KnorxyThieus ,

(Ich bin nur ein neugieriger Nutzer, der das verstehen möchte ...:)

Mit RegEx kenne ich mich noch nicht aus. Stehen die geschweiften Klammern für die Anzahl der WIederholungen des vorherigen Elements?
Wie werden denn so Daten wie der 30.2.99 ausgeschlossen? :)

Kommentar von PWolff ,

Einzelne Zahlen zwischen geschweiften Klammern gibt die verlangte Zahl von Wiederholungen an ({1} ist - wie erwartet - gleichbedeutend mit "keine Angabe").

Zwei Zahlen - die erste kleiner oder gleich der zweiten - geben untere und obere Grenze der Wiederholungen an. {3,15} bedeutet: mindestens 3, höchstens 5 Wiederholungen.

Eine ausgelassene 2. Zahl bedeutet "beliebig viele", d. h. {3,} bedeutet: mindestens 3 Wiederholungen, keine Höchstzahl.

Erste Zahl größer als zweite Zahl kenne ich nicht und finde ich auch nicht auf http://www.regular-expressions.info/repeat.html unter "Limiting Repetition".

Daten wie der "35.17.0999" werden hierdurch nicht ausgeschlossen.

Aber Reguläre Ausdrücke sind bestenfalls ein Mittel, um die allergröbsten Fehleingaben bei Daten zu eliminieren. Am besten greift man da auf spezielle Datum-Parser zurück - kann man selbst schreiben, ist nicht allzu schwierig, aber wegen der vielen Fallstricke sollte man einen der mit den meisten Umgebungen mitgelieferten nehmen.

Kommentar von KnorxyThieus ,

Wow, da kennt sich einer aus! :D

Kann man auch eigene Funktionen nach dem Prinzip "alle Zweierpotenzen" etc. definieren, also {1, 2, 4, 8, ...}? :=

Kommentar von Dollarboy51 ,

Danke erstmal für die schnelle Antwort unser Prof hat als Lösung (\d){1,2} \. (\d){1,2} \. ( \d{2} | \d{4} ) \b wie wird diese intepretiert?? kannst du mir da weiterhelfen? mfg 

Kommentar von PWolff ,

Vermutlich soll vor und nach dem ganzen Ausdruck noch ein Leerzeichen stehen? Oder auch vor dem Ausdruck ein "\b"?

\d steht für eine einzelne Ziffer (0 bis 9, in Unicode auch aus anderen Alphabeten)

Die Klammer um \d ist überflüssig, erhöht aber wohl in den Augen des Profs die Übersichtlichkeit.

{1,2} heißt, dass das vorangegangene Zeichen bzw. die vorangegangene Gruppe (durch runde Klammern "(...)" zusammengefasst) 1- bis 2mal wiederholt wird, nicht weniger und nicht mehr.

Buchstaben stehen in Regulären Ausdrücken für sich selbst, es sei denn, ihnen ist das Escape-Zeichen, der Backslash ("\"), vorangestellt.

Andere Zeichen haben oft Spezialbedeutungen, hier der Punkt ("."), der für ein beliebiges Zeichen steht.

Damit der Reguläre Ausdruck weiß, dass man kein beliebiges Zeichen, sondern wirklich den Punkt meint, stellt man wiederum einen Backslash vor: \.

Die Leerzeichen innerhalb des Ausdrucks bedeuten Leerzeichen; sie gehören in diesem Fall also NICHT hierhin. (Es sei denn, man kann der verwendeten RegEx-Machine sagen, dass sie ignoriert werden sollen; das ist aber nicht Standard.)

Beim Monat gilt wieder dasselbe wie beim Tag.

Beim Jahr haben wir eine Gruppe (erkennbar an den runden Klammern). Ein Ausdruck, der in Klammern steht, wird - wie in der Mathematik - für sich ausgewertet, bevor das Ergebnis in den übergeordneten Ausdruck eingeht.

Zwischen den Elementen steht das Zeichen "|", das steht hier für "oder", d. h. der Ausdruck passt, wenn mindestens einer der Teilausdrücke passt. Das geht auch mit mehr als zwei Teilausdrücken:

"ausdr1|ausdr2|ausdr3|ausdr4" passt genau dann, wenn mindestens einer der Teilausdrücke ausdr1, ..., ausdr4 passt.

Die beiden Teilausdrücke für das Jahr bedeuten: "genau 2 Ziffern" bzw. "genau 4 Ziffern".

Das \b steht für eine Wortgrenze, also ein Übergang von einem "Wort-Zeichen" zu einem "Nicht-Wort-Zeichen" oder umgekehrt.

"Wort-Zeichen" sind Buchstaben und Ziffern (aus allen Alphabeten) und der Unterstrich (Buchstaben einschl. hochgestellter Buchstaben). Alle anderen Zeichen sind "Nicht-Wort-Zeichen."

\b passt also auf den Übergang zwischen "=" und "A" in "=A" und den Übergang von "s" zu "." in "Haus." Beachte, dass es nicht auf ein Zeichen selbst passt, sondern nur auf den "Spalt" dazwischen.

Damit würde der genannte Ausdruck (ohne die Leerzeichen) zwar die genannten zu verwerfenden Werte auch verwerfen, aber z. B. auch Werte wie

99.99.0123

akzeptieren, und mit dem "\b" am Ende aus

10.0.0.44

den Teil

10.0.0

als Datum interpretieren.

Antwort
von PWolff, 1

Gute Quelle für alles, was mit Regular Expressions zusammenhängt:

http://www.regular-expressions.info/tutorial.html

Struktur offensichtlich:

Tag.Monat.Jahr

Tag: 1..9 oder 01..09 oder 10..31

Monat: 1..9 oder 01..09 oder 10..12

Jahr: 00..99 oder 1900..2100 (?)

Punkt: \.

Begrenzt von Leerzeichen - nur Leerzeichen im engeren Sinne oder generell whitespaces?

Leerzeichen: 
White Space: \s

Damit:

\s(((0?[1-9])|([1-2][0-9])|3[0-1])\.((0?[1-9])|(1[0-2]))\.((19|20)?\d{2}))\s

Gruppe[1] enthält den Datumsausdruck, Gruppe[2] den Tag, Gruppe[4] oder so den Monat, Gruppe[6] oder so das Jahr.

Genau müsste ich es aber noch mal ausprobieren.

Kommentar von PWolff ,

Die RegEx funktioniert wie genannt.

Datum: Gruppe[1]

Tag: Gruppe[2], Gruppe[3]

Monat: Gruppe[5], Gruppe[6]

Jahr: Gruppe[8]

Keine passende Antwort gefunden?

Fragen Sie die Community