Schrift
[thread]9120[/thread]

Reguläre Ausdrücke mit Sonderzeichen?



<< >> 6 Einträge, 1 Seite
Gast Gast
 2007-06-25 16:25
#77812 #77812
Hallo zusammen,
ich sitze hier an meinem code und komme nicht weiter:
Ich habe eine Datei mit mehreren Zeilen ,die ungefähr so aussehen:
name:x:1234:nochwas:etc:pp
name1:x:4567:nochmehr:bla:ps
...
Ich will jetzt beim Auslesen der Datei nur die Namen (also bis zum 1. ":") auch wieder ausgeben.

Ich bin nicht sehr gut in Perl und habe ein wenig im Internet recherchiert und habe dann
Code: (dl )
print $ausgabe = \^*:\; 
(auch schon mit + statt * getestet)
ausprobiert. Denn ^ steht ja für den Anfang einer Zeile soweit ich weiss, und so wollte ich vom Anfang einer Zeile bis zum 1. ":" suchen.
Doch die Fehlermeldung lautet :
^* matches null string many times in regex; marked by <-- HERE in m/^+ <-- HERE :/ at pass.pl line 19.

Wie löst man das geschickter oder wo ist mein Fehler?
Danke und Gruß Stefan
renee
 2007-06-25 16:31
#77813 #77813
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
mit split:
Code (perl): (dl )
1
2
3
my $string = 'name1:x:4567:nochmehr:bla:ps';
my ($name) = split /:/,$string,2;
print $name;


mit RegEx:
Code (perl): (dl )
1
2
3
my $string = 'name1:x:4567:nochmehr:bla:ps';
my ($name) = $string =~ /^([^:]+)/;
print $name;


oder
Code (perl): (dl )
1
2
3
my $string = 'name1:x:4567:nochmehr:bla:ps';
my ($name) = $string =~ /^(.*?):/;
print $name;


Der erste Reguläre Ausdruck speichert die Zeichen ab Zeilenanfang so lange es *kein* : ist.

Beim zweiten RegEx ist das ? wichtig, sonst wird alles bis zum *letzten* : gespeichert.

Ich würde die split-Variante bevorzugen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Pandurx
 2007-06-25 17:47
#77814 #77814
User since
2007-06-25
6 Artikel
BenutzerIn
[default_avatar]
Danke für deine schnelle Antwort, ich hoffe du kannst mir nochmal weiterhelfen:
Code: (dl )
1
2
3
4
5
6
7
my @inhalt = open (Datei, "<", $pfad );

foreach $zeile (<Datei>)
{

my $name = $zeile =~ /^([^:]+)/;
print $name;

ich habe versucht den inhalt der datei in ein array zu packen... vielleicht liegt da der denkfehler, denn die ausgabe dieses chaotischen codes ergibt :
Quote
Geben sie bitte den Ort derDatei an:
C:\xxx.txt (meine Eingabe)
111111111

(es sind 9 zeilen in der datei)\n\n

<!--EDIT|Pandurx|1182779824-->
sid burn
 2007-06-25 18:16
#77815 #77815
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=Pandurx,25.June.2007, 15:47]my $name = $zeile =~ /^([^:]+)/;[/quote]
Die Zeile muss so aussehen:
Code: (dl )
my ($name) = $zeile =~ /^([^:]+)/;


Um $name musst du noch Klammern hinzufügen um so einen Listenkontext zu erzwingen, wenn du ihn weg lässt erkennt Perl einen Skalaren Kontext und gibt dir zurück ob die Regex gematcht hat oder nicht. Im Listenkontext gibt es dir die Matches selber zurück.

Ansonsten würde ich aber auch lieber zu split raten. Leichter zu verstehen, schneller.

Code: (dl )
my ($name) = split /:/, $zeile
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2007-06-25 18:16
#77816 #77816
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst - wie ich es gemacht habe - das $name in Klammern setzten, da der Reguläre Ausdruck die Treffer als Liste zurückliefert.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Pandurx
 2007-06-27 11:16
#77817 #77817
User since
2007-06-25
6 Artikel
BenutzerIn
[default_avatar]
ah ok ,vielen dank leute
<< >> 6 Einträge, 1 Seite



View all threads created 2007-06-25 16:25.