Jörg Peschke: Reguläre Ausdrücke: ?-Quantifier unter IE5.0

Hallo,
Ich habe ein Problem mit dem IE5.0 - offenbar kann der keine "?"-Quantifier in JavaScript.
Ich habe hierzu als braver SelfHTML-Forums-Benutzer auch bereits die Suche bemüht - leider bringt der "lösungsvorschlag" in diesem Post orginal gar nichts.

Worum es geht:
Ich müsste mit JavaScript aus einem string mehrere Blöcke rausschnippseln, in der form
#START# irgendein text#ENDE#

Sprich ein
funde = text.match(/#START#.*?#ENDE#/g);

nur,wie gesagt, das ? will er nicht.

Weiss jemand, wie man das umgehen könnte?

Viele Grüße,
Jörg

  1. hi,

    Ich habe hierzu als braver SelfHTML-Forums-Benutzer auch bereits die Suche bemüht - leider bringt der "lösungsvorschlag" in diesem Post orginal gar nichts.

    das, was dort gesagt wurde - nämlich das

    funde = text.match(/#START#.*?#ENDE#/g);

    .*? erst mal weniog sinnvoll ist in JS-regexp, würde ich aber vermutlich unterschreiben.

    nur,wie gesagt, das ? will er nicht.

    was willst du denn damit, an dieser stelle?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. .*? erst mal weniog sinnvoll ist in JS-regexp, würde ich aber vermutlich unterschreiben.

      hallo wahsaga,
      bin zufälligerweise genau an dem selben ding.
      heisst ich will per js-regExp a-tags rausfiltern. da benutz ich grad auch den "mach-mich-ungierig"-operator, also das ?.
      und da ist es durchaus sinnvoll, bzw. notwendig den zu verwenden. oder hast du da nen anderen vorschlag?
      meine lösung sieht grad so aus:
      var regExp = new RegExp("<a(.+?)href\s*=\s*(".*?"|'.*?')(.*?)>(.*?)</a>","i");
      var matches = currVal.match(regExp);

      1. gruss schildi, hallo Jörg,

        .. da benutz ich grad auch den "mach-mich-ungierig"-operator, also das ?.
        und da ist es durchaus sinnvoll, bzw. notwendig den zu verwenden.
        oder hast du da nen anderen vorschlag?

        @schildi
           das hat ja auch niemand in abrede gestellt. Jörg fragt ja nach alternativen
           fuer nicht gierige suchmuster, die ohne den dafuer vorgesehene "?" quantifier
           auskommen, da man im javascript-bereich immer noch auf RegExp engines stoesst,
           die ebendiesen nicht unterstuetzen.

        dein zuletzt gegebenes bsp. aufgreifend koennte
           eine solche loesung folgendermassen aussehen:

        ~~~javascript var str = '<a href="link01.html">link01.html</a>\n' +   // matched;
                     '<a href="about:blank"><about:blank</a>\n' +  // not matched;
                     '<a href="link02.html">link02.html</a>\n' +   // matched;
                     '<a href="about:blank">about:blank</a>';      // matched;
           var regX = /<a[^>]>[^<]</a>/gi;
           var arr = str.match(regX);
           alert(arr.length + "\n\n" + arr.join("\n"));

          
          
           der ausdruck  
           `/<a[^>]*>[^<]*<\/a>/gi`{:.language-javascript} liest sich dann so:  
           /  
            <a                           suche die zeichenfolge "<a"  
              [^>]\*            dann alle zeichen, die nicht ">" sind  
                   >                 bis zum ersten vorkommenden ">"  
                    [^<]\*       dem nur nicht-"<"-zeichen nachfolgen  
                         <\/a>  bis die sequenz "</a>" gefunden wird  
           /gi       der ausdruck gilt dann fuer den gesamten string  
                    [g(lobal)-flag], wobei die gross/kleinschreibung  
                          ignoriert werden darf [i(gnore case)]-flag  
          
          
           der ausdruck kann aber leider nur dann anwendung finden,  
           wenn sicher ist, dass keine "<"-zeichen innerhalb der  
           anker-/link-elemente stehen (siehe obiges bsp.).  
          
          
          
           by(t)e by(t)e - 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  
          
        ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
        
        1. der ausdruck kann aber leider nur dann anwendung finden,
             wenn sicher ist, dass keine "<"-zeichen innerhalb der
             anker-/link-elemente stehen (siehe obiges bsp.).

          danke für die ausführliche beschreibung. aber genau dieses problem mus leider ja verhindert werden, das ein bestimmtes zeichen nicht auftreten darf. sonst hätte ich es ja auch ohne den ? quantifier gemacht.

          da muss man wohl langsam abschied nehmen von mr. internet explorer 5.

    2. Hallo,

      das, was dort gesagt wurde - nämlich das

      funde = text.match(/#START#.*?#ENDE#/g);

      .*? erst mal weniog sinnvoll ist in JS-regexp, würde ich aber vermutlich unterschreiben.

      Ich will aus einem Text der form
      text = "#START# text 1 #ENDE# etz irgendwas anderes #START# text 2 #ENDE# nochmal was";

      am Schluss das heraushaben (in Form eines Arrays):
      ("#START# text 1 #ENDE#", "#START# text 2 #ENDE#")

      wenn ich ein gieriges Suchmuster verwende, also:
      text.match(/#START#.*#ENDE#/g);
      kriege ich:
      "#START text1 #ENDE# etz irgendwas anderes #START# text 2 #ENDE#";

      Deswegen brauch ich das ?, damits funktioniert.

      Ich habe jetzt die folgende Lösung gefunden:
         var tokens = text.split("#START#");
         var result = new Array();
         for (var i = 0; i <tokens.length; i++) {
            var sub = tokens[i].match(/.+#ENDE#/);
            if (sub) {result[result.length] = "#START#"+sub;}
          }

      Das funktioniert, ich bekomme in result das, was ich haben will.
      Aber ob das die eleganteste Lösung ist, weiss ich nicht.

      nur,wie gesagt, das ? will er nicht.

      was willst du denn damit, an dieser stelle?

      gruß,
      wahsaga

  2. gudn tach!

    [...] auch bereits die Suche bemüht - leider bringt der "lösungsvorschlag" in diesem Post orginal gar nichts.

    das ist wahr.

    funde = text.match(/#START#.*?#ENDE#/g);
    nur,wie gesagt, das ? will er nicht.

    Weiss jemand, wie man das umgehen könnte?

    ja.
    eine moeglichkeit waere, den string zwei mal zu splitten und anschliessend etwaige zusammengehoerende teile wieder zusammenzuwursteln.
    wie das so ungefaehr in php geht, steht hier. in javascript sieht es etwas aehnlich aus.

    eine andere moeglichkeit waere, in einer schleife mit indexOf() (beachte den zweiten parameter) durch den string zu marschieren.

    was effizienter waere, weiss ich nicht. (ausprobieren?)

    prost
    seth