Bautz: Reguläre Ausdrücke

Hallo,
in den regulären Ausdrücken müssen ja einige Sonderzeichen wie "." u.a. als . angegeben werden, wenn nach ihnen gesucht werden soll.
Nun ist es schwierig, wenn man nicht dauernd damit arbeitet, zu wissen, welche der Sonderzeichen so maskiert werden müssen.
Daher die Frage: Kann ich im regulären Ausdruck generell jedes zu suchende Sonderzeichen sicherheitshalber mit vorangestelltem \ angeben?
Gruß
Bautz

  1. Daher die Frage: Kann ich im regulären Ausdruck generell jedes zu suchende Sonderzeichen sicherheitshalber mit vorangestelltem \ angeben?

    natürlich kannst du das, aber das wird nicht den gewünschten erfolg bringen

    du solltest dich zuerst mal damit beschäftigen, welche reguläre ausdrücke du verwendest - am gebräuchlichsten sind POSIX und perl-kompatible reguläre ausdrücke, diese nutzen NICHT die selbe syntax

    das handbuch zum entsprechenden regelwerk sollte dir dann auch sagen, was du wann unter welchen umständen wie escapen musst

    1. Daher die Frage: Kann ich im regulären Ausdruck generell jedes zu suchende Sonderzeichen sicherheitshalber mit vorangestelltem \ angeben?

      Meiner Erfahrung nach kannst du dies problemlos tun.

      Gruß Peter

    2. natürlich kannst du das, aber das wird nicht den gewünschten erfolg bringen

      Ach was? Meine Frage impliziert natürlich, dass dies den gewünschen Erfolg haben soll
      .

      du solltest dich zuerst mal damit beschäftigen, welche reguläre ausdrücke du verwendest - am gebräuchlichsten sind POSIX und perl-kompatible reguläre ausdrücke, diese nutzen NICHT die selbe syntax

      Ich verwende im   P e r l -Programm    "if ($feld =~ /..../)". Ich gehe daher davon aus, dass dies ein Perl kompatibler Ausdruck ist.

      das handbuch zum entsprechenden regelwerk sollte dir dann auch sagen, was du wann unter welchen umständen wie escapen musst

      Genau das wollte ich ja vermeiden, daher meine Frage! Wenn ich alle paar Monate auf das Problem stoße, wäre es schön, nicht jedesmal groß suchen zu müssen.

      1. gudn tach!

        Ich verwende im   P e r l -Programm    "if ($feld =~ /..../)". Ich gehe daher davon aus, dass dies ein Perl kompatibler Ausdruck ist.

        sollte man meinen. ist aber leider nicht 100% so. die perl-compatiblen ausdruecke (pcre) werden parallel zu perl entwickelt weshlab sich da immer wieder (wengistens temporaere) unterschiede einschleichen.

        btw. die punkte sind bei dir jetzt bloss meta-syntaktisch gemeint, oder? denn /..../ koenntest du vereinfachen (z.b. u.u. durch length()==4).

        Genau das wollte ich ja vermeiden, daher meine Frage! Wenn ich alle paar Monate auf das Problem stoße, wäre es schön, nicht jedesmal groß suchen zu müssen.

        nutze bookmarks! (scnr)

        du solltest imho das manual (perldoc perlre) benutzen oder dir ne liste ausdrucken und neben den bildschirm haengen.
        pauschales escapen ist wie gesagt eine ganz schlechte idee.

        prost
        seth

        1. Hi,

          denn /..../ koenntest du vereinfachen (z.b. u.u. durch length()==4).

          Nein, durch length() > 4 (wegen der fehlenden Anker ^ und $)

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          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,

            denn /..../ koenntest du vereinfachen (z.b. u.u. durch length()==4).

            Nein, durch length() > 4 (wegen der fehlenden Anker ^ und $)

            Nein, durch length() >= 4

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            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. gudn tach!

              denn /..../ koenntest du vereinfachen (z.b. u.u. durch length()==4).

              Nein, durch length() > 4 (wegen der fehlenden Anker ^ und $)

              Nein, durch length() >= 4

              ;-)

              prost
              seth

        2. btw. die punkte sind bei dir jetzt bloss meta-syntaktisch gemeint, oder?

          ja

          d»» du solltest imho das manual (perldoc perlre) benutzen oder dir ne liste ausdrucken und neben den bildschirm haengen.
          Wenn Du wüßtest, wieviele Listen ich schon habe!
          Aber da muss ich mich wohl leider damit abfinden.
          Gruß
          Bautz

  2. gudn tach!

    Daher die Frage: Kann ich im regulären Ausdruck generell jedes zu suchende Sonderzeichen sicherheitshalber mit vorangestelltem \ angeben?

    short answer: no.

    long answer: nooooooooooo!

    pauschales escapen ist eine ganz schlechte idee, z.b. hatte \K bis vor wenigen monaten in perl noch die bedeutung des literalen "K" (aber auch bloss aus kulanz, weil was anderes noch keinen sinn gemacht haette und wer will schon fehlermeldungen wegen sowas um die ohren gehauen bekommen). seit 5.9.3 (iirc, spaetestens jedenfalls seit 5.10.0) ist \K etwas gaaanz anderes.

    prost
    seth

    1. pauschales escapen ist eine ganz schlechte idee, z.b. hatte \K bis vor wenigen monaten in perl noch die bedeutung des literalen "K" (aber auch bloss aus kulanz, weil was anderes noch keinen sinn gemacht haette und wer will schon fehlermeldungen wegen sowas um die ohren gehauen bekommen). seit 5.9.3 (iirc, spaetestens jedenfalls seit 5.10.0) ist \K etwas gaaanz anderes.

      Hatte nur escapen von Sonderzeichen geschrieben.

      1. Hi,

        pauschales escapen ist eine ganz schlechte idee, z.b. hatte \K bis vor wenigen monaten in perl noch die bedeutung des literalen "K" (aber auch bloss aus kulanz, weil was anderes noch keinen sinn gemacht haette und wer will schon fehlermeldungen wegen sowas um die ohren gehauen bekommen). seit 5.9.3 (iirc, spaetestens jedenfalls seit 5.10.0) ist \K etwas gaaanz anderes.
        Hatte nur escapen von Sonderzeichen geschrieben.

        Und? Was ändert das?
        Was, wenn eines Tages eines der Sonderzeichen eine Sonderbedeutung bekommt? Zum Beispiel , könnte ein Shortcut für Interpunktionszeichen werden.

        Was definierst Du als Sonderzeichen? Ist aber egal, denn es könnte jedes derzeit noch nicht benutzte Zeichen treffen.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        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.
  3. Moin, moin!

    Du kannst Ausdrücke in \Q und \E einschließen. Dann stellen Sonderzeichen wie Punkte kein Problem mehr dar, sie werden wie maskiert behandelt.

    Alles klar?

    Norbert

    1. Moin, moin!

      Du kannst Ausdrücke in \Q und \E einschließen. Dann stellen Sonderzeichen wie Punkte kein Problem mehr dar, sie werden wie maskiert behandelt.

      Alles klar?

      Hi,
      wenn das so innerhalb eines regulären Ausdrucks geht?
      Also $a =~ /^\Q?\E/;    gleichbedeutend mit $a =~ /^?/;
      Gruß
      Bautz

      1. Nochmals moin, moin!

        Ja, genau so ist das.

        Norbert

        1. Nochmals moin, moin!

          Ja, genau so ist das.

          Hi,
          ja dann habe ich ja genau was ich will! Mit etwas mehr Schreibaufwand weniger Suchaufwand!
          Danke

    2. gudn tach!

      Du kannst Ausdrücke in \Q und \E einschließen. Dann stellen Sonderzeichen wie Punkte kein Problem mehr dar, sie werden wie maskiert behandelt.

      aber auch da gibt's ausnahmen: "You cannot include a literal $ or @ within a \Q sequence." (perldoc perlre)

      prost
      seth

      1. Du kannst Ausdrücke in \Q und \E einschließen. Dann stellen Sonderzeichen wie Punkte kein Problem mehr dar, sie werden wie maskiert behandelt.

        aber auch da gibt's ausnahmen: "You cannot include a literal $ or @ within a \Q sequence." (perldoc perlre)

        Hi,
        wenn es bei den beiden Ausnahmen bleibt, dann gehts ja. Das kann ich mir gerade noch merken!
        Gruß
        Bautz

  4. Hallo,
    jetzt habe ich es einmal mit "Escape" versucht.
    Aufgabe ist es, festzustellen ob eines der nachfolgenden Sonderzeichen innerhalb eines Strings (ab Stelle 2 und bis zur vorletzten Stelle) vorhanden ist.
    Mit meinem Ursprungsausdruck erhielt ich die Fehlermeldung:
        Unmatched [ in regex; ......

    Dann habe ich nach und nach [ und ] und die anderen Klammern "escaped"
    Der reguläre Ausdruck sieht inzwischen so aus:

    $teststring =~ /^.+[^°!"§$%&/()[]{}=?\`´\*+~'#<>;,:._-].+$/;

    Es kommt aber immer noch die Meldung:

    Unmatched [ in regex; marked by <-- HERE in m/^.+[ <-- HERE \^\xb0!"\xa7\$%&/ at .....

    Kann mir jemand einen Tipp geben?

    Gruß
    Bautz

    1. Hallo,

      $teststring =~ /^.+[^°!"§$%&/()[]{}=?\`´\*+~'#<>;,:._-].+$/;

      -----------------------------------^
      Der slash arbeitet als Delimiter für den Ausdruck. Wieso hast du denn ausgerechnet den nicht escaped?

      Gruß, Don P

    2. gudn tach!

      Aufgabe ist es, festzustellen ob eines der nachfolgenden Sonderzeichen innerhalb eines Strings (ab Stelle 2 und bis zur vorletzten Stelle) vorhanden ist.

      was genau sind denn bei dir zeichen, die keine sonderzeichen sind? evtl. waere die negation leichter?

      Dann habe ich nach und nach [ und ] und die anderen Klammern "escaped"
      Der reguläre Ausdruck sieht inzwischen so aus:

      $teststring =~ /^.+[^°!"§$%&/()[]{}=?\`´\*+~'#<>;,:._-].+$/;

      wie Don P schon sagte, darf der delimiter (slash) nicht unescaped in einer zeichenklasse stehen. ansonsten brauchst du, abgesehen von "]", "" und "$" eigentlich nix weiter escapen, wenn du ein paar sachen beachtest.

      ^ muss nicht escaped werden, wenn es nicht am anfang steht
        - muss nicht escaped werden, wenn es am rand steht

      $teststring =~ /.[°^!"§$%&/()[]{}=?\`´*+~'#<>;,:._-]./;

      prost
      seth

      1. Hi,
        nachdem
           $teststring =~ /.[°^!"§$%&/()[]{}=?\`´*+~'#<>;,:._-]./;
        klappte, wollte ich jetzt abhängig von bestimmten Voraussetzungen unterschiedliche Prüfungen durchführen, also z.B.
        if (....) {
          $regel = ".[°^!"§$%&/()[]{}=?\`´*+~'#<>;,:._-]."}
        else {
          $regel = ".[°^!"§$%&/()[]{}=?\`´*+~'."}

        $teststring =~ /$regel/;    (oder auch /"$regel"/;)

        Das " zu maskieren in dem String, war mir klar, aber warum muss jetzt plötzlich noch mehr maskiert werden?
        Es kommt nämlich der Fehler:

        Nested quantifiers in regex; marked by <-- HERE in m/.[°^!"§$%&/()[]{}=?`´*+ <-- HERE ~'#<>;,:._-]./

        Kann mir das jemand erklären?
        Gruß
        Bautz

        1. Hallo Bautz!

          Lass mich erstmal Deinen Schreibstil anmeckern, ja? ;)

          Bei kurzen Anweisungen kann man einen Block sicher in einer Zeile schreiben:

          if (...) { tuwas(); }

          Wenn du aber einrückst, dann bitte der schließenden Klammer des Blocks auch eine eigene Zeile gönnen:

          if (....) {  
            $regel = ".[°^!\"§\$%&\/()[\]{}=?\\`´*+~'#<>;,:._-]."  
          }
          

          Ich habe zunächst gedacht, diese letzte »}« gehört noch zum RegExp! Ein Semikolon ist nicht notwendig, wenn ein Block eine einzige Anweisung enthält, ich setzte jedoch immer einen, denn vielleicht will ich später das Programm überarbeiten und weitere Anweisungen hinzufügen?

          if (....) {  
            $regel = ".[°^!\"§\$%&\/()[\]{}=?\\`´*+~'#<>;,:._-].";  
          }
          

          So, nun zum RegExp-Problem. Zunächst fehlt in Deinem else-Zweig die schließende Klammer »]« der Klasse:

          else {  
            $regel = ".[°^!\"§\$%&\/()[\]{}=?\\`´*+~'."  
                                                   # ^ hier gehört ] vor dem Punkt hin  
          }
          

          Ferner hat Perl wunderbare Operatoren, siehe perldoc perlop:

          --------------------
            Quote and Quote-like Operators
              While we usually think of quotes as literal values, in Perl they
              function as operators, providing various kinds of interpolating and
              pattern matching capabilities. Perl provides customary quote characters
              for these behaviors, but also provides a way for you to choose your
              quote character for any of them. In the following table, a "{}"
              represents any pair of delimiters you choose.

          Customary  Generic        Meaning        Interpolates
                      ''       q{}          Literal             no
                      ""      qq{}          Literal             yes
                      ``      qx{}          Command             yes*
                              qw{}         Word list            no
                      //       m{}       Pattern match          yes*
                              qr{}          Pattern             yes*
                               s{}{}      Substitution          yes*
                              tr{}{}    Transliteration         no (but see below)
                      <<EOF                 here-doc            yes*

          * unless the delimiter is ''.
          --------------------

          In diesem Fall bietet sich qr (steht für quoted RegExp) an:

          $regel = qr/pattern/;

          Immer drauf achten, dass gewählte Delimiter maskiert werden, falls sie im Pattern vorkommen!

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. Hallo Patrick!

            Danke für die ausführlichen Erläuterungen.

            In diesem Fall bietet sich qr (steht für quoted RegExp) an:

            $regel = qr/pattern/;

            Wenn ich das so angebe, wie muss dann die Abfrage lauten?

              
            $teststring =~ /$regel/;    oder  
              
            $teststring =~ /"$regel"/;    oder  
              
            $teststring =~ "$regel";    weil $regel schon / enthält?  
              
            oder ....  
            
            

            Dank und Grüße
            Bautz

            1. Hallo!

              Wenn ich das so angebe, wie muss dann die Abfrage lauten?

              Probieren geht über Studieren (was mir eigentlich zuwider ist).

              $teststring =~ /$regel/;

              ist wohl die funktionierende Variante,
              warum weiß ich allerdings nicht.
              Grüße
              Bautz

              1. Hallo Bautz!

                Probieren geht über Studieren (was mir eigentlich zuwider ist).

                Dann studier mal »Programmieren mit Perl« ;)

                warum weiß ich allerdings nicht.

                s. mein eben agesetztes Posting.

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. Hallo Ludwig!
                  Danke für die Hilfe
                  Gruß
                  Charly(?)

                  1. Hallo ...!

                    Hallo Ludwig!

                    Hättest Du hier »Hallo Jess« geschrieben!

                    Charly(?)

                    Du weißt nicht, wen ich meine? Aber Schweiß es!

                    Egal, zurück zum Thema. Das geht allerdings auch ohne Delimiter:

                    my $str = "Ich bin ein Börliner";  
                    my $regel = qr/ö/;  
                    print $str if $str =~ $regel;
                    

                    Viele Grüße aus Frankfurt/Main,
                    Patrick

                    --

                    _ - jenseits vom delirium - _
                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    Nichts ist unmöglich? Doch!
                    Heute schon gegökt?
                    1. Hallo,

                      Du weißt nicht, wen ich meine? Aber Schweiß es!

                      Meinst du Karli?
                      Der sitzt im Nachbarzimmer und kämpft mit uns mit/gegen Perl!
                      Woher kennst Du den?
                      Gruß
                      Bautz

                      1. Hallo Bautz!

                        Meinst du Karli?

                        Keine Ahnung, ist er Bäckereifachverkäufer? ;)

                        kämpft mit uns mit/gegen Perl!

                        Diesen Kampf kann man nur verlieren, denn Perl ist mächtig!

                        Woher kennst Du den?

                        Kennen ist übertrieben, aber ich studiere neben »Programmieren mit Perl« noch täglich meine Logfiles.

                        Viele Grüße aus Frankfurt/Main,
                        Patrick

                        --

                        _ - jenseits vom delirium - _
                        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                        Nichts ist unmöglich? Doch!
                        Heute schon gegökt?
                        1. Hallo Patrick!
                          der hat aber einen anderen Rechner!
                          Gruß
                          Bautz

                          1. Hallo Bautz!

                            der hat aber einen anderen Rechner!

                            Besser so. Ich würde keinen Bäckereifachverkäufer an meinem Rechner lassen. Aber vielleicht hängt der Rechner am selben Router?

                            Viele Grüße aus Frankfurt/Main,
                            Patrick

                            --

                            _ - jenseits vom delirium - _
                            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                            Nichts ist unmöglich? Doch!
                            Heute schon gegökt?
                            1. Hallo Patrick!

                              der hat aber einen anderen Rechner!

                              Besser so. Ich würde keinen Bäckereifachverkäufer an meinem Rechner lassen.

                              Karli ist aber kein Bäckereifachverkäufer sondern auch Schüler!

                              Aber vielleicht hängt der Rechner am selben Router?

                              Das kann sein, aber für die Technik sind andere zuständig.
                              Schönen Sonntag
                              Bautz

            2. Hallo Charly!

              $teststring =~ /$regel/;    oder
              $teststring =~ /"$regel"/;    oder
              $teststring =~ "$regel";    weil $regel schon / enthält?

                
              Erstere. Bei:  
                
              $regel = qr/pattern/;  
                
              ist der Wert von $regel genau pattern, nur hier bereits als RegEx vorkompiliert. Der Operator »qr« an sich führt kein Matching durch. Die kompilierte Form der RegEx wird für die zukünftige Nutzung lediglich zurückgegeben (aus »Programmieren mit Perl«).  
                
                
              Viele Grüße aus Frankfurt/Main,  
              Patrick
              
              -- 
              ![](http://www.atomic-eggs.com/fuernA.jpg)  
                
              \_ - jenseits vom delirium - \_  
                
              [[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash](http://www.atomic-eggs.com/)]  
              Nichts ist unmöglich? [Doch!](http://www.atomic-eggs.com/cwi/cwi_4.shtml)  
              Heute schon ge[gök](http://goek.atomic-eggs.com/goek_goek.html)t?