Torben: Regulärer Ausdruck gesucht

Hy,

ich möchte gerne über einen Regulären Ausdruck eine Email-Adresse nach einer formalen Regel überprüfen.

Die Regel lautet:

Mindestens zwei Buchstaben vor dem At, gefolgt von der Zeichenfolge "@domain.de" am Ende

Falls die Eingabe nicht dieser Regel entspricht, soll das Formularfeld geleert werden.

Mein Regulären Ausdruck hierfür lautet:

reg = /[a-z]{2,}[@domain.de]$/;

Zwei Kleinbuchstaben, mindestens zweimal vertreten, gefolgt von der Zeichenfolge "@domain.de" am Ende

Der Grundgedanke zu der entsprechenden Funktion lautet:

Wenn der Eingabewert (beim Verlassen des Eingabefeldes) NICHT dem Regulären Ausdruck entspricht, wird das Eingabefeld geleert.

Den oben definierten Regulären Ausdruck müßte ich also noch durch ein ^ irgendwie "umdrehen".

Alternativ die if-Abfrage ändern in if(!reg.test(wert))

Aber mich interessiert primär der andere - weil unbekannte - Weg!

Leider ist aber wohl der Reguläre Ausdruck so schon nicht in Ordnung.

Und den Regulären Ausdruck richtig zu "klammern", um um ihn umzudrehen, habe ich leider auch nicht hingekriegt. Mit "umdrehen" meine ich z.B. aus [a-z] ein [^a-z] zu machen.

Hier meine Versuchsanordnung:

function validierung (eingabe)
{

reg = /[a-z]{2,}[@domain.de]$/;

wert = eingabe.value;

if(reg.test(wert))
eingabe.value = "";

}

Wer gibt mir den entscheidenen Tip ?

Grüße Torben

  1. Hoi

    Mindestens zwei Buchstaben vor dem At, gefolgt von der Zeichenfolge "@domain.de" am Ende

    '.*[a-zA-Z]{2,}@(?!domain.de)[^@]*'

    Sollte sowas in der Art sein, aber nicht getestet.

    Gruß Ben

  2. gudn tach Torben!

    Mein Regulären Ausdruck hierfür lautet:

    reg = /[a-z]{2,}[@domain.de]$/;

    fast richtig. die square brackets (eckige klammern) werden allerdings zum definieren von zeichenklassen verwendet, lass sie also bei zeichenketten einfach weg. ach ja, und der punkt muss dann noch maskiert werden.

    Zwei Kleinbuchstaben, mindestens zweimal vertreten, gefolgt von der Zeichenfolge "@domain.de" am Ende

    entsprechend dem "am ende" ($) solltest du auch ein "am anfang" (^) definieren, z.b. so:

    reg = /[1]{2,}@domain.de$/;

    Wenn der Eingabewert (beim Verlassen des Eingabefeldes) NICHT dem Regulären Ausdruck entspricht, wird das Eingabefeld geleert.

    Den oben definierten Regulären Ausdruck müßte ich also noch durch ein ^ irgendwie "umdrehen".

    nein, brauchst du nicht, denn

    Alternativ die if-Abfrage ändern in if(!reg.test(wert))

    eben. wozu willst du dann noch die negation im regulaeren ausdruck?

    Aber mich interessiert primär der andere - weil unbekannte - Weg!

    ah, ok. sowas kannst du afaik nicht direkt bewirken; hoechtens indirekt ueber trickserei, aber das ist unnoetig, da es ja logische operatoren gibt oder auch else-zweige.

    Und den Regulären Ausdruck richtig zu "klammern", um um ihn umzudrehen, habe ich leider auch nicht hingekriegt. Mit "umdrehen" meine ich z.B. aus [a-z] ein [^a-z] zu machen.

    das ist auch gar nicht einfach und erfordert wieder unnoetige trickserei.

    dein code koennte, leicht abgewandelt, folgendermassen ausshen:

      
    function validierung (eingabe){  
      reg = /^[a-z]{2,}@domain\.de$/;  
      wert = eingabe.value;  
      if(!reg.test(wert))  
        eingabe.value = "";  
      }  
    }
    

    und sollte funzen, denke ich (nicht ausprobiert).

    zum thema: http://de.selfhtml.org/javascript/objekte/regexp.htm

    prost
    seth


    1. a-z ↩︎

    1. entsprechend dem "am ende" ($) solltest du auch ein "am anfang" (^) definieren, z.b. so:

      reg = /[1]{2,}@domain.de$/;

      Er will mindestens 2 Buchstaben vor derm @domain.de, er hat aber nicht gesagt, was davor noch soll. Eine E-Mailadresse kann durchaus aus wesentlich mehr bestehen, als nur Kleinbuchstaben vor dem @.

      Aber mich interessiert primär der andere - weil unbekannte - Weg!

      ah, ok. sowas kannst du afaik nicht direkt bewirken; hoechtens indirekt ueber trickserei, aber das ist unnoetig, da es ja logische operatoren gibt oder auch else-zweige.

      Kann man schon. (?!) als negativer lookahead macht genau das. 'foo(?!@domain.de) passt auf jedes foo, dem kein @domain.de folgt.

      Gruß Ben


      1. a-z ↩︎

      1. gudn tach!

        entsprechend dem "am ende" ($) solltest du auch ein "am anfang" (^) definieren, z.b. so:
          reg = /[1]{2,}@domain.de$/;
        Er will mindestens 2 Buchstaben vor derm @domain.de, er hat aber nicht gesagt, was davor noch soll. Eine E-Mailadresse kann durchaus aus wesentlich mehr bestehen, als nur Kleinbuchstaben vor dem @.

        selbstverstaendlich kann sie das. ob sie das auch darf, soll der OP entscheiden. ich sagte lediglich, dass er imho auch ein "am anfang" definieren solle. wie er das letztlich macht, ist mir wurscht. ein moegliches beispiel habe ich gegeben.

        wenn man die beschreibung des anfangs weglaesst, ist z.b. auch sowas wie "foo@@@4567,./,.;;;\n\n\n\r\n367@@@bar@domain.de" erlaubt. ich halte es fuer unwahrscheinlich, dass der OP sowas zulassen moechte.

        Aber mich interessiert primär der andere - weil unbekannte - Weg!

        ah, ok. sowas kannst du afaik nicht direkt bewirken; hoechtens indirekt ueber trickserei, aber das ist unnoetig, da es ja logische operatoren gibt oder auch else-zweige.
        Kann man schon. (?!) als negativer lookahead macht genau das.

        nein. eben nicht _genau_ das. ein negative look-ahead negiert nicht ein komplettes suchmuster, sondern betrachtet nur den kontext (negativ).

        'foo(?!@domain.de) passt auf jedes foo, dem kein @domain.de folgt.

        richtig. zum beispiel werden da gematcht:

        foo
        foobar
        fo@domain.de
        fooo@domain.de

        und jetzt versuch mal mit negative look-aheads die negation von
          /[2]{2,}@domain.de$/
        zu basteln.
        oh, glueck gehabt. es geht z.b. mit

        /^(?![a-z]{2,}@domain.de$)/

        also fast ohne trickserei. aber dass man das ^ ausserhalb der klammer notieren muss und das $ innerhalb der klammer, ist imho bereits trickserei genug, zu behaupten, dass die negation via negative look-aheads eben nicht immer so direkt moeglich ist.

        nun gut, aber was ist z.b. mit der negation von /[a-z]{2,}@domain.de$/ ?

        /(?<![a-z]{2,}@domain.de)$/

        funzt nicht, weil negative look-behinds nicht variabler laenger sein duerfern (zumindest in perl).
        aber halt! mit negative look-aheads geht das deiner meinung nach ja direkt. also wie lautet der "direkte" ausdruck?

        prost
        seth


        1. a-z ↩︎

        2. a-z ↩︎

        1. und jetzt versuch mal mit negative look-aheads die negation von
            /[1]{2,}@domain.de$/
          zu basteln.

          Und wer will das?

          oh, glueck gehabt. es geht z.b. mit

          /^(?![a-z]{2,}@domain.de$)/

          also fast ohne trickserei. aber dass man das ^ ausserhalb der klammer notieren muss und das $ innerhalb der klammer, ist imho bereits trickserei genug, zu behaupten, dass die negation via negative look-aheads eben nicht immer so direkt moeglich ist.

          Wo habe ich denn gesagt, dass es für alle Fälle möglich sein soll? Es geht hier doch um genau einen konkreten Fall.

          nun gut, aber was ist z.b. mit der negation von /[a-z]{2,}@domain.de$/ ?

          Und wo genau hab ich gesagt, dass das damit gehen soll?

          /(?<![a-z]{2,}@domain.de)$/

          funzt nicht, weil negative look-behinds nicht variabler laenger sein duerfern (zumindest in perl).
          aber halt! mit negative look-aheads geht das deiner meinung nach ja direkt. also wie lautet der "direkte" ausdruck?

          Wo genau habe ich das gesagt?

          Ansonsten brauchts für das Beispiel des OP die variable Anzahl der Buchstaben nicht beim negativen Matchen. Wenn der Ausdruck nach dem letzten @ nicht domain.de entspricht, dann soll der Ausdruck nicht matchen.

          Hier habe ich allerdings eine Ungenauigkeit reingebracht, da damit auch Ausdrücke akzeptiert würden, die vor dem @ nicht 2 Buchstaben haben. Könnte man mit einem negativen look-behind umgehen:
          (?<![a-z]{2}])@(?!domain.de)
          Damit matched der Ausdruck immer dann, wenn die E-Mail nicht aus zwei Buchstaben, @ und domain.de besteht.

          Wenn ich hier falsch liege, dann korrigiere mich.

          Und wie gesagt, ich habe nicht gesagt, dass mit negativem look-ahead alles möglich ist, aber die Anforderung des OP ist möglich.

          Gruß Ben


          1. a-z ↩︎

          1. gudn tach Ben!

            nun gut, aber was ist z.b. mit der negation von /[a-z]{2,}@domain.de$/ ?
            Und wo genau hab ich gesagt, dass das damit gehen soll?

            ich hatte das "kann man schon [...]" in folgendem abschnitt so verstanden, als waerst du der meinung, ein negativer look-ahead sei eine moeglichkeit das direkt zu bewerkstelligen:

            Aber mich interessiert primär der andere - weil unbekannte - Weg!
            »»
            ah, ok. sowas kannst du afaik nicht direkt bewirken; hoechtens indirekt ueber trickserei, aber das ist unnoetig, da es ja logische operatoren gibt oder auch else-zweige.
            Kann man schon. (?!) als negativer lookahead macht genau das.

            ich meinte mit "sowas" allgemein die negation eines ausdrucks und dachte vom gleichen wie der OP zu sprechen.
            man haette es wohl auch so verstehen koennen, dass ich es nur auf diesen speziellen von OP genannten ausdruck bezog.
            aber du scheinst es auf eine dritte weise verstanden zu haben. welche?
            iow: was meintest du mit "kann man schon. (?!) [...] macht genau das."?

            Ansonsten brauchts für das Beispiel des OP die variable Anzahl der Buchstaben nicht beim negativen Matchen.

            ack.
            bei /[a-z]{2,}@domain.de$/
            ist das komma ueberfluessig, womit dann also

            /(?<![a-z]{2}@domain.de)$/

            eine korrekte negation sein sollte.

            Hier habe ich allerdings eine Ungenauigkeit reingebracht, da damit auch Ausdrücke akzeptiert würden, die vor dem @ nicht 2 Buchstaben haben. Könnte man mit einem negativen look-behind umgehen:
            (?<![a-z]{2}])@(?!domain.de)
            Damit matched der Ausdruck immer dann, wenn die E-Mail nicht aus zwei Buchstaben, @ und domain.de besteht.

            Wenn ich hier falsch liege, dann korrigiere mich.

            alle adressen ohne @ werden nicht gematcht, also als gueltig angesehen. (die eine schliessende eckige klammer ist vermutlich ein tippfehler, ich habe so getan, als sei sie nicht da.)

            Und wie gesagt, ich habe nicht gesagt, dass mit negativem look-ahead alles möglich ist, aber die Anforderung des OP ist möglich.

            also /[a-z]{2,}@domain.de$/ negieren, oder nicht? und da kommt man afais allein mit negative look-aheads nicht weit.

            prost
            seth