Espressioni regolari in Delphi
di Alberto Caleffi
04.08.2004
Le espressioni regolari sono un potente strumento per l'analisi, la ricerca e
la sostituzione di blocchi di testo. Se dovete usarle in un programma Delphi,
avete due alternative:
- Trovare un componente VCL su Internet.
- Usare un componente COM gentilmente fornito da Windows.
Ho dovuto prendere questa decisione la settimana scorsa per un software a cui sto
lavorando, ed ho scelto la seconda strada.
Il componente TRegExp
La libreria VBScript.dll fa parte del motore di scripting di Windows,
è presente su tutti i sistemi a partire da Win98, e contiene un
componente RegExp bello e pronto per l'uso. Si tratta dello stesso oggetto
disponibile nelle pagine ASP e negli script VBS.
Per usare il componente RegExp è necessario importare la sua type
library. Ecco come fare:
- Nel menu di Delphi, scegliete Project » Import Type Library.
-
Nell'elenco delle type library disponibili, scegliete Microsoft VbScript
Regular Expressions, seguito da un numero di versione. Infatti esistono
più versioni del componente, come mostra l'immagine che segue. Più
avanti vedremo le differenze.
- Nella casella Unit dir name inserite il percorso ed il nome della
unit da creare (opzionale).
- Infine cliccate su Create Unit.
Delphi crea nella unit indicata un componente VCL di nome TRegExp, che fa da wrapper
al componente COM di VbScript. Ora non ci resta che provare ad usarlo.
Differenze fra le versioni di VBScript.dll
Nel momento in cui scrivo sono disponibili due versioni della libreria VBScript.dll,
la 1.0 e la 5.5. La differenza sostanziale è che la versione 5.5 fornisce anche
l'intefaccia ISubMatches, che invece non esiste nella versione 1.0.
Un piccolo esempio d'uso
Nella routine che segue viene usato il metodo Replace del componente per
sostituire gli indirizzi HTTP trovati nel testo HTML di prova con i rispettivi link.
procedure TMainForm.ReplaceLinks(Sender: TObject);
const
Html = '<html>'#13 +
'<head>'#13 +
'<title>TRegExp test</title>'#13 +
'</head>'#13 +
'<body>'#13 +
'<h1>TRegExp test</h1>'#13 +
'<p>'#13 +
' Link: http://www.borland.com'#13 +
'</p>'#13 +
'</body>'#13 +
'</html>'#13;
var
RegExp: TRegExp;
ResultHtml: String;
begin
RegExp := TRegExp.Create(Self);
try
RegExp.Global := True;
RegExp.IgnoreCase := True;
RegExp.Pattern := '((ftp|http)://([_a-z\d\-]+(\.[_a-z\d\-]+)+)' +
'((/[ _a-z\d\-\\\.]+)+)*)';
ResultHtml := RegExp.Replace(Html, '<a href="$1">$1');
ShowMessage(ResultHtml);
finally
RegExp.Free;
end;
end;
Se eseguite questa routine, otterrete il messaggio che segue, con il testo sostituito.
Per avere maggiori informazioni sui metodi e sulle proprietà del componente
RegExp, e sulla sintassi delle espressioni regolari, consultate la documentazione
di VBScript, reperibile in questa sezione del sito web di
Microsoft.
|