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
- Si nFunctionType es 1, entonces este parámetro es una cadena de formato al estilo perl. Vea más documentación en: http://www.boost.org/libs/regex/doc/format_perl_syntax.html
- Si nFunctionType es 2, entonces este parámetro es el nombre de la matriz que se creará.
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
junio 2017 - nuevo link actualizado para bajar la librería http://www.sweetpotatosoftware.com/files/regexp.zip
ResponderBorrarcolocar 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)