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)