tufan: Problem mit Regulären ausdrücken in Javascript

hallo liebes Forum,

ich muss für eine Vorlesung eine kleine Hausaufgabe abgeben, und für eine der Aufgaben muss ich eine Email-Adresse auf Gültigkeit mit Javascript überprüfen. Ich dachte mit Regular Expressions ist es eine Sache von Minuten; aber mein Muster gibt auch dann True aus, wenn die Email-Adresse mit einem "." beginnt - was m.E. nicht der Fall sein sollte.
Folgende Funktion:

  
function aufgabe2()  
{  
 var zupruefen = document.getElementById("emailtextfield").value;  
 var muster =  /[^\.][0-9a-z]+[\.0-9a-z-]+@([0-9a-z][0-9a-z-]*\.)+([a-z]{2,4}$)/;  
 var gueltig = muster.test(zupruefen);  
 if (gueltig == 1){document.getElementById("ergebnis2").innerHTML="Gültige email";}  
 else if (gueltig == 0){document.getElementById("ergebnis2").innerHTML="Keine gültige email";}  
 else {document.getElementById("ergebnis2").innerHTML=gueltig;}  
 //alert(gueltig);  
}  

Das teil [^.] habe hinzugefügt um den Punkt (.) auch explizit auszuschliessen; aber ich bekam wieder die Meldung "Gültige Email".
Kann mir jemand sagen, wo mein Denkfehler liegt?

Danke im Voraus und Grüße aus Berlin,

tufi

  1. ups, habe mich am Titel verklickt, sorry.

    1. Hallo tufan!

      ups, habe mich am Titel verklickt, sorry.

      Du bist vermutlich ein Scrollrad-Opfer ;)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
      1. hallo Patrick,

        Du bist vermutlich ein Scrollrad-Opfer ;)

        wahrscheinlich hast du recht ja :)

        Grüße aus Berlin,

        tufi

  2. Tach.

    mein Muster gibt auch dann True aus, wenn die Email-Adresse mit einem "." beginnt - was m.E. nicht der Fall sein sollte.

    /[^.][0-9a-z]+[.0-9a-z-]+@([0-9a-z][0-9a-z-]*.)+([a-z]{2,4}$)/

    Das ist auch nicht verwunderlich, denn du gibt nirgends an, daß die E-Mailadresse nicht mit einem Punkt *beginnen* soll. Was der Ausdruck tatsächlich erkennt, ist sehr wahrscheinlich nur ein Teil der Adresse, die du ihm fütterst. Füge am Anfang noch das ^ für den Stringanfang hinzu, schmeiß [^.] wieder raus und es sollte laufen.

    --
    Once is a mistake, twice is jazz.
    1. hallo,

      Füge am Anfang noch das ^ für den Stringanfang hinzu, schmeiß [^.] wieder raus und es sollte laufen.

      danke für die Hilfe. Es hat funktioniert. :)

      Grüße aus Berlin,

      tufi

      1. Hallo tufan.

        Füge am Anfang noch das ^ für den Stringanfang hinzu, schmeiß [^.] wieder raus und es sollte laufen.

        danke für die Hilfe. Es hat funktioniert. :)

        Kleiner Tipp noch: vor dem Klammeraffen ist kein Punkt erlaubt, du solltest also zumindest dies noch ausschließen.

        Einen schönen Freitag noch.

        Gruß, Mathias

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        debian/rules
      2. Hello out there!

        Füge am Anfang noch das ^ für den Stringanfang hinzu, schmeiß [^.] wieder raus und es sollte laufen.

        danke für die Hilfe. Es hat funktioniert. :)

        Nö. Warum sollte 'a@example.net' keine gültige E-Mail-Adresse sein?

        Grüße aus Berlin,

        Ebenso.

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
        1. hallo,

          Nö. Warum sollte 'a@example.net' keine gültige E-Mail-Adresse sein?

          hast du auch wieder recht.. :-|

          Grüße aus Berlin,

          tufi

  3. Moin!

    ich muss für eine Vorlesung eine kleine Hausaufgabe abgeben, und für eine der Aufgaben muss ich eine Email-Adresse auf Gültigkeit mit Javascript überprüfen. Ich dachte mit Regular Expressions ist es eine Sache von Minuten; aber mein Muster gibt auch dann True aus, wenn die Email-Adresse mit einem "." beginnt - was m.E. nicht der Fall sein sollte.

    Also mit Deinem Ausdruck kommst Du aber nicht weit. Zum Beispiel hast Du  kein "+" zugelassen.

    Soll die RFC 2822 konform sein? Dann sollte es dis hier tun:
    /(?:(?:(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*(?:[^\x00-\x1F\x7F()<>[]:;@,."\s]+(?:.[^\x00-\x1F\x7F()<>[]:;@,."\s]+)*)(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*)|(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*"(?:(?:[^\"])|(?:\(?:[^\x0A\x0D])))+"(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*))@(?:(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*(?:[^\x00-\x1F\x7F()<>[]:;@,."\s]+(?:.[^\x00-\x1F\x7F()<>[]:;@,."\s]+)*)(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*)|(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*[(?:\s*(?:(?:[^[]\])|(?:\(?:[^\x0A\x0D]))))*\s*](?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*)))/xism

    "Gestohlen" von CPAN dem Perl Archiv aud dem Modul Email::Address.

    -- Skeeve

    1. hallo,

      Also mit Deinem Ausdruck kommst Du aber nicht weit.

      ich glaube, für die Hausaufgabe schon :)

      Soll die RFC 2822 konform sein? Dann sollte es dis hier tun:
      /(?:(?:(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*(?:[^\x00-\x1F\x7F()<>[]:;@,."\s]+(?:.[^\x00-\x1F\x7F()<>[]:;@,."\s]+)*)(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*)|(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*"(?:(?:[^\"])|(?:\(?:[^\x0A\x0D])))+"(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*))@(?:(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*(?:[^\x00-\x1F\x7F()<>[]:;@,."\s]+(?:.[^\x00-\x1F\x7F()<>[]:;@,."\s]+)*)(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*)|(?:(?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*[(?:\s*(?:(?:[^[]\])|(?:\(?:[^\x0A\x0D]))))*\s*](?:(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|(?:\s*((?:\s*(?:(?:(?>[^()\]+))|(?:\(?:[^\x0A\x0D]))|))*\s*)\s*)))*\s*)\s*)|\s+)*)))/xism

      aehm.. danke für diesen Ausdruck, aber ich glaub, der Dozent würde sofort feststellen, dass ich diesen hier nicht selber geschrieben habe :) ausserdem, ich glaub er möchte nur eine _einfache_ Variante sehen. :)

      Grüße aus Berlin,

      tufi

  4. Moin!

    /[1][0-9a-z]+[.0-9a-z-]+@([0-9a-z][0-9a-z-]*.)+([a-z]{2,4}$)/i

    Ich weiß ja nicht, wie Dein regulärer Ausdruck nun aussieht, aber folgendes hast Du noch nicht berücksichtigt:
    1. [^.] -> Das erlaubt *JEDES* Zeichen, also auch äöü oder gar TAB
    2. [0-9a-z]+ -> Das bedeutet, daß eine Adresse mit mindestens 2
       Nicht-Punkten beginnen muß ([^.] und [0-9a-z])
    3. [0-9a-z] ist zu restirktiv die Erlaubten Zeichen sind:
        ALPHA / DIGIT / (die hast Du)
        "!" / "#" /     ;  SP, and specials.
        "$" / "%" /     ;  Used for atoms
        "&" / "'" /
        "*" / "+" /
        "-" / "/" /
        "=" / "?" /
        "^" / "_" /
        "`" / "{" /
        "|" / "}" /
        "~"
    4. [.0-9a-z-]+ -> somit muß eine Adresse bei Dir aus mindestens
       3 Zeichen vor dem @ bestehen.

    -- Skeeve


    1. ^. ↩︎

    1. hi Skeeve,

      danke für die Erläuterungen.

      Ich weiß ja nicht, wie Dein regulärer Ausdruck nun aussieht,

      im moment sieht's so aus:
      /[1]+[.0-9a-zA-Z-]+@([0-9a-z][0-9a-z-]*.)+([a-z]{2,4}$)/

      aber folgendes hast Du noch nicht berücksichtigt:

      wir haben eine einfache Aufgabenstellung und die Bedingungen sind auch entsprechend "abgemagert":
      "Diese kann als Domain 1 bis 3 Punkte enthalten, sie darf nur die erlaubten Zeichen (a-z, A-Z,0-9 und -) erhalten und es darf natürlich nicht das @ fehlen (aber nur 1x)."

      für diese Aufgabe bin ich glücklich, wenn der Ausdruck nur diese Bedingungen erfüllt. :)

      1. [^.] -> Das erlaubt *JEDES* Zeichen, also auch äöü oder gar TAB

      aehm.. ich dachte ein "^" im [] negiert den nachfolgen Ausdruck, und mit "" wollte ich den "." maskieren. also "nicht Punkt". Wie sollte es aussehen, um den "." explizit auszuschliessen?

      Danke für die Hilfestellung.

      Grüße aus Berlin,

      tufi


      1. 0-9a-zA-Z ↩︎

      1. Moin!

        1. [^.] -> Das erlaubt *JEDES* Zeichen, also auch äöü oder gar TAB
          aehm.. ich dachte ein "^" im [] negiert den nachfolgen Ausdruck,

        Das ist ja auch richtig.

        und mit "" wollte ich den "." maskieren. also "nicht Punkt".

        Das ist auch richtig.

        Wie sollte es aussehen, um den "." explizit auszuschliessen?

        Ist schon korrekt, was Du da aufgeschrieben hast: "Ein beliebiges Zeichen, nur nicht Punkt". Aber äöü und Tab sind ja nicht Punkt, sind somit zulässig.

        Merke: Meist ist es besser nicht zu sagen was verboten ist, sonder zu sagen, was erlaubt ist.

        -- Skeeve

  5. Hi,

    var muster =  /[^.][0-9a-z]+[.0-9a-z-]+@([0-9a-z][0-9a-z-]*.)+([a-z]{2,4}$)/;
    var gueltig = muster.test(zupruefen);
    if (gueltig == 1){document.getElementById("ergebnis2").innerHTML="Gültige email";}
    else if (gueltig == 0){document.getElementById("ergebnis2").innerHTML="Keine gültige email";}

    bla@test.xx ==> gültige email           (trotz nichtexistenter TLD)
    bla@test.travel ==> Keine gültige email (obwohl es diese Adresse geben könnte)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  6. Hallihallo!

    Ich wundere mich gerade, dass dieser Artikel von CK in diesem Thread noch gar nicht erwähnt wurde.

    Er enthält nicht nur einen fertigen regulären Ausdruck, sondern auch die passenden und gut verständlichen Erklärungen dazu.

    Oder bin ich nicht auf dem aktuellen Stand, und der Artikel ist zwischenzeitlich unbrauchbar geworden? (die einzige mir bekannte Einschränkung ist die, dass Umlautdomains nicht berücksichtigt werden.)

    Viele liebe Grüße,
    Der Dicki

    1. Hi,

      Oder bin ich nicht auf dem aktuellen Stand, und der Artikel ist zwischenzeitlich unbrauchbar geworden? (die einzige mir bekannte Einschränkung ist die, dass Umlautdomains nicht berücksichtigt werden.)

      Mehrere tld werden nicht durchgelassen, obwohl sie existieren.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallihallo!

        Mehrere tld werden nicht durchgelassen, obwohl sie existieren.

        Eine passende Lösung existiert.

        Ist zwar eigentlich schon fast zu offensichtlich, um es zu verlinken, aber ich finde den Hinweis in Bezug auf die Umlautdomains einfach köstlich ;-)

        Viele liebe Grüße,
        Der Dicki