Problem mit Regulären Ausdrücken

Problem mit Regulären Ausdrücken

am 29.07.2006 02:47:55 von Steve-Kai Vyska

Hallo Leute,

Ich lasse in einer foreach Schleife in 2 Strings nach einer Zeichenfolge
suchen. Soweit klappt das auch, es seidenn, das in der ersten nichts
gefunden wird, weil dann plötzlich der MAtch von der zweiten angezeigt
wird:

foreach (@$zeiger) {

@test = split(/\t/,$_);
$test[0] =~ m/(.*)\[+\s?(\d+\/\d+)\s?\]+(.?)/;

print "$2\n";

test[1]=~ m/(\d+)\s+(...)\s+(\d\d\d\d)\s+(\d\d:\d\d:\d\d)(.*)/;
print "$2\n";
}

Existiert in der $test[0] Abfrage $2 ist alles in Ordnung, nur wenn das
nicht existiert, dann wird aus der vorhergehenden SChleift $2 aus der
test[1] abfrage genommen. Leider läst sich auch mit der Abfrage ob $2
überhaupt existiert nichts anfangen, da es ja existiert, dummerweise aber
mit dem Inhalt des vorhergehenden aufrufs.

Hat jemand eine Idee, wie man das umgehen könnte?

Danke schon mal für alle Ideen

Steve

Re: Problem mit Regulären Ausdrücken

am 29.07.2006 11:05:49 von Christian Garbs

Mahlzeit!

Steve-Kai Vyska wrote:

> Ich lasse in einer foreach Schleife in 2 Strings nach einer
> Zeichenfolge suchen. Soweit klappt das auch, es seidenn, das in der
> ersten nichts gefunden wird, weil dann plötzlich der MAtch von der
> zweiten angezeigt wird:

Suchst Du sowas?

foreach (@$zeiger) {

@test = split(/\t/,$_);
if ( $test[0] =~ m/(.*)\[+\s?(\d+\/\d+)\s?\]+(.?)/ ) {
print "$2\n";

if ( test[1]=~ m/(\d+)\s+(...)\s+(\d\d\d\d)\s+(\d\d:\d\d:\d\d)(.*)/ ) {
print "$2\n";
}
}
}

Gruß,
Christian
--
sub _{print"\n"}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
..'E002020001C2222221400005CA2A2A27C02001C2222221C20003E0402 02201F2422221C00'
..'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..); ;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:',y;:;\t;;print;_;_

Re: Problem mit Regulären Ausdrücken

am 29.07.2006 11:15:51 von Steve-Kai Vyska

Hallo Christian,

nein leider nicht, die Abfragen müssen unabhängig voneinander laufen, das
ist ja das Problem. Zwischen beiden steht bei mir noch weiterer Code, der
jenachdem ob was rauskommt oder nicht was machen soll, und genau da liegt
ja mein Problem, weil ja wenn bei dem ersten nichts rauskommt, das von der
letzten Runde genommen wird und damit doch wieder was rauskommt :-(

Steve

> Mahlzeit!
>
> Steve-Kai Vyska wrote:
>
>> Ich lasse in einer foreach Schleife in 2 Strings nach einer
>> Zeichenfolge suchen. Soweit klappt das auch, es seidenn, das in der
>> ersten nichts gefunden wird, weil dann plötzlich der MAtch von der
>> zweiten angezeigt wird:
>
> Suchst Du sowas?
>
> foreach (@$zeiger) {
>
> @test = split(/\t/,$_);
> if ( $test[0] =~ m/(.*)\[+\s?(\d+\/\d+)\s?\]+(.?)/ ) {
> print "$2\n";
>
> if ( test[1]=~ m/(\d+)\s+(...)\s+(\d\d\d\d)\s+(\d\d:\d\d:\d\d)(.*)/ ) {
> print "$2\n";
> }
> }
> }
>
> Gruß,
> Christian

Re: Problem mit Regulären Ausdrücken

am 29.07.2006 13:50:23 von Joergen Lang

- Zweimal $2 in einem Block ist einfach keine gute Idee, es sei denn Du
magst Lotto.

- Bitte lesen:
- perldoc perlrequick
- perldoc perlre
- perldoc perlretut

- Der Wert von $1, $2, etc. wird _nicht_ zurückgesetzt. Gab es für
$test[0] keinen Treffer, für $test[1] im Durchlauf davor schon, wird
der _aktuelle_ Inhalt von $2 ausgegeben. Lösung:
Ausgabe von $2 davon abhängig machen, ob ein Treffer erzielt wurde:

if ( $test[0] =~ m/(.)(.)/ ) { print "$2\n" };

- In der Dokumentation ist auch beschrieben, wie Du runde Klammern zum
reinen Gruppieren verwenden kannst, wie Du \d\d\d\d lesbarer schreiben
kannst, und vieles mehr.

hth,

Joergen

Steve-Kai Vyska schrieb:
> Hallo Leute,
>
> Ich lasse in einer foreach Schleife in 2 Strings nach einer Zeichenfolge
> suchen. Soweit klappt das auch, es seidenn, das in der ersten nichts
> gefunden wird, weil dann plötzlich der MAtch von der zweiten angezeigt
> wird:
>
> foreach (@$zeiger) {
>
> @test = split(/\t/,$_);
> $test[0] =~ m/(.*)\[+\s?(\d+\/\d+)\s?\]+(.?)/;
>
> print "$2\n";
>
> test[1]=~ m/(\d+)\s+(...)\s+(\d\d\d\d)\s+(\d\d:\d\d:\d\d)(.*)/;
> print "$2\n";
> }
>
> Existiert in der $test[0] Abfrage $2 ist alles in Ordnung, nur wenn das
> nicht existiert, dann wird aus der vorhergehenden SChleift $2 aus der
> test[1] abfrage genommen. Leider läst sich auch mit der Abfrage ob $2
> überhaupt existiert nichts anfangen, da es ja existiert, dummerweise aber
> mit dem Inhalt des vorhergehenden aufrufs.
>
> Hat jemand eine Idee, wie man das umgehen könnte?
>
> Danke schon mal für alle Ideen
>
> Steve

Re: Problem mit Regulären Ausdrücken

am 29.07.2006 14:59:51 von Steve-Kai Vyska

Joergen Lang wrote:

> - Zweimal $2 in einem Block ist einfach keine gute Idee, es sei denn Du
> magst Lotto.
>
> - Bitte lesen:
> - perldoc perlrequick
> - perldoc perlre
> - perldoc perlretut
>
> - Der Wert von $1, $2, etc. wird _nicht_ zurückgesetzt. Gab es für
> $test[0] keinen Treffer, für $test[1] im Durchlauf davor schon, wird
> der _aktuelle_ Inhalt von $2 ausgegeben. Lösung:
> Ausgabe von $2 davon abhängig machen, ob ein Treffer erzielt wurde:
>

Genau das ist ja das Problem. Das müssen 2 unabhängig voneinder laufende
Abfragen sein. Die eine hat nichts mit der Anderen zu tun, sprich die erste
ist nicht von der zweiten abhängig und umgekehrt.
Ich benötige beide.

> - In der Dokumentation ist auch beschrieben, wie Du runde Klammern zum
> reinen Gruppieren verwenden kannst, wie Du \d\d\d\d lesbarer schreiben
> kannst, und vieles mehr.

Das ist auch momentan nur zu Testzwecken, bis ich raus habe, wie ich das
trennen kann, ohne das er mir das gleiche Ergebnis liefert :-(

Steve

Re: Problem mit Regulären Ausdrücken

am 29.07.2006 15:15:40 von Guido Ostkamp

Steve-Kai Vyska wrote:
> Hat jemand eine Idee, wie man das umgehen könnte?

Teste einfach jeweils durch ein 'if', ob der Match erfüllt ist und gib
$2 nur in diesem Fall aus.

Eine Antwort war ja schon durchaus richtig im Ansatz, hat nur die zwei
'if's versehentlich geschachtelt. Du setzt sie stattdessen einfach
nacheinander ein.

Gruß,

Guido

Re: Problem mit Regulären Ausdrücken

am 29.07.2006 16:25:20 von Joergen Lang

Steve-Kai Vyska schrieb:
> Joergen Lang wrote:

>> - Der Wert von $1, $2, etc. wird _nicht_ zurückgesetzt. Gab es für
>> $test[0] keinen Treffer, für $test[1] im Durchlauf davor schon, wird
>> der _aktuelle_ Inhalt von $2 ausgegeben. Lösung:
>> Ausgabe von $2 davon abhängig machen, ob ein Treffer erzielt wurde:
>>
>
> Genau das ist ja das Problem. Das müssen 2 unabhängig voneinder laufende
> Abfragen sein. Die eine hat nichts mit der Anderen zu tun, sprich die erste
> ist nicht von der zweiten abhängig und umgekehrt.
> Ich benötige beide.

Du willst nicht die Abfragen, sondern die _Ausgaben_ abhängig davon
machen, ob ein Treffer erzielt wurde. Wenn in der ersten Abfrage,
sprich: im ersten Mustervergleich, nichts gefunden wurde, gibt es
schliesslich sowieso nichts auszugeben. Dto. im zweiten Fall.

Wie gesagt: bitte in der Dokumentation nachlesen. Da ist eigentlich
alles erklärt. Falls es Fragen bei der Übersetzung gibt, helfe ich gerne.

J.

Re: Problem mit Regulären Ausdrücken

am 30.07.2006 01:11:43 von Steve-Kai Vyska

Hi,


> Du willst nicht die Abfragen, sondern die _Ausgaben_ abhängig davon
> machen, ob ein Treffer erzielt wurde. Wenn in der ersten Abfrage,
> sprich: im ersten Mustervergleich, nichts gefunden wurde, gibt es
> schliesslich sowieso nichts auszugeben. Dto. im zweiten Fall.

Die Print anweisung habe ich momentan nur zum test drin!

test[0] und test[1] sind zwei ausgaben von einem Anderen Programm. Beide
sollen seperat getestet werden, und wenn was gefunden wurde soll danach das
Ergebnis weiter gespeichert werden Das ist ja das was ich versuche zu sagen
die haben nichts miteinander zu tun!!!!

Steve

Re: Problem mit Regulären Ausdrücken

am 30.07.2006 01:14:29 von Steve-Kai Vyska

Hallo

> Teste einfach jeweils durch ein 'if', ob der Match erfüllt ist und gib
> $2 nur in diesem Fall aus.
>
> Eine Antwort war ja schon durchaus richtig im Ansatz, hat nur die zwei
> 'if's versehentlich geschachtelt. Du setzt sie stattdessen einfach
> nacheinander ein.

Achso,

aber das löst doch das Problem nicht! Erster Durchlauf. Es wird was
gefunden, beides mal wird was ausgegeben (wie in der anderen NAchricht
geschrieben ist die Ausgabe hier nur zum test). Nechster Durchlauf der
Schleife, kommt bei dem ersten nichts raus, da aber die Ausgabe ja laut
Docu weiter gegeben wird, existiert $2, da es den Inhalt des letzten
Schleifendurchlaufs beeinhaltet. Somit ist die If-Abfrage erfüllt und ich
erhalte eine falsche Ausgabe!

Steve

Re: Problem mit Regulären Ausdrücken

am 30.07.2006 09:33:52 von Steve-Kai Vyska

Hi,

löst es doch, jetzt habe ich verstanden was du meinst :-) Hat ein wenig
gedauert *g*

Danke für den Tip

Steve

Re: Problem mit Regulären Ausdrücken

am 01.08.2006 03:08:21 von Alexander Koeppe

Steve-Kai Vyska schrieb:
> Hi,
>
> löst es doch, jetzt habe ich verstanden was du meinst :-) Hat ein wenig
> gedauert *g*
>
> Danke für den Tip
>
> Steve
>

Es gibt noch eine Möglichkeit aus einem regulären Ausdruck zu capturen
ohne die globalen Variablen $1,$2,... zu verwenden:

if (my ($ergebnis) = ($string) =~ /muster1/) {
print $ergebnis;
}
if (my ($ergebnis) = ($string) =~ /muster2/) {
print $ergebnis;
}

Gruß Alex