2 de febrero de 2016

Expresiones regulares en Visual FoxPro - Parte 2

Artículo original: Regular Expressions in Visual FoxPro Part 2
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,01177828-56ba-4e93-8bfb-04b96c43ce7f.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


Desde el comienzo

En una entrada de blog anterior (Una biblioteca de expresiones regulares para Visual FoxPro) desvelé una FLL nueva para Visual FoxPro que permitiría a los desarrolladores Visual FoxPro utilizar Expresiones regulares para encontrar correspondencias. Esta FLL, que es muy útil cuando se es competente en temas de expresiones regulares, fue sólo el comienzo de lo que es posible.

Ahora, que ya tengo la biblioteca básica que realiza parte de la funcionalidad de Boost Regex, puedo expanderla incluyendo funcionalidad adicional. Creo que encontrará útiles las mejoras que incluyen formatos y fraccionamientos.

Descarga de regexp.fll (61 KB aprox) haciendo clic aquí


Documentación de regexp.fll ...


Función REGEXP()

Sintaxis: RegExp(cString, cRegularExpression [, nFunctionType[, cFormatExpression | cArrayName]])

Parámetros:

cString - Cadena a ser buscada, formateada o cortada

cRegularExpression - Expresión regular con sintaxis Perl. Vea documentación adicional en http://perldoc.perl.org/perlre.html#Regular-Expressions

nFunctionType - Existen tres tipos de funciones disponibles. El valor de este parámetro determina la operación que realizará RegExp así como su valor de retorno.

Lista de las funciones actualmente soportadas:

  • 0 = Patrón de coincidencia - RegExp() devuelve .T. si se encuentra el patrón en cString que coincida con cRegularExpression, de lo contrario devuelve .F., lo que significa que no hay coincidencia. Este es el comportamiento predeterminado para RegExp() cuando solamente se pasan los dos primeros parámetros.
  • 1 = Formato - RegExp() devuelve una cadena de caracteres que se crea por la iteración entre cString buscando las coincidencias de cRegularExpression y aplicando cFormatExpression para hacer esas coincidencias.
  • 2 = Corte (Split) - RegExp() devuelve el número de cortes cuando se crea una matriz de los patrones que se crea en cString y coinciden con cRegularExpression. El nombre de la matriz se especifica en cArrayName.

cFormatExpression | cArrayName - Dependen del valor del parámetro nFunctionType

Valor devuelto:

Depende del valor del parámetro nFunctionType (vea arriba la documentación para el parámetro nFunctionType). RegExp() devolverá un valor lógico que indica, si existe coincidencia o no, si nFunctionType es 0. RegExp() devolverá una cadena de caracteres si nFunctionType es 1. RegExp() tras una exitosa creación de la matriz de cortes, devolverá la cantidad de elementos (números de cortes) si nFunctionType es 2.

Ejemplo de empleo: (corte y pegue en un PRG y ejecútelo desde Visual FoxPro)

*!* El ejemplo siguiente muestra cómo utilizar la función RegExp()
*!* para validar, dar formatos y dividir números de tarjetas de crédito
CLEAR 
*!* Informa a Visual FoxPro de la nueva función
*!* estableciendo la biblioteca para regexp.fll
SET LIBRARY TO LOCFILE("regexp.fll","FLL","Locate regexp.fll") 
LOCAL lcExpression
lcExpression = "\A(\d{3,4})[- ]?(\d{4})[- ]?(\d{4})[- ]?(\d{4})\z" 
? "Patrones de coincidencia:"
*!* Valida un número de tarjeta de crédito usando RegExp()
? RegExp("1234-5678-9101-1121",lcExpression) && Hay coincidencia
? RegExp("123-567-910-112", lcExpression) && No hay coincidencia
? 
? "Formatos:"
*!* Dar formato a números de tarjeta de crédito usando RegExp()
? RegExp("1234567891011121",lcExpression, 1, "\1-\2-\3-\4") && Hay coincidencia
? RegExp("12345678910111", lcExpression, 1, "\1-\2-\3-\4") && No hay coincidencia
? 
*!* Cortar los números de una CC utilizando RegExp()
? "Splits: " + TRANSFORM(RegExp("1234-5678-9101-1121",lcExpression, 2, "arySplits")) && Hay coincidencia
ShowSplits()
? "Splits: " + TRANSFORM(RegExp("1234-5678-9101-112", lcExpression, 2, "arySplits")) && No hay coincidencia
ShowSplits() 
*!* libera la referencia de la biblioteca
SET LIBRARY TO 
***************************
Procedure ShowSplits()
***************************
  LOCAL lnCounter
  FOR lnCounter = 1 TO ALEN(arySplits)
    ? CHR(9) + TRANSFORM(lnCounter) + ": " + arySplits(lnCounter)
  ENDFOR
  ?
ENDPROC

1 comentario :

  1. junio 2017 - nuevo link actualizado para bajar la librería http://www.sweetpotatosoftware.com/files/regexp.zip

    colocar el archivo librería en un directorio conveniente del proyecto y para cargarla
    pueden hacer SET LIBRARY TO LOCFILE("regexp.fll","FLL","Locate regexp.fll") ADDITIVE

    Después de cargarla pueden probarla desde una ventana de comandos asi:

    lcExpression = "^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$"

    ? RegExp("john@isp.com",lcExpression)

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.