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ů.
1program Project1;
2
3
4
5uses
6 SysUtils, RegExpr, IdHTTP;
7var
8 oRegExpr: TRegExpr;
9 s: string;
10 IdHTTP: TIdHTTP;
11
12begin
13 try
14 writeln('Priklad 1: Zadejte html:');
15 oRegExpr := TRegExpr.Create;
16 try
17
18 oRegExpr.Expression := '<(.|\n)+?>';
19 while true do
20 begin
21 ReadLn(s);
22 if s = '' then
23 break;
24 oRegExpr.Exec(s);
25 writeln('Result= '+oRegExpr.Replace(s, '', true));
26 end;
27 finally
28 FreeAndNil(oRegExpr);
29 end;
30
31 writeln('Priklad 2:Zadejte URL:');
32 oRegExpr := TRegExpr.Create;
33 IdHTTP := TIdHTTP.Create(nil);
34 try
35 oRegExpr.Expression := '<title>(.*?)</title>';
36
37 ReadLn(s);
38 if s= '' then
39 Exit;
40 s := IdHTTP.Get(s);
41 oRegExpr.Exec(s);
42 writeln('Title:'+ oRegExpr.Match[1]);
43 finally
44 FreeAndNil(oRegExpr);
45 FreeAndNil(IdHTTP);
46 end;
47
48
49 except
50 on E: Exception do
51 Writeln(E.ClassName, ': ', E.Message);
52 end;
53end.