Regex um Datei in Pfad, Basisnamen und Endung zu zerlegen

Regex um Datei in Pfad, Basisnamen und Endung zu zerlegen

am 06.09.2005 21:07:41 von Torsten Mohr

Hallo,

ich suche einen Regex (oder andere Möglichkeit), mit dem ich
einen String (einen Dateinamen) in Pfad, Basisnamen und Endung
zerlegen kann, etwa folgendermassen:

/some/path/file.ext => "/some/path" "file" "ext"
name.ex.ext => "." "name.ex" "ext"
file/path/name => "file/path" "name" ""

Bisher mache ich das mit rindex und ein paar if()s.

Gibt es da eine einfachere Möglichkeit?


Grüße,
Torsten.

Re: Regex um Datei in Pfad, Basisnamen und Endung zu zerlegen

am 06.09.2005 21:44:32 von Frank Seitz

Torsten Mohr wrote:

> ich suche einen Regex (oder andere Möglichkeit), mit dem ich
> einen String (einen Dateinamen) in Pfad, Basisnamen und Endung
> zerlegen kann, etwa folgendermassen:
>
> /some/path/file.ext => "/some/path" "file" "ext"
> name.ex.ext => "." "name.ex" "ext"
> file/path/name => "file/path" "name" ""
>
> Bisher mache ich das mit rindex und ein paar if()s.
>
> Gibt es da eine einfachere Möglichkeit?

Ja, wie Du schon richtig vermutest, mit einem Regex.
Der hat in Perl die schöne Eigenschaft, dass darin eingebettet
Klammerausdrücke (genauer: die Werte, die sie matchen) in
einem Arraykontext zurückgeliefert werden:

($dir, $base, $ext) = $path =~ /(EXPR1)(EXPR2)(EXPR3)/;

EXPR1, ..., EXPR3 zu finden, überlasse ich Dir als
Übungsaufgabe.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Regex um Datei in Pfad, Basisnamen und Endung zu zerlegen

am 06.09.2005 21:53:03 von Fabian Pilkowski

* Torsten Mohr schrieb:
>
> ich suche einen Regex (oder andere Möglichkeit), mit dem ich
> einen String (einen Dateinamen) in Pfad, Basisnamen und Endung
> zerlegen kann, etwa folgendermassen:
>
> /some/path/file.ext => "/some/path" "file" "ext"
> name.ex.ext => "." "name.ex" "ext"
> file/path/name => "file/path" "name" ""
>
> Bisher mache ich das mit rindex und ein paar if()s.

Als simple Näherung würde ich einen regulären Ausdruck in Betracht
ziehen:

$string =~ m{ (.*) / ([^/]*) \. ([^./]*) $ }x;

Damit sollte (ungetestet) der Pfad in $1, der Dateiname in $2 und die
Endung in $3 landen. Dies funktioniert, da das Pattern am Ende verankert
ist (mit dem $-Zeichen). Der Pfad darf beliebige Zeichen enthalten, der
Dateiname keine Slashes und die Endung weder Slashes noch Punkte.

>
> Gibt es da eine einfachere Möglichkeit?

Obige Lösung mit einem regulären Ausdruck ist nicht elegant. Damit wird
es sehr schnell sehr kompliziert. Du hast zB keinen '.' als Pfad, wenn
kein Pfad angegeben ist (so Dein obiges Beispiel). Ebenfalls kommst Du
mit anderen Betriebssystemen nicht klar, zB wegen des Windows-typischen
Backslashs. Dies alles hat sich aber bereits vor uns schon jemand
überlegt und in einem Modul zusammengefasst.

File::Basename

Schau Dir mal die Doku dazu an. Eine Installation des Moduls ist nicht
erforderlich -- es ist eines der Standard-Module, die bereis mit Perl
mitgeliefert werden.

gruß,
fabian

Re: Regex um Datei in Pfad, Basisnamen und Endung zu zerlegen

am 07.09.2005 19:32:35 von Ulrich Herbst

Torsten Mohr writes:

> Hallo,
>
> ich suche einen Regex (oder andere Möglichkeit), mit dem ich
> einen String (einen Dateinamen) in Pfad, Basisnamen und Endung
> zerlegen kann, etwa folgendermassen:
>
> /some/path/file.ext => "/some/path" "file" "ext"
> name.ex.ext => "." "name.ex" "ext"
> file/path/name => "file/path" "name" ""
>
> Bisher mache ich das mit rindex und ein paar if()s.
>
> Gibt es da eine einfachere Möglichkeit?


Was spricht eigentlich gegen File::Basename ?

Uli

--
'''
(0 0)
+------oOO----(_)--------------+
| |
| Ulrich Herbst |
| |
| Ulrich.Herbst@gmx.de |
+-------------------oOO--------+
|__|__|
|| ||
ooO Ooo