Roger: Reg Exp

Hi,

ich hab folgende Strings:

X-A    ca  1  19  101 10     1   a1f SMPL blabla  
X-A    ca  1  19  102 10     1   281 H-Test blabla

Ich möchte nun jede Zeile die nicht SMPL enthält herausfiltern.
So funktioniert es:

if ($line =~ /[\w-]+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+(\w+)/ && $line !~ /SMPL/)  
                {  
                print "$line => $1";  
                }

Meine Frage ist nun...
Warum geht es nicht so:

if ($line =~ /[\w-]+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+(\w+)\s+(?!SMPL)/ )  
                {  
                print "$line => $1";  
                }

Danke für Aufklärung.
ciao,
Roger

  1. Danke für Aufklärung.

    Die zweite Weise kann die RE matchen, wenn zwei \s oder mehr vorhanden sind vor SMPL, weil die RE matchen kann \s gefolgt von \sSMP
    Klar?

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>       ><o(((°>
       <°)))o><                      ><o(((°>o
    1. Hi,

      Danke für Aufklärung.

      Die zweite Weise kann die RE matchen, wenn zwei \s oder mehr vorhanden sind vor SMPL, weil die RE matchen kann \s gefolgt von \sSMP
      Klar?

      sorry, nein - ich blick nicht, was du meinst.
      \s+ bedeutet doch 1-n und nicht 2-n, deshalb verstehe ich es nicht.

      ciao,
      Roger

      1. Simpel
        Mein String sei "xxYYYx"
        gesucht wird das Muster /x+(?!YYY)/
        das ist erfüllt mit    "x" "xYY" "Yx"
        weil "xYY" etwas ist das nicht "YYY" ist

        mfg Beat

        --
        Woran ich arbeite:
        X-Torah
        ><o(((°>        ><o(((°>
           <°)))o><                      ><o(((°>o
  2. gudn tach!

    Warum geht es nicht so:

    if ($line =~ /[\w-]+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+(\w+)\s+(?!SMPL)/ )
    {
    print "$line => $1";
    }

    das kannst du selbst ganz einfach herausfinden:

    $_='X-A    ca  1  19  101 10     1   a1f SMPL blabla';  
    print '>'.$&.'<' if /[\w-]+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+(\w+)\s+(?!SMPL)/;"  
    # prints: >ca  1  19  101 10     1   a1f SMPL <
    

    wenn's noch nicht klar ist:

    $_='X-A    ca  1  19  101 10     1   a1f SMPL blabla';  
    print '>'.$1.'<' if /([\w-]+)\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+\s+(\w+)\s+(?!SMPL)/;"  
    # prints: >ca<
    

    je nach genauem problem koennte es dir evtl. helfen, mit "^" einen anker beim stringbeginn zu werfen, also
      /[1]+.../

    prost
    seth


    1. \w- ↩︎

    1. Hi,

      nett - wo kann ich etwas über $& nachlesen, habe auf die schnelle nichts gefunden.

      Greetz
        Erwin

      1. gudn tach!

        nett - wo kann ich etwas über $& nachlesen, habe auf die schnelle nichts gefunden.

        in der bibel: perldoc perlre (abschnitt "capture buffers")

        prost
        seth

    2. Hi,

      je nach genauem problem koennte es dir evtl. helfen, mit "^" einen anker beim stringbeginn zu werfen, also
        /[1]+.../

      Danke - der Anker hilft um mein Problem zu lösen.
      Ich hab ehrlichgesagt noch nicht ganz verstanden warum $& mit Anker anderst ist als ohne - und zwar nur wenn ich (?!SMPL) einbaue - aber vielleicht kommt ja heute Nacht und mit Hilfe der perldoc noch die Erleuchtung.

      ciao,
      Roger


      1. \w- ↩︎

      1. gudn tach!

        je nach genauem problem koennte es dir evtl. helfen, mit "^" einen anker beim stringbeginn zu werfen, also
          /[1]+.../

        Danke - der Anker hilft um mein Problem zu lösen.
        Ich hab ehrlichgesagt noch nicht ganz verstanden warum $& mit Anker anderst ist als ohne - und zwar nur wenn ich (?!SMPL) einbaue

        $& ist bloss eine variable wie $1, $2, usw. siehe perldoc perlre. in $& steht der gesamte gematchte string. (soweit hast du's vermutlich bereits verstanden, ich sag's bloss sicherheitshalber.)

        was der anker nun aendert, steht im perl-manual ganz gut beschrieben:
        einfach in http://perldoc.perl.org/perlretut.html nach "anchor" suchen.

        /foo(?!SMPL)/ sagt also nur: matche das erstbeste "foo", das dir ueber den weg laeuft und dem nicht der string "SMPL" folgt.

        /foo(?!SMPL)/ wuerde also das zweite "foo" im string "barfooSMPLfoo" matchen.

        prost
        seth


        1. \w- ↩︎