Neu RegExMatch$ Seltsames Verhalten bei Email Validierung

gutberle

Sehr aktives Mitglied
29. März 2011
1.271
329
Hallo Leute,

ich möchte Email-Adressen per RegExMatch$() validieren und verwende dazu einen Regex-String von https://www.regextester.com/19. Grundsätzlich funktioniert das auch sehr gut, z.B. mit ...
Code:
RegExMatch$("joe.blow@acme.com","^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
... soll heißen, bei einem Match wie im Beispiel wird die vollständige Email-Adresse zurückgegeben.

Ist die Email-Adresse aber nicht gültig, sagen wir mal zwischen "joe." und "blow" setze ich ein Leerzeichen, dann gibt RegExMatch$() nicht etwa nur nichts für seinen eigenen Test zurück, sondern egal, was um die RegExMatch$() Funktion drum rum steht, es wird überhaupt nichts mehr zurückgegeben. Der Test ...
Code:
Cond(RegExMatch$("joe. blow@acme.com","^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")<>"","A","B")
... würde also korrekterweise ein "A" zurückgeben, wenn die Email valide wäre, wenn die Email aber wie hier z.B. ein Leerzeichen zwischen "joe." und "blow" hat und darum nicht valide ist, wird nicht etwa "B" zurückgegeben, sondern GRAD GAR NICHTS.

Ist das Verhalten normal für RegExMatch$() und ich verstehe hier irgendetwas schlicht nicht oder falsch oder ist das ein Bug? - Getestet habe ich mit 1.3.21.1 und 1.5.10.0, beide reagieren gleich.

Gruß,
Ingmar
 

gutberle

Sehr aktives Mitglied
29. März 2011
1.271
329
... es ist zwar immer blöde, wenn man eine Frage stellt und sich dann selber antwortet, aber die Sache hat mir keine Ruhe gelassen, weil mir der Gedanke kam, dass RegExMatch$ bei einem Mismatch eventuell keinen Leerstring, sondern EMPTY or NULL zurückliefern könnte. Dann wäre nämlich auf schräge Weise auch die Else Bedingung von Cond() nie erfüllt. Also habe ich folgendes probiert ...
Code:
Cond(IsNullOrEmpty(RegExMatch$("joe.blow@acme.com","^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"))=FALSE,"gültig","ungültig")
... und das liefert bei einer korrekten Email "gültig" zurück und bei einer inkorrekten Email wie "joe. blow@acme.com" (mit Leerzeichen) die korrekte Antwort "ungültig". Natürlich geht statt "IsNullOrEmpty()=FALSE" auch "NOT IsNullOrEmpty()".

Fazit: Eigentlich ist das Verhalten von RegExtMatch$() bei Verwendung mit <>"" nicht erwartungskonform, denn auch NULL oder EMPTY sollten als String interpretiert (und das macht RegExMatch$() ja, siehe das $-Zeichen im Namen) beide ="" , also ~leer~ sein. Und da Cond() zudem ein Boolean zurückliefert, sollte es *nie* möglich sein, dass weder die True, noch die False Bedingung ausgeführt werden, das Ganze ist also eher ein Bug denn ein Feature. - Aber zumindest funktioniert es mit dem (sowieso "erwachseneren") Check auf IsNullOrEmpty() einwandfrei.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Rico Giesler