Katharina: Regular Expression führt zu JS Fehler

Hallo,

ich habe einen regulären Ausdruck zusammengebaut, der direkt zu Beginn meines Programms gesetzt werden soll. Nach dem Laden der Seite bekomme ich einen Javascript Fehler:

Fehler: invalid quantifier     +)?s*[(]?(s*[(]?[0-9]s*[)]?s*[.]?s*[-/]*s*){6,})>?s*$/

Anscheinend merkt der Compiler nicht, dass das '+' mit einem Backslash escaped wurde.

Hier ist mein Ausruck:
var reg = new RegExp("/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");

Wo liegt das Problem?

Katharina


  1. \s ↩︎

  1. Hallo,

    var reg = new RegExp("/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");

    Wo liegt das Problem?

    mit zwei Backslashes vor dem + gibt es zumindest keinen JS-Fehler mehr.
    Ich bin mir aber im Moment nicht sicher, ob der reguläre Ausdruck dann noch funktioniert wie gewünscht.

    Am einfachsten ist es aber, wenn Du das + einfach in eine Zeichenklasse packst, also ([+]), denn inerhalb einer Zeichenklasse ist ein + einfach ein +.

    Ciao,
    Andreas

    --
    "No, Sir, I don't like it." - (Mr. Horse)

    1. \s ↩︎

    1. Hallo Andreas,

      Ich habe die Zeichenfolge '+' durch'[+]' ersetzt und habe jetzt keinen JS Fehler mehr.

      Allerdings matcht der Ausdruck jetzt nicht richtig.

      Beispiel:
      var reg = new RegExp("/[1]*<?(\s*[+]?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");
      var nr;
      if (!reg.test(nr)) alert('not ok');
      else alert('ok');

      Für nr='abc' bekomme ich die Meldung 'not ok', was auch richtig ist. Allerdings bekomme ich für nr='0177 65432' auch die Meldung 'not ok' und das sollte allerdings 'ok' liefern.

      Ist da evtl. der Ausdruck falsch?

      Katharina


      1. \s ↩︎

      1. Hallo,

        was für Zeichenketten möchtest Du denn genau herausfiltern?
        Und wie sieht der String aus, den Du dem regulären Ausdruck übergibst?

        Wenn Du wirklich nur Ausdrücke à la a='blah' und b='123 789' erwischen willst, dann kannst Du das sehr viel einfacher hinbekommen.

        Ciao,
        Andreas

        --
        "No, Sir, I don't like it." - (Mr. Horse)
        1. Der Ausdruck überpüft, ob es sich um eine gültige Handynummer handelt. Er wurde mir so vorgegeben und ich soll ihn verwenden. Nur irgendetwas stimmt damit nicht. Buchstaben und Sonderzeichen sollen schon mal nicht zulässig sein (ausser '+' '-' '.' ' ' '/' ''). Ansonsten muss der String mindestens 6 Zeichen lang sein (ohne Leerzeichen am Anfang und Ende).

          D.h.
          falsch ist 'abcde', ' 0003434a', '          ', ...
          richtig ist '0177 7777777', '+49 177 777777', '06543-87878', ...

          1. Hallo,

            D.h.
            falsch ist 'abcde', ' 0003434a', '          ', ...
            richtig ist '0177 7777777', '+49 177 777777', '06543-87878', ...

            ok, das ist nun doch nicht ganz so trivial, da es ja zig Kombinationen gibt. Ich komme im Moment leider nicht dazu, Deinen regulären Ausdruck zu prüfen (Chef quasi hinter meinem Rücken...) und gehe daher einmal davon aus, daß er grundsätzlich funktioniert.

            Beherzige daher den Hinweis von Cheatah.

            Wenn Du den ganzen Backslash-Krampf umgehen möchtest, dann kannst Du den regulären Ausdruck aber auch direkt definieren, ohne erst über den String-Kontext zu gehen:
            var regexp_mobile = /[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/;

            Versuche es doch einmal so.

            Ciao,
            Andreas

            --
            "No, Sir, I don't like it." - (Mr. Horse)

            1. \s ↩︎

  2. Hi,

    Fehler: invalid quantifier     +)?s*[(]?(s*[(]?[0-9]s*[)]?s*[.]?s*[-/]*s*){6,})>?s*$/

    Der Backslash vor diesem Plus wird erstmal bei der String-Erzeugung interpretiert. Dabei wird + zu +, da + kein definiertes Steuerzeichen ist.
    Da Du den Backslash aber im regulären Ausdruck haben willst, mußt Du ihn per Backslash escapen. Dann wird bei der String-Erzeugung \ zu \ - der RegExp bekommt also + zu sehen.

    Anscheinend merkt der Compiler nicht, dass das '+' mit einem Backslash escaped wurde.

    Nein, der RegExp-Compiler kann das nicht mitbekommen, da der Backslash entfernt wurde lange bevor der RegExp-Compiler aufgerufen wird.

    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. Hi,

      heißt das, dass jeder Backslash in meinem Ausdruck mit einem Backslash escaped werden muss, damit er im regulären Ausdruck vorkommt? Also nicht nur dieser eine vor dem '+'?

      Katharina

      1. Hi,

        heißt das, dass jeder Backslash in meinem Ausdruck mit einem Backslash escaped werden muss, damit er im regulären Ausdruck vorkommt? Also nicht nur dieser eine vor dem '+'?

        das heißt, dass Du eines der allerwesentlichsten Grundprinzipien der Software-Entwicklung verinnerlichen musst: Wann immer Du einen Wert in einen Kontext bringst, *musst* Du ihn kontextspezifisch kodieren.

        Der Wert, den Du hast, ist Deine Regular Expression. Diese lautet:

        /[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/

        Du willst sie nun in einen String-Kontext bringen, nämlich Anführungszeichen drum herum setzen[1]. In einem String existieren Sonderzeichen, welche stringspezifisch kodiert werden müssen. Insbesondere ist der Backslash "" ein solches Sonderzeichen; seine Kodierung in diesem Kontext lautet "\".

        Es ist im Prinzip ganz einfach. Das einzige, was Du tun musst, ist, es immer und überall zu bedenken. *Immer* und *überall*.

        Cheatah

        [1] Warum auch immer.

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes

        1. \s ↩︎

      2. hallo Katharina,

        heißt das, dass jeder Backslash in meinem Ausdruck mit einem Backslash
        escaped werden muss, damit er im regulären Ausdruck vorkommt? Also nicht
        nur dieser eine vor dem '+'?

        ja, sobald Du darauf angewiesen bist, einen regulaeren ausdruck ueber den
           RegExp-konstruktor zu erzeugen, musst Du genau dies beachten. ausserdem
           gehoeren in diesem fall die beiden begrenzer des RegExp-literals nicht mit
           in die zeichenkette - schon aus diesem grund ist Deinem konstrukt

        var reg = new RegExp("/^[\s]*<?(\s*(\+)?\s*[\(]?(\s*[\(]?[0-9]\s*[\)]?\s*[\.]?\s*[\-\/]*\s*){6,})>?\s*$/");

        kein erfolg beschieden; besser also so -

        reg = new RegExp("^[\\s]*<?(\\s*(\\+)?\\s*[\\(]?(\\s*[\\(]?[0-9]\\s*[\\)]?\\s*[\\.]?\\s*[\\-\\/]*\\s*){6,})>?\\s*$");

        - noch einfacher waere, Du notiertest Deinen ausdruck einfach als RegExp-
           literal, dann aendert sich fuer die zeichenfolge naemlich rein gar nichts:

        ~~~javascript var regX = /[1]<?(\s(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]\s){6,})>?\s*$/;

        alert(reg.toString() == regX.toString()); // true;

          
          
          
           so long - peterS. - pseliger@gmx.net  
          
          
        
        -- 
        »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.  
        Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)  
          
        ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
        

        1. \s ↩︎

  3. Liebe Katharina,

    Hier ist mein Ausruck:
    var reg = new RegExp("/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");

    Wo liegt das Problem?

    entgegen z.B. PHP stehen in Javascript reguläre Suchmuster _nicht_ in Anführungszeichen. Nur wenn Du mit RegExp() ein solches erzeugst, dann verwendest Du Anführungszeichen, dafür aber auch keine Slashes um Dein Muster herum.

    Desweiteren meine ich mich zu erinnern, dass man einen zweiten Parameter angeben muss, der z.B. case-insensitive oder greedy steuert. In Deinem Falle lässt Du ihn komplett weg. Probiere doch einen Leerstring als zweiten Parameter!

    Probiere doch dieses hier:

    var reg = new RegExp("^[\s]*<?(\s*(\+)?\s*[\(]?(\s*[\(]?[0-9]\s*[\)]?\s*[\.]?\s*[\-\/]*\s*){6,})>?\s*$", "");

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.


    1. \s ↩︎

  4. Servus,

    Hier ist mein Ausruck:
    var reg = new RegExp[...]
    Wo liegt das Problem?

    Der RegExp-Konstruktor ist für dynamische Ausdrücke gedacht, welche sich in
    der normalen JS/RE-Syntax "var suchmuster = /muster/modifikator;" nicht
    erzeugen lassen. Also beispielsweise:

    var name = "Katharina";
    var suchmuster = new RegExp( "\b" + name + "\b", "i" );

    Der zweite Parameter ist optional.

    /[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/

    [...]

    Buchstaben und Sonderzeichen sollen schon mal nicht zulässig sein
    (ausser '+' '-' '.' ' ' '/' '')

    Hmm, ich lasse die möglichen Leerstellen mal aussen vor ('[\s]*' sollte wohl
    auch ein '\s*' werden):

    /                     #01
        ^                 #02
        <?                #03 Ein '<' darf also vorhanden sein
        (                 #04
            (+)?         #05
            [(]?         #06 für ein Zeichen braucht es normalerweise keine Klasse
            (             #07
                [(]?     #08 Möglich ist also in einer Reihe '('
                [0-9]     #09 und '0'
                [)]?     #10 und ')'
                [.]?     #11 und '.'
                [-/]*   #12 und keine oder viele, viele '-' oder '/'
            ){6,}         #13 und das ganze (08-12) mindestens sechs mal
        )                 #14
        >?                #15 siehe 03
        $                 #16
    /                     #17

    Das ist schon ein eigenartiger Ausdruck: speziell Block 08-12 lässt eine
    Menge Unsinn zu; so sind '+(123) (456) (789)' oder '<(0)./-12345>' im Sinne
    dieses Ausdrucks valide Zeichenfolgen.

    Grüsse


    1. \s ↩︎