Home Scrivendo Software  
Powered by Google

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:

  1. Trovare un componente VCL su Internet.
  2. 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:

  1. Nel menu di Delphi, scegliete Project » Import Type Library.
  2. 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.

    Importare la type library del VBScript

  3. Nella casella Unit dir name inserite il percorso ed il nome della unit da creare (opzionale).
  4. 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.

Output dell'esempio

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.