Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RegEx dd.mm.yyyy hh:mm (https://www.delphipraxis.net/183313-regex-dd-mm-yyyy-hh-mm.html)

ByTheTime 31. Dez 2014 00:21

RegEx dd.mm.yyyy hh:mm
 
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? :roll:). 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 :stupid:

Kennt sich da jemand besser aus?

Gruß,
Lukas

himitsu 31. Dez 2014 00:28

AW: RegEx dd.mm.yyyy hh:mm
 
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.

Namenloser 31. Dez 2014 00:30

AW: RegEx dd.mm.yyyy hh:mm
 
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 ;)

himitsu 31. Dez 2014 00:41

AW: RegEx dd.mm.yyyy hh:mm
 
OK, Schaltjahr gefunden. :stupid:

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. :zwinker:

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. :stupid:


^ am Anfang und $ am Ende?

Und innerhalb der [ ] sind "." und Co. keine Platzhalter, also ginge auch [/.-]

ByTheTime 31. Dez 2014 10:03

AW: RegEx dd.mm.yyyy hh:mm
 
Zitat:

Zitat von Namenloser (Beitrag 1285028)
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 8-) Aber als ich mir meinen eigenen Post nochmal angeschaut habe muss ich zugeben dass das schon ein Höllen-Regex ist :roll:

Zitat:

Zitat von himitsu (Beitrag 1285029)
OK, Schaltjahr gefunden. :stupid:

:thumb: 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!

Zitat:

Zitat von himitsu (Beitrag 1285029)
Fällt dir was auf?
Irgendwas stimmt im letzten Block mit der Uhrzeit nicht. :zwinker:

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 :-D Ich habe schlicht und einfach alle anderen Blöcke hh:mm:ss validieren lassen :wall:

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.

Zitat:

Zitat von himitsu (Beitrag 1285029)
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. :stupid:

Okay, gute Idee, werde ich gleich machen :thumb:

Zitat:

Zitat von himitsu (Beitrag 1285029)
^ am Anfang und $ am Ende?

Vorhanden :thumb:

Also ich bedanke mich, Problem gelöst 8-)

Gruß,
Lukas

himitsu 31. Dez 2014 11:23

AW: RegEx dd.mm.yyyy hh:mm
 
Wie ein gültiges Datum sieht
Delphi-Quellcode:
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$

Sir Rufo 31. Dez 2014 11:25

AW: RegEx dd.mm.yyyy hh:mm
 
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 ...

himitsu 31. Dez 2014 11:29

AW: RegEx dd.mm.yyyy hh:mm
 
TryStrToDateTime? :stupid:

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.

Sir Rufo 31. Dez 2014 12:06

AW: RegEx dd.mm.yyyy hh:mm
 
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
Delphi-Quellcode:
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.

ByTheTime 3. Jan 2015 11:32

AW: RegEx dd.mm.yyyy hh:mm
 
Hmm, da ist was dran... Perfekt ist mein Ausdruck noch nicht :oops:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr.
Seite 1 von 2  1 2      

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