Stefan Welscher: [Regex]Zeichenketten verbieten

Hallo,
ich hätte da ein kleines Problem.
Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann. Also: [^-\s$Zeichenkette]

Wie kann ich das anstellen? Mit qr hat das nicht geklappt - Eine andere Möglichkeit kenne ich nicht....

Danke schonmal.

  1. Hallo,

    Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann.

    Negiere einfach den Suchausdruck, indem du ein "if not", also !~ anstatt =~ verwendest, oder habe ich dich falsch verstanden?

    Markus.

    --
    http://www.apostrophitis.at
    STANDAR_D_  - ist das wirklich so schwer?
    1. Hallo,

      Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann.

      Negiere einfach den Suchausdruck, indem du ein "if not", also !~ anstatt =~ verwendest, oder habe ich dich falsch verstanden?

      Markus.

      Hallo,

      das wird nicht gehen, da der restliche (positive) Regex schon ein paar Zeilen lang ist. Was ich ausschließen möchte sind nur ein paar wenige, kleine Strings....

      1. Hi,

        Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann.

        negative Lookarounds könnten helfen.

        cu,
        Andreas

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

          Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann.

          negative Lookarounds könnten helfen.

          cu,
          Andreas

          Hi Andreas,
          das war schonmal ein guter Tipp, nur komm ich bei dem Thema nicht weiter.

          ich möchte ungefähr folgendes realisieren:

          ...(<string-a>)-(<string-b>)-([not-strings-c-to-e]<string-f>)-(<string-g>)...

          Wie/Wo soll ich hier den negative Lookaround einbauen?
          Also dass nur zwischen b und f und nur bestimmte Strings herausfallen?

          Ich hab das jetzt u.a. mal so probiert:
          ...(<string-a>)-(<string-b>)-((?!([not-strings-c-to-e]))<string-f>)-(<string-g>)...

          Aber egal wie ich es probiere - es kommt immer Mist dabei heraus.
          Ich vermute, dass der Lookaround kein Ende findet und bis ganz an den Anfang, bzw. bis ganz an das Ende sucht (und nicht nur bis zur nächsten Klammer)

          Was meinst du / was meint ihr?

          Danke!

          1. Tag Stefan.

            ich möchte ungefähr folgendes realisieren:
            ...(<string-a>)-(<string-b>)-([not-strings-c-to-e]<string-f>)-(<string-g>)...
            Wie/Wo soll ich hier den negative Lookaround einbauen?

            /^string1(?!(string2|string3))string4$/

            Beispiel:

            while (<DATA>)  
            {  
              # String darf weder abcd noch abxy enthalten  
              if ($_ =~ /ab(?!(cd|xy))/ ) {  
                print "matched in line $.\n";  
              }  
              else {  
                print "no match in line $.\n";  
              }  
            }  
              
            __DATA__  
            abcdef  
            wabxye  
            ab00ef
            

            Ergibt:

            no match in line 1
            no match in line 2
            matched in line 3

            Als Ansatz sollte das ausreichen, oder?

            Siechfred

            1. /^string1(?!(string2|string3))string4$/

              Beispiel:

              while (<DATA>)

              {
                # String darf weder abcd noch abxy enthalten
                if ($_ =~ /ab(?!(cd|xy))/ ) {
                  print "matched in line $.\n";
                }
                else {
                  print "no match in line $.\n";
                }
              }

              DATA
              abcdef
              wabxye
              ab00ef

              
              >   
              > Ergibt:  
              >   
              > no match in line 1  
              > no match in line 2  
              > matched in line 3  
              >   
              > Als Ansatz sollte das ausreichen, oder?  
              >   
              > Siechfred  
                
                
              So hätte ich mir das inzwischen auch vorgestellt......  
              ABER: Sobald ein OR im Lookaround enthalten ist fängt PERL das Meckern an (darf keine dynamische Länge haben).  
              Deshalb fallen die Lookarounds dann eigentlich auch schon wieder als Möglichkeit aus....  
              Irgendwie könnte ich es evtl. hinbasteln, wenn ich jeden einzelnn char negieren würde ([^t][^e][^s][^t]), das ganze wird aber auch wieder zunehmend komplizierter, da ich noch zusätzliche Zeichen habe, die ich nicht im String haben will ([^t-\s][^e-\s][^s-\s][^t-\s]) Das ganze jetzt mit 6 Stringfolgen gemacht und man kann mich in ne Anstalt einliefern. Aber sowas wie ein logisches AND gibt es wohl nicht um die Zeichenklassen zu verbinden? (([^t][^e][^s][^t])|[^t][^e][^s][^t][^2])&[^-\s]).  Achso und das ganennte Beispiel würde ja sowieso nicht funktionieren, da ich nicht einen substring suche, der einen text nicht enthält sonder sicherstellen will, dass ein text keinen substring enthält...  
                
              Hilfe! Ich dreh hier noch durch!  
                
                
                
              
              
              1. Hi,

                ABER: Sobald ein OR im Lookaround enthalten ist fängt PERL das Meckern an (darf keine dynamische Länge haben).
                Deshalb fallen die Lookarounds dann eigentlich auch schon wieder als Möglichkeit aus....

                Du kannst auch zwei (oder mehr) Lookarounds einsetzen.

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                Schreinerei Waechter
                Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              2. ABER: Sobald ein OR im Lookaround enthalten ist fängt PERL das Meckern an (darf keine dynamische Länge haben).

                Das müsstest du vielleicht doch mal näher erklären.

                Achso und das ganennte Beispiel würde ja sowieso nicht funktionieren, da ich nicht einen substring suche, der einen text nicht enthält sonder sicherstellen will, dass ein text keinen substring enthält...

                Du hast entweder mein Beispiel oder ich dein Problem nicht verstanden. Mal angenommen, du hättest folgenden festgelegten Aufbau, die Strings können dabei unterschiedliche Längen aufweisen:

                "String1-String2-String3-String4"

                String 2 darf alles außer bestimmte Wörter sein. Dann sähe ein möglicher RegExp so aus:

                /^String1-(?!(willichnicht|willichauchnicht)-).+?-String3$/

                Nochmal ein Codeschnipsel zum Veranschaulichen:

                while (<DATA>) {  
                  chomp($_);  
                  if ($_ =~ /^String1\-(?!(Foo|Blub|Laber)\-).+?\-String3\-String4$/ ) {  
                    print "$.: $_ - matched\n";  
                  }  
                  else {  
                    print "$.: $_ - not matched\n";  
                  }  
                }  
                  
                __DATA__  
                String1-Brb-String3-String5  
                String1-Laber-String3-String4  
                String1-Rhabarber-String3-String4  
                String1-Foobarz-String3-String4  
                String1-Blub-String3-String4  
                String1-Blubber-String3-String4
                

                Ergibt:

                1: String1-Brb-String3-String5 - not matched ("String5" nicht erlaubt)
                2: String1-Laber-String3-String4 - not matched ("Laber" nicht erlaubt)
                3: String1-Rhabarber-String3-String4 - matched
                4: String1-Foobarz-String3-String4 - matched ("Foo" zwar nicht erlaubt, aber "Foobarz")
                5: String1-Blub-String3-String4 - not matched ("Blub" nicht erlaubt)
                6: String1-Blubber-String3-String4 - matched ("Blub" zwar nicht erlaubt, aber "Blubber")

                Kommen wir einander näher?

                Siechfred

                1. Nochmal ein Codeschnipsel zum Veranschaulichen:

                  [code lang=perl]while (<DATA>) {
                    chomp($_);
                    if ($_ =~ /^String1-(?!(Foo|Blub|Laber)-).+?-String3-String4$/ ) {
                      print "$.: $_ - matched\n";
                    }
                    else {
                      print "$.: $_ - not matched\n";
                    }
                  }

                  Noch nicht ganz.... was bedeutet das zweite Fragezeichen (.+?)
                  Ist das Fragezeichen ein Begrenzer für das abzusuchende Feld oder wie? Ich bin grad wieder wie wild am rumprobieren, aber noch hab ich nichts funktionierendes gefunden...

                    1. was bedeutet das zweite Fragezeichen (.+?)

                      Siehe Gierige und genügsame Suchmuster.

                      Siechfred

                      Sowas geht? :eek:
                      Ähm... *räusper* *räusper*
                      Ich glaub mein Problem ist damit wohl gelöst :D
                      Hätt ich jetzt nicht gedacht, dass man im Regex zwischen gierig/nicht gierig wechseln kann.........

                      DANKE! Die Welt ist schön!

          2. ich möchte ungefähr folgendes realisieren:

            ...(<string-a>)-(<string-b>)-([not-strings-c-to-e]<string-f>)-(<string-g>)...

            Möchtest du vielleicht nicht lieber HTML::Parser o.ä. verwenden?

            Struppi.

            1. ich möchte ungefähr folgendes realisieren:

              ...(<string-a>)-(<string-b>)-([not-strings-c-to-e]<string-f>)-(<string-g>)...

              Möchtest du vielleicht nicht lieber HTML::Parser o.ä. verwenden?

              Struppi.

              Ohne genau zu Wissen, was sich dahinter verbirgt, aber es geht hier um einen Konfigurationautomaten der nicht Webbasierend ist, also glaube ich, dass HTML-Zeugs mir wenig nützt. (Falls doch bitte korrigieren ;) )

  2. Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann. Also: [^-\s$Zeichenkette]

    /(^.*$mystring.*$)*(.*)*/

    ob das in Perl so funktioniert, weiß ich nicht

    1. Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann. Also: [^-\s$Zeichenkette]

      /(^.*$mystring.*$)*(.*)*/

      ob das in Perl so funktioniert, weiß ich nicht

      Nein, da das Anchor als Zeilenanfang und nicht als Negierung interpretiert wird....

      1. Ich suche einen Weg, wie ich in einem "Regulären Ausdruck" in PERL Strings mit einer bestimmte Zeichenkette vom Suchergebnis ausschließen kann. Also: [^-\s$Zeichenkette]

        /(^.*$mystring.*$)*(.*)*/

        ob das in Perl so funktioniert, weiß ich nicht

        Nein, da das Anchor als Zeilenanfang und nicht als Negierung interpretiert wird....

        /(^.*foo.*$)*(.*)*/

        das Interessante ist die 2. Klammer

        das (^.*foo.*$) ist optional. wenn foo nicht im String drinn ist, landet alles in (.*)

        1. /(^.*foo.*$)*(.*)*/

          Besser:
          /(?:.*$string.*$)*(.*)*/