Delphi: Uso de expresiones regulares con la librería freeware TRegExpr

Expresiones Regulares en Delphi

Copyright © 2000 Ernesto De Spirito

KnowledgeBase Vortex 2.9

¿Qué son expresiones regulares?

Las expresiones regulares son una forma de buscar y reemplazar patrones de texto. En cierta forma estos patrones son como usar los caracteres comodines '?' y '*' al buscar archivos, pero las expresiones regulares son inmensamente más poderosas que eso. En el patrón uno puede especificar si la cadena que se busca debe estar al principio o al final de una línea, qué caracteres se permiten, cuántas veces se pueden repetir y muchas cosas más.

¿Para qué se usan?

Básicamente se usan para tres propósitos:

  1. Poder de búsqueda (y reemplazo) de texto
    Puede usar expresiones regulares por ejemplo para buscar un registro específico en una base de datos de una manera mucho más poderosa que usando el operador SQL LIKE.

  2. Validación de datos
    Con las expresiones regulares puede validar la entrada del usuario para verificar si sigue un formato dado que debido a su complejidad u variabilidad no se puede chequear con máscaras. Por ejemplo, puede chequear si una cadena comienza opcionalmente con un signo más o menos, luego una secuencia de no más de siete dígitos y opcionalmente una coma seguida de hasta dos dígitos.

  3. Extracción de datos
    No sólo que puede chequear si una cadena sigue un cierto patrón, sino que puede extraer arbitrariamente partes del texto. Por ejemplo, para un número de teléfono como '+1 (123) 555-9999' usted puede extraer el código de país ('1'), código de área ('123') y el número local ('555-9999').

Biblioteca freeware TRegExpr

¿Quiere implementar expresiones regulares en sus aplicaciones Delphi? Una buena forma de hacerlo es usando la biblioteca TRegExpr, que es freeware y viene con código fuente completo y está documentada en varios lenguajes. Esta biblioteca ha sido desarrollada por Andrey V. Sorokin portando el código en C de las conocidas rutinas V8 de Henry Spencer (un subconjunto de las expresiones regulares de Perl) a Object Pascal. La última versión de la biblioteca es 0.942 y la puede obtener desde "AnSo @ Web" (el sitio web de Sorokin) en:

Ejemplos

La sintaxis de las expresiones regulares V8 está bien documentada en el archivo de ayuda y también puede encontrar muchas fuentes de documentación en la Internet, así que no vamos a adentrarnos en eso, pero sí vamos a mostrar un par de ejemplos del uso de la biblioteca:

uses RegExpr;

procedure TForm1.Button1Click(Sender: TObject);
// Valida la dirección de email en Edit1
begin
  // Aviso: este código no debe ser usado para realizar validación
  // real de email. Debe chequear la especificación RFC. Esto es
  // sólo una simplificación para mostrar el uso de ExecRegExpr.
  if not ExecRegExpr('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+',
      Edit1.Text) then begin
    ShowMessage('La dirección de email no es válida');
    Edit1.SetFocus;
  end else
    ShowMessage('La dirección de email es válida');
end;

procedure TForm1.Button2Click(Sender: TObject);
// Extrae direcciones de email contenidas en Memo1
var
  RegExpr: TRegExpr;
begin
  // Aviso: este código no extraerá todas las direcciones de email
  // válidas. Esto es sólo una simplificación para mostrar el uso de
  // Exec, ExecNext y Match.
  ListBox1.Clear;
  RegExpr := nil;
  try
    RegExpr := TRegExpr.Create;
    if RegExpr <> nil then begin
      RegExpr.Expression := '[^\w\d\-\.]([\w\d\-\.]+@[\w\d\-]+'
                          + '(\.[\w\d\-]+)+)[^\w\d\-\.]';
      if RegExpr.Exec(Memo1.Text) then
        repeat
          ListBox1.Items.Add(RegExpr.Match[1]);
        until not RegExpr.ExecNext;
    end;
  except
  end;
  RegExpr.Free;
end;

Puede encontrar el código fuente completo de este artículo en el archivo que acompaña al Boletín Pascal #21.

JfControls Library - para Delphi y C++ Builder