vložil Radek Červinka
21. července 2010 00:51
V základní instalaci Delphi není podpora pro regulární výrazy (zatím), ale je třeba použít kód třetí strany.
Velmi populární je třída TRegExpr, která je volně k použití a proto dnes ukáži jak na ni.
Autorem TRegExpr je Andrey V. Sorokin, což dokazuje, že v Rusku jsou opravdu dobří programátoři (např. dříve populární RxLib - nyní součástí JVCL, FastReport atd).
Problémem je, že tato knihovna (resp. domovská stránka RegExpStudio.com) najednou zmizela z netu (komponenta se dá po chvilce hledání najít jinde) a já tipuji, že byla koupena EMBT pro začlenění do Delphi. To by nebylo poprvé, viz komponenta TPNGImage (Gustavo Daud), která je nyní součástí VCL. Ale třeba nemám pravdu, každopádně zde je TRegExpr (originální), ve verzi i pro unicode Delphi.
Update:V komentáři doporučuje pepak jeho verzi s opravou drobných chyb a hlavně helpem - TRegExpr a help.
Třída umožňuje i kompilaci výrazů do interního p-code pro urychlení provádění.
Následující kód je konzolová aplikace obsahující dva příklady:
- první příklad ze zadaného html kódu odstraní tagy a výsledek zobrazí (dokud nezadáte prázdný text)
- druhý příklad po zadání url (ve tvaru http://adresa) načte HTML a vypíše obsah Title
Prakticky ve všech našich projektech používám kód Synapse, teď pro jednoduchost použiji Indy, jelikož jsou součástí Delphi a tak demo půjde kompilovat bez větších problémů.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, RegExpr, IdHTTP;
var
oRegExpr: TRegExpr;
s: string;
IdHTTP: TIdHTTP;
begin
try
writeln('Priklad 1: Zadejte html:');
oRegExpr := TRegExpr.Create;
try
// nahradi tagy za ''
oRegExpr.Expression := '<(.|\n)+?>';
while true do
begin
ReadLn(s);
if s = '' then
break;
oRegExpr.Exec(s);
writeln('Result= '+oRegExpr.Replace(s, '', true));
end;
finally
FreeAndNil(oRegExpr);
end;
writeln('Priklad 2:Zadejte URL:');
oRegExpr := TRegExpr.Create;
IdHTTP := TIdHTTP.Create(nil);
try
oRegExpr.Expression := '<title>(.*?)</title>';
// s := 'http://delphi.cz';
ReadLn(s);
if s= '' then
Exit;
s := IdHTTP.Get(s);
oRegExpr.Exec(s);
writeln('Title:'+ oRegExpr.Match[1]);
finally
FreeAndNil(oRegExpr);
FreeAndNil(IdHTTP);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.