Tuesday, 2 June 2009

Expresiones regulares en Delphi

Las expresiones regulares son cadenas de texto que describen un patrón de búsqueda. Podemos pensar en éstas expresiones como una especie de comodines, como los que utilizamos para listar una serie de ficheros en un directorio desde el intérprete de comandos -> dir *.doc (devolverá la lista de todos los ficheros con la extensión .doc). Pues bien, la expresión regular equivalente para *.doc seria .*\.doc$. Pero podemos llegar a hacer muchas más cosas con las expresiones regulares. Ya hay varios editores de texto como EditPad Pro o PowerGrep que llevan integradas las Regular Expression, aunque son de pago :( . En PowerGrep, podemos ver una expresión regular típica para la búsqueda de una dirección de correo electrónico:

Como podemos ver, la expresión regular \ b [A-Z0-9._ %+-]+@[ A-Z0-9 .-] + \. [AZ] {2,4} \ b buscar direcciones de correo electrónico dentro del texto. Luego con un pequeño cambio com éste: \ ^ [A-Z0-9._ %+-]+@[ A-Z0-9 .-] + \. [AZ] {2,4} \ $ nos puede servir para comprobar si la dirección de correo electrónico se ha entrado correctamente en un campo. Mediante esta expresión regular, podemos comprobar si hemos entrado los datos correctamente, y nos sirve para una multitud de lenguajes como java, perl, PHP, .net, etc.

Con Microsoft Excel, también las podemos utilizar, con la Microsoft VBScript Regular Expressions 5.5. Aquí os pongo un pequeño ejemplo de como utilizarlo, aunque hay muchos ejemplos por la red:

Luego, por ejemplo si tenemos un texto en una de las celdas y queremos extraer las direcciones electrónicas, solo tenemos que hacer:


Ahora, creamos la función que irá dentro de uno de los módulos del Excel (Acordaros de activar las macros):




Public Function extraerreg(s As String) As String
Dim o_RegExp As RegExp
Dim o_Match As Match
Dim o_Matches As MatchCollection
Set o_RegExp = New RegExp
o_RegExp.IgnoreCase = True
o_RegExp.Global = True
o_RegExp.Pattern = "[^,;\s]+@[^,;\s]+"
Set o_Matches = o_RegExp.Execute(s)
' Recorre en la colección
For Each o_Match In o_Matches
extraerreg = extraerreg + o_Match.Value + " "
Next
End
Function


Como podemos ver en el ejemplo, se utiliza la expresión regular "[^,;\s]+@[^,;\s]+" para encontrar una cadena de texto que siga este patrón. Aquí os dejo el ejemplo : libro1.xlsm

En este caso Delphi aún no lo tiene integrado en su core (esperemos que algún día lo hagan). Pero si que lo he visto en muchos de los componentes de terceros como DevExpress. Por ejemplo el componente TcxMaskEdit, permite realizar la entrada de valores mediante Regular Expressions:


En delphi, hay una librería llamada TRegExpr, de la mano de Andrey V. Sorokin. Podemos descargarla y probarla desde el siguiente enlace: RegExp Studio. Una vez descargada la librería, podemos ver varias demos de la utilización sobre las regular expressions:

En este caso, si analizamos el código fuente:




procedure TfmTRegExprClassMain.btnExtractEmailsClick(Sender: TObject);
begin
lbxEMailesExtracted.Items.CommaText := ExtractEmails (memExtractEmails.Text);
end;

// This simple function extracts all emails from input string
// and places list of this emails into result string as CSV (comma separated values)
function ExtractEmails (const AInputString : string) : string;
const
EmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';
var
r : TRegExpr;
begin
Result := '';
r := TRegExpr.Create;
try // ensure memory clean-up
r.Expression := EmailRE;
if r.Exec (AInputString) then
REPEAT
Result := Result + r.Match [0] + ',';
UNTIL not r.ExecNext;
finally r.Free;
end;
end;




Podemos ver como utiliza expresiones regulares para capturar la dirección de correo electrónica. Pues bien, ahora ya podemos extender la librería y empezar a utilizarlas ya que nos ayudan mucho con los patrones de texto.
  • Enlaces de interés:
Expresiones regulares con visual basic.
Comprobador de expresiones regulares en javascript. (Ejemplo).
Introducción expresiones regulares.
Expresiones regulares XHTML.
Evaluar expresiones regulares.

0 comments:

Post a Comment