Timo L.: Reguläre Ausdrücke

Hallo Zusammen.
In einem meiner Input-Felder möchte ich nur bestimmt Zeichen erlauben. Beim Absenden wird das Ganze gecheckt. Sofern andere Zeichen im Feld enthalten sind, möchte ich das Formular nicht absenden.
Mir ist bewusst dass ich das nur Mithilfe von regulären Ausdrücken lösen kann.
Leider komme ich damit nicht zurecht.
Folgende Zeichen dürfen im Eingabefeld vorhanden sein:

0
1
2
3
4
5
6
7
8
9
*
/
+

(
)
%variable1%
%variable2%

Beispiel Korrekt:
%variable1%*2338/18*(%variable2%-65)

Beispiel Falsch:
%vari7able5%/-3%26

Die beiden Variablen sollen sozusagen auch wie als "1 Zeichen" angeschaut werden.

Wie muss mein Regulärer Ausdruck nun lauten? Wie überprüfe ich mein Eingabefeld auf den Regulären Ausdruck?

Vielen Dank für eure Antworten

MFG Timo L.
Wie muss nun mein Regulärer Ausdruck lauten??

Danke für euere Antworten.

  1. Lieber Timo,

    was macht ein User, der kein JavaScript aktiviert oder verfügbar hat? Prüfst Du die Eingaben auch serverseitig?

    Folgende Zeichen dürfen im Eingabefeld vorhanden sein:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    *
    /
    +

    (
    )

    Das schreibt man in JavaScript-Syntax so:
    var meinMuster = new RegExp("[0-9*\/+\-\(\)]", "");

    %variable1%
    %variable2%

    Das sind also die Zeichen "%", "variable" und ("1" oder "2"), oder sind andere Ziffern auch denkbar?

    vaqr meinMuster = new RegExp("%variable(1|2)%", "");

    Beispiel Korrekt:
    %variable1%*2338/18*(%variable2%-65)

    Damit das matched: var meinMuster = new RegExp("((%variable(1|2)%)?[0-9*\/+\-\(\)])+", "");
    oder so ähnlich...

    Ich habe das jetzt nicht getestet, aber dafür darfst Du mit meinen Ideen jetzt spielen gehen. ;-)

    Eine korrekte Verklammerung lässt sich mit Mustern nicht prüfen, dazu brauchst Du einen Parser. Ich denke, Dein Ansatz ist nicht der sinnvollste, wenn Du eine solche Eigabe über Mustererkennung prüfen lassen willst.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Hallo Zusammen.
    In einem meiner Input-Felder möchte ich nur bestimmt Zeichen erlauben. Beim Absenden wird das Ganze gecheckt. Sofern andere Zeichen im Feld enthalten sind, möchte ich das Formular nicht absenden.
    Mir ist bewusst dass ich das nur Mithilfe von regulären Ausdrücken lösen kann.
    Leider komme ich damit nicht zurecht.
    Folgende Zeichen dürfen im Eingabefeld vorhanden sein:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    *
    /
    +

    (
    )
    %variable1%
    %variable2%

    Beispiel Korrekt:
    %variable1%*2338/18*(%variable2%-65)

    Beispiel Falsch:
    %vari7able5%/-3%26

    Die beiden Variablen sollen sozusagen auch wie als "1 Zeichen" angeschaut werden.

    Wie wär's damit?

    (%variable[0-1]%|[0-9()*/+-])+

    (gegebenenfalls statt dem letzten plus auch ein minus, je nachdem)

  3. Vielen Dank euch Beiden schon mal.
    Ich habe noch eine Frage. Mein Script sieht nun so aus:

      
    mystring = document.getElementById("schluessel").value;  
    expression = /(%afd%|%xyz%|%mnl%|[0-9()*/+-])+/;  
    result = expression.test(mystring);  
    if (result == true)  
    {  
      alert("Eingabe korrekt!");  
    }  
    else  
    {  
      alert("Eingabe falsch!");  
    }
    

    Wenn ich nun aber "1e" eingebe ist meine Eingabe auch korrekt. Ich möchte aber das meine Eingabe falsch ist solbald der Reguläre Ausdruck nicht mehr darauf angewendet werden kann. Ist test() die Falsche Funktion für diese Überprüfung.

    MFG Timo

    1. Lieber Timo,

      um mathematische Terme auf Gültigkeit zu prüfen, sind reguläre Ausdrücke kein geeignetes Mittel. Das schrieb ich schon.

      expression = /(%afd%|%xyz%|%mnl%|[0-9()*/+-])+/;

      Hier hast Du einen Syntax-Fehler. "/" beginnt und beendet ein Muster. Wenn Du das Zeichen innerhalb des Musters verwenden willst, dann musst Du es "escapen", sprich einen Backslash davor stellen.

      [code lang=javascript]expression = /(%afd%|%xyz%|%mnl%|[0-9()*/+-])+/;

                                        hier: ^^  
      
      > if (result == true)  
        
      Das geht kürzer: `if (result) {...} `{:.language-javascript}  
        
      
      > Wenn ich nun aber "1e" eingebe ist meine Eingabe auch korrekt. Ich möchte aber das meine Eingabe falsch ist solbald der Reguläre Ausdruck nicht mehr darauf angewendet werden kann. Ist test() die Falsche Funktion für diese Überprüfung.  
        
      Nein. Der von Dir gewählte Ansatz zur Problemlösung ist falsch. Du benötigst einen Parser.  
        
      Liebe Grüße,  
        
      Felix Riesterer.
      
      -- 
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      
      1. Hallo Felix,
        das ich einen Parser brauche ist mir nun klar. Ich habe aber nicht Ansatzweise eine Ahnung wie so ein Javascript-Parser aussieht, geschweige denn wo ich in herbekomme.
        Kennst du villeicht ein paar gute links? Google war mir da nicht sonderlich hilfreich...
        Danke.
        Gruss Timo L.

        1. Lieber Timo,

          Kennst du villeicht ein paar gute links? Google war mir da nicht sonderlich hilfreich...

          ich hätte da an ein try {} catch (e) {}-Konstrukt in Verbindung mit eval() gedacht. Mit der Funktion eval hätte ich versucht die Usereingaben (die ja einen mathematischen Term darstellen sollen) zu einem Ergebnis auflösen zu lassen. Wenn diese Funktion scheitert, fängt das catch-Statement dieses ab und die Eingaben sind als falsch erkannt.

          Beispiel (ungetestet):

          function pruefeEingaben() {  
              var usereingabe = document.getElementById("schluessel").value;  
              var ergebnis = "";  
              var fehlermeldung = "";  
            
              try {  
                  eval ("ergebnis = " + usereingabe + ";");  
              } catch (e) {  
                  ergebnis = false;  
                  fehlermeldung = e;  
              }  
            
              if (ergebnis === false) { // dreifaches Istgleichzeichen!  
                  alert("Eingabe ist fehlerhaft!\n\n" + fehlermeldung);  
                  return false;  
              }  
            
              return true;  
          }
          

          Vielleicht kannst Du ja mit meinem Code-Schnipsel etwas anfangen?

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)