Hi
Die folgende Funktion wandelt einen String, der der Maske1 entspricht, in einen neuen String um, der der Maske2 entspricht.
Sinn des ganzen ist es, zum Beispiel bei Dateinamen von Liedern, ganz einfach Titel, Interpret und Track umzusortieren.
Dazu ist es hiermit nicht vonnöten, die komplizierte Syntax der regulären Ausdrücke zu können, allerdings sind auch die Möglichkeiten stark reduziert. Man kann einzig und allein Masken benutzen welche Text und Variablen umklammert von '%' enthalten.
Diese Variablen werden nach dem Schema der ersten Maske "herausgeholt" und in die zweite Maske eingesetzt.
Beispiel:
Dateiname: Interpret-Titel-Track
Möchte man diesen String nun in die Form Interpret - Album - Track - Titel bringen, so gann man folgendes machen:
Mask1: %i%-%ti%-%t%
Mask2: %i% - Album - %t% - %ti%
meine Funktion aufrufen
und schon ist der Dateiname ist entsprechend formatiert.
benötigt wird neben folgendem Code noch
Regular Expressions for Delphi
Delphi-Quellcode:
unit UExtRegExpr;
interface
uses RegExpr, SysUtils;
type
TData =
record
Name:
String;
ID: Integer;
end;
TDataTable =
array of TData;
function GenNewString(Value, Mask1, Mask2:
String):
String;
function Mask2RegExp(Mask:
String;
var Table: TDataTable):
String;
function InsertIntoString(Mask:
String; Table: TDataTable; R: TRegExpr):
String;
implementation
function GenNewString(Value, Mask1, Mask2:
String):
String;
var R: TRegExpr;
T: TDataTable;
begin
R:=TRegExpr.Create;
R.Expression:=Mask2RegExp(Mask1,T);
R.Compile;
R.Exec(Value);
Result:=InsertIntoString(Mask2,T,R);
R.Free;
end;
function Mask2RegExp(Mask:
String;
var Table: TDataTable):
String;
var Akt, ID: Integer;
S, R:
String;
begin
SetLength(Table,0);
S:=Mask;
Akt:=Pos('
%',S);
ID:=1;
R:='
';
while Akt>0
do
begin
SetLength(Table,Length(Table)+1);
Table[Length(Table)-1].ID:=ID;
R:=R+Copy(S,1,Akt-1);
Delete(S,1,Akt);
Table[Length(Table)-1].
Name:=Copy(S,1,Pos('
%',S)-1);
R:=R+'
(.*?)';
Delete(S,1,Pos('
%',S));
Akt:=Pos('
%',S);
Inc(ID);
end;
if R[1]='
('
then R:='
^'+R;
R:=R+S;
if Length(S)=0
then R:=R+'
$';
Result:=R+S;
end;
function InsertIntoString(Mask:
String; Table: TDataTable; R: TRegExpr):
String;
var i:Integer;
S:
String;
begin
S:=Mask;
for i:=0
to Length(Table)-1
do
S:=StringReplace(S,'
%'+Table[i].
Name+'
%',R.Match[Table[i].ID],[rfReplaceAll]);
Result:=S;
end;
end.
Auf Kommentare und Fehler bin ich natürlich sehr gespannt^^