PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateiname bereinigen


schrotti
19.06.2008, 21:04
Hallo, ich habe Dateinamen in wilder Form und sollte daraus einen Dateinamen mit der Endung ".ps" erstellen. Was so daher kommt: "dat1", "dat1.ps", "dat1.", dat1.ps..f" usw. Mit Regex "\..*$" und replace ".ps" kann ich alle Fälle erschlagen, ausser "dat1". Ich schaffe es einfach nicht:confused:. Kann jemand helfen? Gesucht ist ein Regex mit replace, um aus dem oben genannten Beispielen ein "dat1.ps" zu machen.

Besten Dank im voraus
schrotti


Firefall
19.06.2008, 22:25
^(.*?)(?:\.ps.*)?$Ersetzen mit $1.ps

schrotti
20.06.2008, 10:57
Hallo Firefall, Besten Dank für die prompte Antwort. Hat fast funktioniert. Ich musste nur noch das "ps" rausnehmen, dann hatte ich genau das das, was ich brauchte, also ^(.*?)(?:\..*)?$. Nun können die Dateinamen daherkommen, wie sie wollen, ich kriege immer was anständiges raus.

Gruss
schrotti

eViL_oNe
24.06.2008, 21:01
leider funktioniert das nicht. Sofern eine Datei mehrere Punkte im Dateinamen enthält, wird ab dem ersten Punkt damit abgeschnitten! Nachdem in den meisten Regex-Dialekten keine variablen Lookbehinds erlaubt sind, würde ich einfach einen gierigen Ausdruck einsetzen:

/^(..*)(\.[^.]*)$/

Wichtig ist hier der erste Punkt! Damit wird garantiert, dass der Dateiname mindestens ein Zeichen enthält und somit verhindert, dass Hidden-Files (etwa so was wie .htpasswd) als Dateiendung interpretiert werden!

dieser Ausdruck hat leider den Nachteil, das er auf Dateien ohne Endung gar nicht mehr matched. Hier kann man aber eine Sonderbehandlung einbauen:

Perl-Code:


#!/usr/bin/perl
use strict;
my @fileNames = (
"das ist nur. ein test.tar.gz",
"test.pdf",
"xyz",
"foo.ps",
".htpasswd",
".",
"..",
"",
"Ein test.",
);

foreach my $fileName (@fileNames)
{
if ( $fileName =~ /^(..*)(\.[^.]*)$/ )
{
print "$fileName -> $1.ps\n";
}
else
{
print "$fileName -> $fileName.ps\n";
}
}


Ausgabe:


# ./regex.pl
das ist nur. ein test.tar.gz -> das ist nur. ein test.tar.ps
test.pdf -> test.ps
xyz -> xyz.ps
foo.ps -> foo.ps
.htpasswd -> .htpasswd.ps
. -> ..ps
.. -> ..ps
-> .ps
Ein test. -> Ein test.ps