Reg Exp
Roger
- perl
0 Beat0 seth_not@home
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
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
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
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
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
\w- ↩︎
Hi,
nett - wo kann ich etwas über $&
nachlesen, habe auf die schnelle nichts gefunden.
Greetz
Erwin
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
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
\w- ↩︎
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
\w- ↩︎