AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RegEx dd.mm.yyyy hh:mm

Ein Thema von ByTheTime · begonnen am 31. Dez 2014 · letzter Beitrag vom 3. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#1

RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 00:21
Zitat:
(z.B. Insbesondere auch Fragen zu anderen Sprachen als Delphi oder FreePascal)
Dem mache ich heute alle Ehre

Und zwar werkel ich im Moment ein ganz klein wenig mit regulären Ausdrücken/regular Expressions herum. Jetzt möchte ich eine Feld was Datum und Zeit enthält "validieren" (nennt man das so? ). Allerdings haut mein Ausdruck nicht hin:

Code:
(((0[1-9]|[12]\d|3[01])[\/\.-](0[13578]|1[02])[\/\.-]((19|[2-9]\d)\d{2})\s(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]))|((0[1-9]|[12]\d|30)[\/\.-](0[13456789]|1[012])[\/\.-]((19|[2-9]\d)\d{2})\s(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]))|((0[1-9]|1\d|2[0-8])[\/\.-](02)[\/\.-]((19|[2-9]\d)\d{2})\s(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]))|((29)[\/\.-](02)[\/\.-]((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\s(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])))
Akzeptiert auch "-" oder "/" als Delimiter, würde es denn funktionieren

Kennt sich da jemand besser aus?

Gruß,
Lukas
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#2

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 00:28
Was funktioniert denn nicht?
Und was genau willst du denn validieren?
Was ist mit Schaltjahren?

Ist wohl besser das einfach in ein Datum+Uhrzeit umzuwandeln und zu schauen ob das funktioniert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 00:30
Was ist das? Der Regex Obfuscation Contest?

Also falls es ernst gemeint ist: Nimm dafür bitte nicht Regex. Regex ist zwar eine tolle Sache, aber es hat seine Grenzen. Das da oben versteht ja kein Mensch.

Falls es eher sportlich gemeint ist: Versuch es doch mal mit Regex Golf

Geändert von Namenloser (31. Dez 2014 um 00:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#4

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 00:41
OK, Schaltjahr gefunden.

Kann man dem RegEx nicht auch irgendwie sagen, daß es Leerzeichen im Vergleichscode ignorieren soll?
Wenn ja, dann kann man es auch gleich formatiert lassen.
Code:
(
  (
    (0[1-9]|[12]\d|3[01])
    [\/\.-]
    (0[13578]|1[02])
    [\/\.-]
    ((19|[2-9]\d)\d{2})
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
    :
    ([0-5][0-9])
  )|(
    (0[1-9]|[12]\d|30)
    [\/\.-]
    (0[13456789]|1[012])
    [\/\.-]
    ((19|[2-9]\d)\d{2})
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
    :
    ([0-5][0-9])
  )|(
    (0[1-9]|1\d|2[0-8])
    [\/\.-]
    (02)
    [\/\.-]
    ((19|[2-9]\d)\d{2})
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
    :
    ([0-5][0-9])
  )|(
    (29)
    [\/\.-]
    (02)
    [\/\.-]
    (
      (1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])
      |
      ((16|[2468][048]|[3579][26])00)
    )
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
  )
)
Fällt dir was auf?
Irgendwas stimmt im letzten Block mit der Uhrzeit nicht.

Aber da der Teil in allen Oder-Blöcken identisch sein sollte, hätte es doch gereicht den Teil auch nur einmal auszuwerden.
Würde den Code gleich mal stark kürzen, vorallem wenn man auch gleich mit alle unnötigen Klammern weglässt.
Außer du willst auch die Sommer-/Winterzeit, sowie Schaltminuten und Schaltsekunden mit beachten.


^ am Anfang und $ am Ende?

Und innerhalb der [ ] sind "." und Co. keine Platzhalter, also ginge auch [/.-]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Dez 2014 um 00:52 Uhr)
  Mit Zitat antworten Zitat
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#5

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 10:03
Was ist das? Der Regex Obfuscation Contest?

Also falls es ernst gemeint ist: Nimm dafür bitte nicht Regex. Regex ist zwar eine tolle Sache, aber es hat seine Grenzen. Das da oben versteht ja kein Mensch.
Es ist vollkommen ernst gemeint Aber als ich mir meinen eigenen Post nochmal angeschaut habe muss ich zugeben dass das schon ein Höllen-Regex ist

OK, Schaltjahr gefunden.
Genau darum geht es. Alle möglichen Daten mit allen Ausnahmen/Schaltjahren korrekt zu validieren. Und das im Format dd.mm.yyyy hh:mm. Und da ist mir auch mein Fehler aufgefallen!

Fällt dir was auf?
Irgendwas stimmt im letzten Block mit der Uhrzeit nicht.
Nein, umgedreht! Das ist der einzige Block der richtig ist! Ich möchte ja nicht hh:mm:ss sondern hh:mm validieren. Und da liegt der Knackpunkt Ich habe schlicht und einfach alle anderen Blöcke hh:mm:ss validieren lassen

Code:
(
  (
    (0[1-9]|[12]\d|3[01])
    [\/\.-]
    (0[13578]|1[02])
    [\/\.-]
    ((19|[2-9]\d)\d{2})
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
  )|(
    (0[1-9]|[12]\d|30)
    [\/\.-]
    (0[13456789]|1[012])
    [\/\.-]
    ((19|[2-9]\d)\d{2})
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
  )|(
    (0[1-9]|1\d|2[0-8])
    [\/\.-]
    (02)
    [\/\.-]
    ((19|[2-9]\d)\d{2})
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
  )|(
    (29)
    [\/\.-]
    (02)
    [\/\.-]
    (
      (1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])
      |
      ((16|[2468][048]|[3579][26])00)
    )
    \s
    (0[0-9]|1[0-9]|2[0-3])
    :
    ([0-5][0-9])
  )
)
So haut das ganze hin und danke für die schöne formatierung und den Hinweiß. Sonst hätte ich noch ewig gerätselt.

Aber da der Teil in allen Oder-Blöcken identisch sein sollte, hätte es doch gereicht den Teil auch nur einmal auszuwerden.
Würde den Code gleich mal stark kürzen, vorallem wenn man auch gleich mit alle unnötigen Klammern weglässt.
Außer du willst auch die Sommer-/Winterzeit, sowie Schaltminuten und Schaltsekunden mit beachten.
Okay, gute Idee, werde ich gleich machen

^ am Anfang und $ am Ende?
Vorhanden

Also ich bedanke mich, Problem gelöst

Gruß,
Lukas
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#6

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 11:23
Wie ein gültiges Datum sieht 01/01-2000 00.00 aber nicht aus.

Bist'e dir eigentlich sicher, daß das Jahr 8000 wirklich ein Schaltjahr wird?

Code:
^(
  (
    (
      (0[1-9]|[12]\d|3[01])
      [/.-]
      (0[13578]|1[02])
      [/.-]
      ((19|[2-9]\d)\d{2})
    )|(
      (0[1-9]|[12]\d|30)
      [/.-]
      (0[13456789]|1[012])
      [/.-]
      ((19|[2-9]\d)\d{2})
    )|(
      (0[1-9]|1\d|2[0-8])
      [/.-]
      (02)
      [/.-]
      ((19|[2-9]\d)\d{2})
    )|(
      (29)
      [/.-]
      (02)
      [/.-]
      (
        (1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])
        |
        ((16|[2468][048]|[3579][26])00)
      )
    )
  )
  \s
  ([01]\d|2[0-3])
  :
  ([0-5]\d)
)$
Code:
^((0[1-9]|[12]\d|3[01])[/.-](0[13578]|1[02])[/.-](19|[2-9]\d)\d{2}
|(0[1-9]|[12]\d|30)[/.-](0[13456789]|1[012])[/.-](19|[2-9]\d)\d{2}
|(0[1-9]|1\d|2[0-8])[/.-]02[/.-](19|[2-9]\d)\d{2}
|29[/.-]02[/.-]((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))
\s([01]\d|2[0-3]):[0-5]\d$
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Dez 2014 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 11:25
So ein Monster würde ich nur mit einem UnitTest in die Produktiv-Umgebung übernehmen, mit gaaaanz vielen negativ und vielen positiv Prüfungen.

Oder einfach ganz was anderes nehmen ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#8

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 11:29
TryStrToDateTime?

Na ist doch aber immrerhin schonmal 18 Zeilen/Blöcke kürzer.


So, und jetzt basteln wir uns einen eMail-Valiador, der alle möglichen RFCs abdeckt und alle (aktuell) bekannten TLD beachtet, sowie alle mehrteiligen TLDs ala xxx.de.co und inkl. Porno-/Spamfilter bekannter Mailadressen usw.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Dez 2014 um 11:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: RegEx dd.mm.yyyy hh:mm

  Alt 31. Dez 2014, 12:06
Ein email-Adress-Validator ist schon gut, aber wenn der auch noch nach Spam etc. schauen soll, dann macht der schon zuviel. Das muss man mehrstufig machen.
Delphi-Quellcode:
TEmailAddress = record
private
  FValue : string;
public
  // prüft den String mit IsValid und erzeugt den Record
  // bei IsValid = false wird eine Exception geworfen
  constructor Create( const AEmailAddressStr : string );
  class operator implicit ( const s : string ) : TEmailAddress;
  class operator implicit ( const e : TEmailAddress ) : string;
  class function IsValid( const AStr : string ): Boolean;
  function ToString : string;
  // weitere Operatoren wie Equal oder Methoden wie IsEmpty
end;
und der SpamFilter dann
Delphi-Quellcode:
function IsSpamEmail( const AEmailAddress : TEmailAddress ) : Boolean;
begin
  // hier Prüfung auf Spam-Domains
end;
Die Funktion kann jetzt aufgerufen werden mit IsSpamEmail( 'foo@bar.com' ) und der String wird in den Record umgewandelt und dabei gleichzeitig überprüft. Wenn das keine korrekte email-Adresse ist, dann wirft die Record-Umwandlung eine Exception. Darum kann ich mich in der Funktion darauf verlassen, dass ich nur korrekte Email-Adressen bekomme

Damit es nicht zu OT wird, das funktioniert natürlich auch für Datum, Zeit, etc.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (31. Dez 2014 um 12:10 Uhr)
  Mit Zitat antworten Zitat
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#10

AW: RegEx dd.mm.yyyy hh:mm

  Alt 3. Jan 2015, 11:32
Hmm, da ist was dran... Perfekt ist mein Ausdruck noch nicht

Allerdings geht es hier nicht um Delphi/Pascal ^^ Ich brauche das für eine PHP-Anwendung. Und RegEx schien mir bis jetzt die beste Lösung.
Lukas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz