Reguläre Ausdrücke - bestimmte Worte dürfen nicht vorkommen
Reguläre Ausdrücke - bestimmte Worte dürfen nicht vorkommen
am 05.04.2006 17:41:53 von fh
Hallo zusammen,
folgendes Problem habe ich mit regulären Ausdrücken:
Ein Skalar $Value hat je nach Datei, welche automatisch eingelesen
wird, verschiedene Inhalte.
Der Inhalt soll per regex geprüft werden und nur wahr sein, wenn
"global parameter" nicht(!!!) enthalten ist!
Beispiel: (eins von beiden wird zum Test auskommentiert)
$Value =3D 'State Change: OK ALARM global parameter xy'; #regex soll
falsch liefern
$Value =3D 'State Change: OK ALARM Worst instance blabla'; #regex soll
wahr liefern
my $Regex =3D '(global parameter)';
if ($Value =3D~ m/$Regex/) {
printf ("wahr\n");
}
In meinem Beispiel hier würde es jetzt genau anders herum sein - es
ist wahr wenn "global parameter" gefunden wird.
Wie kann ich dies aber vom Ergebnis her umdrehen, und zwar nur über
den regulären Ausdruck, so daß ich die Abfrage nicht ändern muss?
Vielen Dank
Gruß Frank
Re: Reguläre Ausdrücke - bestimmte Worte dürfen nicht vorkommen
am 05.04.2006 18:02:18 von Frank Seitz
FH wrote:
> Wie kann ich dies aber vom Ergebnis her umdrehen, und zwar nur über
> den regulären Ausdruck, so daß ich die Abfrage nicht ändern muss?
Gute Frage. Im Perl Cookbook findet sich folgender Vorschlag:
/^(?:(?!$Regex).)*$/s
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Reguläre Ausdrücke- bestimmte Wortedürfennicht vorkommen
am 05.04.2006 21:05:17 von David Haller
FH wrote:
> my $Regex = '(global parameter)';
>
> if ($Value =~ m/$Regex/) {
> printf ("wahr\n");
> }
>
> In meinem Beispiel hier w?rde es jetzt genau anders herum sein - es
> ist wahr wenn "global parameter" gefunden wird.
$Value !~ m/$Regex/
==== perldoc perlop ====
Binary "!~" is just like "=~" except the return value is
negated in the logical sense.
====
-dnh
--
>>> Der viel versprechenste Trend derzeit geht Richtung Spiegelreflex.
> Ist das das zwanghafte Korrigieren von SpOn-Artikeln?
Das ist hier der meistverbreitetste Spiegel-Reflex. -- in desd
Re: Reguläre Ausdrücke - bestimmte Worte dürfen nicht vorkommen
am 06.04.2006 00:05:29 von Oliver Block
Hi,
cat logfile | grep -v 'global parameter'
sollte tun, was Du wünscht. Und das völlig ohne perl :)
Aber Du willst es ja nicht anders.
> $Value = 'State Change: OK ALARM global parameter xy'; #regex soll
> falsch liefern
> $Value = 'State Change: OK ALARM Worst instance blabla'; #regex soll
> wahr liefern
>
> my $Regex = '(global parameter)';
>
> if ($Value =~ m/$Regex/) {
> printf ("wahr\n");
> }
>
> In meinem Beispiel hier würde es jetzt genau anders herum sein - es
> ist wahr wenn "global parameter" gefunden wird.
> Wie kann ich dies aber vom Ergebnis her umdrehen,
if ($Value !~ m/global parameter/)
print "Es lebe die Logik!";
unless ($Value =~ m/global parameter/)
print "schon wieder überlistet!";
> und zwar nur über
> den regulären Ausdruck, so daß ich die Abfrage nicht ändern muss?
*schluck*
Ich steige hier aus.:)
BTW: Tippe in Deiner Shell
perldoc perlre
insb. unter der Überschrift 'Extended Patterns' wird erklärt, was Frank
geantwortet hat.
Gruss,
Oliver
Re: Reguläre Ausdrücke - bestimmte Worte dürfen nicht vorkommen
am 06.04.2006 10:32:47 von fh
Frank Seitz schrieb:
> Gute Frage. Im Perl Cookbook findet sich folgender Vorschlag:
>
> /^(?:(?!$Regex).)*$/s
Hallo Frank,
vielen Dank, habe mir mal den Ausdruck vorgenommen und ein bisschen
damit experimentiert.
Folgendes kam dabei heraus:
$Value =3D 'State Change: OK ALARM global parameter blabla';
$Value =3D 'State Change: OK ALARM Worst instance';
my $Regex =3D '^(?!.*?(global parameter))';
if ($Value=3D~ m/$Regex/) {
printf ("Audruck ist wahr\n");
}
Das war vielleicht eine Probiererei bis das Ganze in einer Variablen
verstaut werden konnte :-)
Aber das beste ist, daß es funktioniert. Warum ich das Ganze
vielleicht auch "umständlich" in Perl schreibe liegt daran, daß Value
die unterschiedlichsten Zeichenketten enthalten kann und in $Regex
über ein Array die unterschiedlichsten Regexen stehen können und
damit alles weiter sauber funktioniert kann ich natürlich die
IF-Abfrage nicht ändern sonst muss ich ja wieder die anderen Regexen
anpassen...
Was ich noch sagen wollte: ES GEHT :-)
Vielen Dank
Frank
Re: Reguläre Ausdrücke - bestimmte Worte dürfen nicht vorkommen
am 06.04.2006 12:58:05 von Ingo Menger
FH schrieb:
> Warum ich das Ganze
> vielleicht auch "umständlich" in Perl schreibe liegt daran, daß Value
> die unterschiedlichsten Zeichenketten enthalten kann und in $Regex
> über ein Array die unterschiedlichsten Regexen stehen können und
> damit alles weiter sauber funktioniert kann ich natürlich die
> IF-Abfrage nicht ändern sonst muss ich ja wieder die anderen Regexen
> anpassen...
Versteh ich nicht.
my $regex =3D join("|", @regexesthatmustnotappear);
if ($Value =3D~ m/$regex/) {
print "\$Value enthält mindestens eine der gesuchten
Zeichenketten.";
}
else {
print "\$Value enthält keine der gesuchten Zeichenketten.";
}
Das ist, glaube ich, das de Morgan'sches Gesetz: nicht a und nicht b
und nicht c =3D nicht (a oder b oder c)