Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Einfache Benutzung von Regulären Ausdrücken (https://www.delphipraxis.net/59718-einfache-benutzung-von-regulaeren-ausdruecken.html)

glkgereon 27. Dez 2005 18:22


Einfache Benutzung von Regulären Ausdrücken
 
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^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz