LeKuchen: Regular Expression

Hallo zusammen,

kann mir hier ein RegExp-Crack weiterhelfen? Es soll Double gematcht werden:

^\s*([-\+])?(\d+)?(\.-,)?\s*$

Dabei soll als Dezimalzeichen entweder . - oder , verwendet werden können.

Gruss
LeKuchen

  1. Liebes Kuchenstück,

    Du scheinst Backslashes escapen zu müssen... Warum?

    ^\s*([-\+])?(\d+)?(\.-,)?\s*$

    • Was sollen der (doppelte) Backslash in der eckigen Klammer? [-+] bedeutet "ein Zeichen, das ein '-' oder ein '+' ist", da braucht es keine Backslashes.
    • Und warum escapest Du die eckige Klammer in der dritten runden Klammer? Das ergibt für mich keinen Sinn!
    • Innerhalb einer eckigen Klammer bedeutet der Punkt nicht mehr "irgendein Zeichen", sondern nur noch "ein Punkt", muss also auch nicht escaped werden. Oder soll auch das Zeichen "" gematched werden? Dann musst Du es hier - wie sonst überall bei Dir auch - ebenso escapen!

    Ich vereinfache mal eben Dein Suchmuster:
    ^.* ([-+])?(\d+)?(.-,)? .*$

    Dieses Suchmuster sagt (nach meinem Verständnis): In einem String gibt es nach einem Leerzeichen vielleicht ein "+" oder "-", eventuell beliebig viele Ziffern, vielleicht ein ".", ein "-" oder ein ",", dem sich (wenn es denn da ist) beliebig viele Ziffern anschließen, gefolgt von einem Leerzeichen.

    Sei doch bitte so gut und poste die komplette Codezeile, in der Dein Suchmuster enthalten ist, damit man sehen kann, in welcher Sprache Du schreibst, und warum hier alle Backslashes escaped werden müssen!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hallo Felix,

      Du scheinst Backslashes escapen zu müssen... Warum?

      Ok, ich verstehe: Mehr Angaben, war blöd von mir... ;o)
      Es handelt sich um Javascript. Das "Grund-"Javascript ist ein fertiges Script von Mircosoft. Da heisst es (Auszug):

        
        
      function Convert(op, dataType, val,change) {  
          var num, cleanInput, m, exp;  
        
      ...  
        
          else if(dataType == "Double" || dataType == "Single") {  
        
       exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\" + val.decimalchar + "(\\d+))?\\s*$");  
             m = op.match(exp);  
              if (m == null)  
                  return null;  
              cleanInput = m[1] + (m[2].length>0 ? m[2] : "0") + "." + m[4];  
              num = parseFloat(cleanInput);  
              return (isNaN(num) ? null : num);  
          }  
        
      ...  
        
      }  
        
      
      

      Da ich aber nicht einen decimalchar übergeben will, sollte nun einfach [.-,] rein. Escapen scheint ja in Javascript notwendig zu sein...

      Gruss
      LeKuchen

      1. Lieber Lebkuchen,

        Es handelt sich um Javascript. Das "Grund-"Javascript ist ein fertiges Script von Mircosoft.

        Sicher, dass das M$-Script nicht eher JScript ist?

        Da heisst es (Auszug):

        function Convert(op, dataType, val,change) {

        var num, cleanInput, m, exp;

        ...

        else if(dataType == "Double" || dataType == "Single") {

        exp = new RegExp("^\s*([-\+])?(\d+)?(\" + val.decimalchar + "(\d+))?\s*$");
               m = op.match(exp);
                if (m == null)
                    return null;
                cleanInput = m[1] + (m[2].length>0 ? m[2] : "0") + "." + m[4];
                num = parseFloat(cleanInput);
                return (isNaN(num) ? null : num);
            }

        ...

        }

        
        > Da ich aber nicht einen decimalchar übergeben will, sollte nun einfach [.-,] rein.  
        
        Die Funktion bekommt in der Variablen "val" wohl eine Referenz auf ein Objekt übermittelt, das eine Eigenschaft "decimalchar" kennt... Kann ich jetzt so spontan nicht viel mit anfangen.  
          
        Klappt es denn nicht, wenn Du anstatt ...\\" + val.decimalchar + "(\\... einfach ...([.-+](... schreibst?  
          
        
        > Escapen scheint ja in Javascript notwendig zu sein...  
        
        So? Und wo steht das [geschrieben](http://de.selfhtml.org/javascript/objekte/regexp.htm#allgemeines)?  
          
        Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),  
          
        Felix Riesterer.
        
        1. Hallo Felix,

          Sicher, dass das M$-Script nicht eher JScript ist?

          Ja, sicher. Wenn Du zufällig Windows (XP)-Nutzer bist und NET Framework installiert hast, findest Du das gesamte Script unter: %Windir%\Microsoft.NET\Framework\v1.x.xxxx\ASP.NETClientFiles\WebUIValidation.js

          Die Funktion bekommt in der Variablen "val" wohl eine Referenz auf ein Objekt übermittelt, das eine Eigenschaft "decimalchar" kennt...

          Ja. val ist ein Objekt, op ein String. Aber ich möchte bei meinem val wie gesagt die Eigenschaft weglassen und ein Set von Dezimaltrennzeichen zulassen wie Du ja vorher schon richtig erkannt hast....

          Kann ich jetzt so spontan nicht viel mit anfangen.

          Das Script validiert u.a. die Eingabe in ein Webformular, in diesem Fall checkt es nach dem Datentyp Double und returnt bei einem Fehler null. Da das Originalscript aber z.B. unter Firefox etc. nicht läuft, programmiere ich gerade eine eigene Version (Javascriptseitige Plausibilisierung ist nur ein Teil, beim Laden/Speichern der Seite das ganze serverseitig).

          Klappt es denn nicht, wenn Du anstatt ...\" + val.decimalchar + "(\... einfach ...([.-+](... schreibst?

          Nein.

          Escapen scheint ja in Javascript notwendig zu sein...
          So? Und wo steht das geschrieben?

          Wie auch immer, das Originalscript funktioniert (mit dem Escapen), mag ja sein, dass es nicht notwendig ist (Vielleicht wg. des newen der RexExp?). Aber man muss ja nicht das Rad neu erfinden, wenn da schon eine Lösung existiert die nur in einem kleinen Aspekt abgeändert werden muss, oder?

          Danke für Deine Mühe.

          Gruss
          LeKuchen

          1. Lieber Tortenguss,

            Klappt es denn nicht, wenn Du anstatt ...\" + val.decimalchar + "(\... einfach ...([.-+](... schreibst?

            Nein.

            Wie auch immer, das Originalscript funktioniert (mit dem Escapen), mag ja sein, dass es nicht notwendig ist (Vielleicht wg. des newen der RexExp?). Aber man muss ja nicht das Rad neu erfinden, wenn da schon eine Lösung existiert die nur in einem kleinen Aspekt abgeändert werden muss, oder?

            Und wenn Du Dein eigenes "val" übermittelst? Definiere Dir doch ein val-Objekt, in welchem die decimalchar-Eigenschaft Deinen Wünschen entspricht! Dann sollte das Script ja wie ursprünglich funktionieren, aber eben mit Deinen Vorgaben!

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.