Cruz: nested *?+ in regexp

Hi People!

Ich komme einfach nicht mit diesem Error klar.
Ich versuche ein HTML Dokument einzulesen und ab einer bestimmten Zeichenkette mit neuem code zu ersetzen. Ich kriege aber immer diese nervige Error Meldung "nested *?+ in regexp" die mir echt gar nichts sagt. Kann mir jemand erklären was es bedeutet, oder wann es normalerweise vorkommt?

Gruß
Cruz

  1. Hi,

    Ich versuche ein HTML Dokument einzulesen und ab einer bestimmten Zeichenkette mit neuem code zu ersetzen. Ich kriege aber immer diese nervige Error Meldung "nested *?+ in regexp" die mir echt gar nichts sagt. Kann mir jemand erklären was es bedeutet, oder wann es normalerweise vorkommt?

    Du suchst vermutlich nach irgendetwas wie /Hallo???/ oder /*+*/ oder so. Die Zeichen "?", "+" und "*" haben in RegExp eine besondere Bedeutung; wenn Du nach diesen suchen willst, mußt Du sie maskieren: /Hallo???/, /\+\/

    Cheatah

    1. Du suchst vermutlich nach irgendetwas wie /Hallo???/ oder /*+*/ oder so. Die Zeichen "?", "+" und "*" haben in RegExp eine besondere Bedeutung; wenn Du nach diesen suchen willst, mußt Du sie maskieren: /Hallo???/, /\+\/

      Cheatah

      Eigentlich dursuche ich einen langen string in dem der string $replace mit leerzeichen ersetzt werden soll:

      $string =~ s/$replace/ /g;

      Könnten die Sonderzeichen zu dieser Fehlermeldung führen, wenn sie in $replace enthalten sind?

      Cruz

      1. $string =~ s/$replace/ /g;

        Könnten die Sonderzeichen zu dieser Fehlermeldung führen, wenn sie in $replace enthalten sind?

        Ja, natürlich.
        Du mußt also zunächst einmal Deinen Werte in "$replace" entsprechend escapen. Das machst Du dann am besten ebenfalls mit einem regulären Ausdruck.

        Aus dem Archiv-Suchskript dieses Servers:

        # --------------------------------------------------------
          # Sollen Metazeichen entwertet werden?
          if (! $FORM {'meta'})
             {
               # ---------------------------------------------------
               # Meta-Zeichen in ihre "entwerteten" Aequivalente verwandeln
               # ---------------------------------------------------
               # "" muss als erstes Zeichen ersetzt werden ...
               $string =~ s/\/\\/g;                   # "" -> "\"
               # ---------------------------------------------------
               # ... der Rest geht tatsaechlich parallel
               $string =~ s/([.^$()[/]{}*+?])/\$1/g; # "^" -> "^"
               # (manchmal ist Perl wirklich *gnadenlos* kryptisch)
               # ---------------------------------------------------
             }

        1. $string =~ s/$replace/ /g;

          Könnten die Sonderzeichen zu dieser Fehlermeldung führen, wenn sie in $replace enthalten sind?

          Ja, natürlich.
          Du mußt also zunächst einmal Deinen Werte in "$replace" entsprechend escapen. Das machst Du dann am besten ebenfalls mit einem regulären Ausdruck.

          Aus dem Archiv-Suchskript dieses Servers:

          # --------------------------------------------------------
            # Sollen Metazeichen entwertet werden?
            if (! $FORM {'meta'})
               {
                 # ---------------------------------------------------
                 # Meta-Zeichen in ihre "entwerteten" Aequivalente verwandeln
                 # ---------------------------------------------------
                 # "" muss als erstes Zeichen ersetzt werden ...
                 $string =~ s/\/\\/g;                   # "" -> "\"
                 # ---------------------------------------------------
                 # ... der Rest geht tatsaechlich parallel
                 $string =~ s/([.^$()[/]{}*+?])/\$1/g; # "^" -> "^"
                 # (manchmal ist Perl wirklich *gnadenlos* kryptisch)
                 # ---------------------------------------------------
               }

          Warum einfach, wenns auch kompliziert geht ;-)
          $replacenew = quotemeta( $replace );

          alternative kann man auch in der RegExp angeben, das der folgende Stringteil gequotet werden soll:
          $string =~ s/\Q$replace\E/ /g;

          Jörk

          1. $string =~ s/([.^$()[/]{}*+?])/\$1/g; # "^" -> "^"

            Warum einfach, wenns auch kompliziert geht ;-)
            $replacenew = quotemeta( $replace );

            Aus welchem Modul ist "quotemeta"?

            Ich weiß nicht, was auf dem TeamOne-Server alles installiert ist, da habe ich mich lieber zurückgehalten ...
            (Außerdem sah *meine* "Lösung" viiiiel schrecklicher aus, das hier ist schon die Kurzform von Frank Schönmann ...)

            alternative kann man auch in der RegExp angeben, das der folgende Stringteil gequotet werden soll:
            $string =~ s/\Q$replace\E/ /g;

            Tja, das darf ich leider nicht verwenden, weil ich an der Stelle, an er ich die Suche durchführe, die Abfrage, ob ich Metazeichen entwerten will oder nicht, nicht mehr durchführen kann.
            (Ansonsten muß ich an dieser Stelle ein kaskadiertes if-then-else über mehrere Stufen mit 2 hoch n Zweigen machen, weil $replace bei mir noch von einer Handvoll anderer Schalter abhängen kann, beispielsweise von der Suche an Wortgrenzen und Case-Sensitivität und ...)

            1. Hi,

              $replacenew = quotemeta( $replace );

              Aus welchem Modul ist "quotemeta"?

              aus dem Modul "Perl".

              HTH ;-)

              Cheatah

              P.S.: Soll heißen: Der Befehl ist ganz regulär. In perlfunc und perldelta habe ich auch keinen Hinweis darauf gefunden, daß er irgendwie neu ist; er scheint also schon vor Perl 5 existiert zu haben. Sollte also auf keinem Server ein Problem sein, sofern der Server selbst kein Problem ist :-)

              1. Aus welchem Modul ist "quotemeta"?
                aus dem Modul "Perl".
                HTH ;-)

                Inzwischen habe ich auch nachgesehen - und das Such-Skript um eine Zeile gekürzt, yeah ...