Schrift
[thread]9232[/thread]

Merkwürdiges RegEx Problem: nur für echte RegEx Experten :-(



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
no1gizmo
 2007-07-26 20:16
#78934 #78934
User since
2007-02-20
21 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

nun brauche ich selber Hilfe mit RegEx. Normalerweise kann ich da auch anderen Helfen (hier aber bisher noch nicht), aber vielleicht brauche ich auch nur eine Brille?

Es geht um folgenden regulären Ausdruck:

Code: (dl )
$zeile =~ (^\d*?:\d*?):\d*?-(\d*?-\d*?-\d*?)-(\D*):[0-9]*\+([\.\w-_@,]*)[\+,]\d\+([\/\w\s-\.\+]*\.tif)\+.*$/;


Wenn dieser auf diese Textzeile ausgeführt wird:
Code: (dl )
07:40:14-25-01-2007-Fax an:750895+Fax_AK-Reha@na.lsv.local+3+/var/spool/capifax/recvq/cfn0112107-05141723179.tif+/var/spool/capifax/recvq/cfn0112107-05141723179.tif.pdf+05141723179+0+0x3490


Hat man die folgende richtige Ausgabe:
Code: (dl )
1
2
3
4
5
6
Ausgaben:
$1 -> 07:40
$2 -> 25-01-2007
$3 -> Fax an
$4 -> Fax_AK-Reha@na.lsv.local
$5 -> /var/spool/capifax/recvq/cfn0112107-05141723179.tif


Auf die folgende Textzeile angewendet, ist die Ausgabe fehlerhaft (leer):
Code: (dl )
07:50:09-25-01-2007-Fax an:750030+FAX_KMB-GemB@na.lsv.local,ren.westphal@na.lsv.local,+1+/var/spool/capifax/recvq/cfn0112108-+49 5175 31278.tif+/var/spool/capifax/recvq/cfn0112109-+49 5175 31278.tif.pdf++49 5175 31278+0+0x3490


Code: (dl )
1
2
3
4
5
6
Ausgaben:
$1 ->
$2 ->
$3 ->
$4 ->
$5 -> /var/spool/capifax/recvq/cfn0112108-+49 5175 31278.tif



Bevor der reguläre Ausdruck...
Code: (dl )
$zeile =~ (^\d*?:\d*?):\d*?-(\d*?-\d*?-\d*?)-(\D*):[0-9]*\+([\.\w-_@,]*)[\+,]\d\+([\/\w\s-\.\+]*\.tif)\+.*$/;


auf die Zeile angewendet wird, wird die Zeile ($zeile) dabei als Erstes von Zeilenumbrüchen befreit:
Code: (dl )
$zeile =~ s/\015\012\|\015|\012//sg;    // Lehrzeichen und Backspace entfernen


So, wo liegt denn da der Fehler? Wäre für Hilfe echt dankbar, ich blick da nicht mehr durch..
Ich wäre super dankbar, wenn mir jemand zu diesem sehr speziellen Thema eine Antwort geben könnte!

Eine kurze Referenz zu regulären Ausdrücken in Perl gibt es hier:
http://de.selfhtml.org/perl/sprache/regexpr.htm
Linuxer
 2007-07-26 22:57
#78935 #78935
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Hi,

vielleicht überseh ich was, aber mein test läuft sauber:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
use strict;
# http://board.perl-community.de/cgi-bin/ikonboard/ikonboard.cgi?act=ST;f=6;t=4484

my $regex = qr/(^\d*?:\d*?):\d*?-(\d*?-\d*?-\d*?)-(\D*):[0-9]*\+([\.\w-_@,]*)[\+,]\d\+([\/\w\s-\.\+]*\.tif)\+.*$/;

while ( <DATA> ) {

$_ =~ s/\015\012\|\015|\012//sg;

if ( $_ =~ m/$regex/ ) {
print "1: $1\n2: $2\n3: $3\n4: $4\n5: $5\n";
}
}

__END__
07:40:14-25-01-2007-Fax an:750895+Fax_AK-Reha@na.lsv.local+3+/var/spool/capifax/recvq/cfn0112107-05141723179.tif+/var/spool/capifax/recvq/cfn0112107-05141723179.tif.pdf+05141723179+0+0x3490
07:50:09-25-01-2007-Fax an:750030+FAX_KMB-GemB@na.lsv.local,ren.westphal@na.lsv.local,+1+/var/spool/capifax/recvq/cfn0112108-+49 5175 31278.tif+/var/spool/capifax/recvq/cfn0112109-+49 5175 31278.tif.pdf++49 5175 31278+0+0x3490


Ansonsten helfen testausgaben (z.B. von $zeile) schon mal weiter ...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
no1gizmo
 2007-07-27 11:39
#78936 #78936
User since
2007-02-20
21 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke für deine Antwort und Hilfe. Wenn es bei dir klappt, hilft es mir schon weiter.

durch die Zeile $_ =~ m/$regex/ bin ich auf den Fehler gestoßen, der mich allerdings verwirrt:

nested quantifiers before HERE mark in regex m/............/capifax/recvq/cfn0112105.tif.pdf++ << HERE 0+0x3490/ at /home/u03......

Was bedeutet das? Nun weiß ich aber, es liegt an den doppelten Plus, also "++" !

Enthält eine Zeile ein doppeltes Plus, dann funktioniert sie nicht! Alle anderen Zeilen funktionieren!\n\n

<!--EDIT|no1gizmo|1185522061-->
nepos
 2007-07-27 12:31
#78937 #78937
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das Problem ist, dass in einer RegEx bestimmte Zeichen eine besondere Bedeutung haben. Lies dir mal perlre durch, da wird \Q und \E erklärt, mit dessen Hilfe man diese Sonderbehandlung einschränken kann.
jubei
 2007-07-27 12:33
#78938 #78938
User since
2007-07-19
22 Artikel
BenutzerIn
[default_avatar]
der fehlermeldung nach zu urteilen (nested quantifiers) hast du die plus zeichen nicht escaped (\+)...
no1gizmo
 2007-07-27 13:33
#78939 #78939
User since
2007-02-20
21 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das verstehe ich nciht, denn klar hat das + bei Regex eine bestimte Bedeutung, aber doch nur im reguilären Ausdruck selbst, nicht wenn es im String vorkommt, der durchsucht werden soll.

Danke für den Link, da steht drin:

\E end case modification (think vi)
\Q quote (disable) pattern metacharacters till \E

aha, gut, aber trotzdem verstehe ich das nicht, wie das sein kann.

Ich hab`s nun auch so versucht:

my $regex = qr/(^\d*?:\d*?):\d*?-(\d*?-\d*?-\d*?)-(\D*):[0-9]*\+([\.\w-_@,]*)[\+,]\d\+([\/\w\s-\.\+]*\.tif)\++.*$/;

also ich weiße darauf hin, dass nach einem + noch ein oder mehrere + auftauchen können. Aber auch dann meldet er "nested quantifieres...."
nepos
 2007-07-27 14:59
#78940 #78940
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, dann scheint in deinem Code irgendwie der zu durchsuchende Teil in die Regex reinzukommen. Anders kann ich mir die Meldung grade nicht erklären.
jubei
 2007-07-27 15:56
#78941 #78941
User since
2007-07-19
22 Artikel
BenutzerIn
[default_avatar]
mal abgesehen von der fehlermeldung ist mir grad nicht ganz klar warum du die zwei plus zeichen ueberhaupt explizit matchen willst. die kommen doch wie ich das sehe nur hiner dem pdf dateinamen vor, der dich (zumindest wenn man sich das erste beispiel anguckt) ja gar nicht interessiert.

hier mal n bisschen code der einfach den teil hinter dem tif dateinamen ausser acht laesst:

my $pat = qr/^
(\d+:\d+):\d+-
(\d+-\d+-\d+)-
([^:]+):\d+\+
([-\.\w\@,]+)\+\d\+
([-+\.\w\s\/]+?\.tif)
/x;


ausgabe:

$1 -> 07:40
$2 -> 25-01-2007
$3 -> Fax an
$4 -> Fax_AK-Reha@na.lsv.local
$5 -> /var/spool/capifax/recvq/cfn0112107-05141723179.tif
--
$1 -> 07:50
$2 -> 25-01-2007
$3 -> Fax an
$4 -> FAX_KMB-GemB@na.lsv.local,ren.westphal@na.lsv.local,
$5 -> /var/spool/capifax/recvq/cfn0112108-+49 5175 31278.tif
jubei
 2007-07-27 16:01
#78942 #78942
User since
2007-07-19
22 Artikel
BenutzerIn
[default_avatar]
...und was mir bei deinen charakter klassen aufgefallen ist, dass du eigentlich die Minuszeichen entweder an den anfang stellen oder escapen musst, sonst wird das als intervall interpretiert, zb [0-9]. bei mir zumindest gibst, wenn ich solche charakter klassen wie bei dir benutzte fehlermeldungen ("false range")...
no1gizmo
 2007-07-27 17:15
#78943 #78943
User since
2007-02-20
21 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=jubei,27.07.2007, 13:56]hier mal n bisschen code der einfach den teil hinter dem tif dateinamen ausser acht laesst:

my $pat = qr/^
(\d+:\d+):\d+-
(\d+-\d+-\d+)-
([^:]+):\d+\+
([-\.\w\@,]+)\+\d\+
([-+\.\w\s\/]+?\.tif)
/x;
[/quote]
Danke für die mühe, aber auch deine Lösung funktioniert bei mir nicht :<

also

Code: (dl )
$z =~ qr/^(\d+:\d+):\d+-(\d+-\d+-\d+)-(\[^:]+):\d+\+([-\.\w_\@,]+)\+\d\+([-\+\.\w\s\/]+?\.tif)/x; 


bringt

Code: (dl )
Nested quantifiers before HERE mark in regex /m05:13:00-25-01-2007-Fax an:75932.../capifax/recvq/cfn23123.tif.pdf++ << HERE 0+0x3490/ at /home/u03....verzeichnis halt


Hm, ich bin zu doof für irgendwas, ich wüsste aber wenigstens gerne für was..
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2007-07-26 20:16.