Regular Expression - harte Nuss ;-) ?

Hallo an all die Profis,

manchmal fühlt man sich irgendwie so klein und doof:wink: Ich hab es auch nach längerem „Experimentieren“ nicht hingebracht folgendes (eigentlich relativ triviales Problem) mittels Regular expressens zu lösen.

Ein Pfad

/ebene1/ebene2/ebene3/

soll in die jeweils letzte Ebene (hier ebene3) und in den gesamten restlichen Pfad davor (hier /ebene1/ebene2 ) mittels eines regular Expression und Groups zerlegt werden.

(D.h. gesucht ist jeweils eine Zeichenkette „vaterpfad“ und „leztespfadelement“ was zusammen wiederum den gesamten pfad ergibt (Pfad-Ebenen-Trennzeichen ist hier der Slash="/")

Habs nicht gschafft (und war echt frustriert). Anzumerken ist noch, dass der allerletzte „slash“= / (hier bei ebene3/ ) jeweils optional ist, d.h. entweder vorhanden sein kann oder nicht.

(im falle dass der Pfad nur aus einer Ebene besteht (hier /ebene1/) sollte das letzte element /ebene1/ enthalten und der Pfad davor „null“, da es ja sozusagen keinen pfad davor gibt.

bin für konkrete Lösunen unheitmlich dankbar.
Julian

Hallo Julian,

Hallo an all die Profis,

Profi? naja, aber es hat gelangt :*)

manchmal fühlt man sich irgendwie so klein und doof:wink: Ich hab
es auch nach längerem „Experimentieren“ nicht hingebracht
folgendes (eigentlich relativ triviales Problem) mittels
Regular expressens
zu lösen.

hmhmhm musses denn wirklich hundertprozentig in einer einzigen Regex laufen?!
„ganz schbontahn“ würd ich eher so schreiben:

my $ohne= "/und/hier/ist/der/pfad";
my $mit= "/und/hier/ist/der/pfad/";
my @in = ($ohne, $mit);

foreach (@in)
{
my $vorne=$\_;
my $hinten=$\_;
while ($hinten =~ m|\/(.+)\/?|){$hinten = $1;}
$vorne =~ s/$hinten//;
print STDOUT "\n --\> \n";
}

geht aber auch so (zugegebenermassen hübscher, hat mich aber mehr Zeit gekostet - alles gewohnheitssache :wink: )

foreach (@in)
{
 **m|(.+\/)(.+)|;**
print STDOUT "\n --\> \n";
}

Weil „perl will try to match as much of the string as possible, while still allowing the regexp to succeed.“
http://www.perldoc.com/perl5.8.4/pod/perlretut.html#…

Ist es das, was du gesucht hast? :smile:

grüße,
evanovka

Hi,

hmhmhm musses denn wirklich hundertprozentig in einer einzigen
Regex laufen?!

es wäre mit einer einzigen kein Problem, aber warum muss es unbedingt mit einer RegExp laufen? Viel zu teuer, da reichen simple String-Funktionen mehr als aus.

perldoc -f rindex

Cheatah

Hi,

was hältst du von

($pfad,$rest) = ($item =~ /^(.*)(/[^/]+/{0,1})$/);

Das setzt allerdings voraus, dass am Ende nicht 2 aufeinanderfolgende Slashes sind.