2 de enero de 2016

Una biblioteca de expresiones regulares para Visual FoxPro

Artículo original: A Regular Expressions library for Visual FoxPro
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,91241006-595a-487d-ac06-d0fc1fc71632.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé


¿Qué es una expresión regular?

Antes de gastar miles de líneas explicando que son expresiones regulares, he aquí lo que aparece en la Wikipedia http://en.wikipedia.org/wiki/Regular_expression

¿Cómo pueden ser utilizadas en Visual FoxPro?

La vía fundamental en que los desarrolladores VFP han utilizado las expresiones regulares (si es que las han utilizado) en sus aplicaciones, es a través de Windows Scripting Host. Puede ver más información sobre expresiones regulares y cómo el objeto RegExp se utiliza en código VFP en el Wiki de Fox http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://wikis.com/wc.dll?Wiki~RegExp (Gracias a Alex Feldstein http://www.bloglines.com/blog/AlexFeldstein por la mayoría de los contenidos)

Mientras esta solución está bien, hay algunos problemas como puede ser la vía para establecer los parámetros de seguridad de la cuenta del usuario, o que WSH no esté disponible en el sistema. Sin embargo, es lo mejor que podemos hacer, si no queremos gastar en una biblioteca de terceros para brindar esta funcionalidad. Pero entonces, decidí intentar crear a mano otra solución de la cual nos podemos beneficiar todos.

Introducciendo regexp.fll

Decidí que llegó la hora en que los desarrolladores VFP tengan una biblioteca de enlace dinámico (FLL) gratis que ofrezca expresiones regulares en Visual FoxPro, por tanto, me senté con mi copia de Visual Estudio 8 y, escribí una con la ayuda de Boots http://www.boost.org. Desafortunadamente, el proceso no fue tan simple como ha sonado en la última frase.

Primeramente, jugué con la idea de escribirlo por mi mismo en código Visual Foxpro puro. Era una mala idea, por un lado, era atractiva la idea de reinventar la rueda; pero la descarté muy pronto, porque hubiera representado mucho esfuerzo y el resultado final no hubiera sido capaz de realizar todo lo que he alcanzado haciéndola en C++. Lo próximo fue investigar todas las bibliotecas C++ disponibles y por un tiempo estuve utilizando GRETA http://research.microsoft.com/projects/greta/; pero entre los errores que había en el código, la sensación de que no va a recibir más soporte una vez que se fue Eric Niebler y algunas cosas preocupantes que leí sobre la licencia, pensando en aplicaciones comerciales, pronto la desestimé también. Luego de jugar con cerca de media docena de otras bibliotecas y comparando la forma, función y rendimiento de cada una, me decidí por el proyecto regexp.fll de Boost RegExp http://www.boost.org/libs/regex/doc/introduction.html, entonces mi proyecto tomó forma y se finalizó en breve. Probablemente me llevó más tiempo compilar las bibliotecas BoostRegExp que para escribir el código real para esta FLL.

Un comienzo

Esta biblioteca lo que hace es la coincidencia. Mientras la coincidencia es dudosamente aquello para lo que se utilizan las expresiones regulares, existen otras cosas que yo agregaré a esta biblioteca que nos permitirán hacer todo un grupo de cosas en Visual FoxPro utilizando expresiones regulares, tales como devolver conjuntos coincidentes, realizar búsquedas posicionales y realizar las sustituciones. Incluso pensé que la biblioteca no está hecha para otra funcionalidad, pienso que encontrará muy útil su capacidad para la concordancia.

Nota importante sobre las librerías de C++ necesarias en tiempo de ejecución

Para utilizar esta FLL (que fue compilada con Visual Studio 8), necesitará la biblioteca runtime necesaria y debe estar en el sistema en una vía muy específica. No le puedo decir la cantidad de mensajes que he recibido sobre vfpencryption.fll que escribí en http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,5d4a0cf0-7d1d-4353-a49b-667946ff1c81.aspx en los que los desarrolladores han tenido problemas para hacerla funcionar debido a que no tienen los runtimes o los runtimes no fueron instalados correctamente en el sistema. No estoy diciendo que me molesten esos correos (siempre es bueno saber de miembros de la comunidad Visual FoxPro), o que yo no haya entendido la confusión ... Estoy diciendo que con Visual C++ 8.0 algunas de las reglas han cambiado y todos tenemos que aprender la vía correcta al hacer algo en la era del .NET 2.0.

La vía más más sencilla para instalar correctamente los runtimes en su sistema (o el sistema del usuario) es descargar el archivo instalador que ofrece Microsoft (su tamaño es 2.48 MB) desde http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.sweetpotatosoftware.com/files/vcredist_x86.zip. Es un poco pesado; pero la cuestión es simplemente hacer clic y todas las bibliotecas quedan instaladas, sin molestias ni alborotos.

Ahora, para aquellos que desean crear un instalador o simplemente desean tener el mínimo requerido pudieran crear una subcarpeta llamada "Microsoft.VC80.CRT" en la misma carpeta en que está el regexp.fll. La subcarpeta Microsoft.VC80.CRT necesita tener cuatro archivos: Microsoft.VC80.CRT.manifest, msvcm80.dll, msvcp80.dll, y msvcr80.dll. Para ayudarlo a crear esta configuración he creado un archivo zip que puede descargar desde http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.sweetpotatosoftware.com/files/microsoft.vc80.crt.zip (tamaño 577 KB). No necesita registrar ninguno de archivos o hacer nada adicional que colocarlos justo en ese sitio. La estructura de carpetas es la siguiente:

Como puede ver, tanto Microsoft.VC80.CRT como regexp.fll están en la misma carpeta (My Application). Y, dentro de Microsoft.VC80.CRT están los cuatro archivos que he mencionado antes. Esta es la vía para hacerlo en cada FLL que yo libere. (lo cierto es que hay otras formas de hacerlo; pero entonces, tengo que entrar en el tema sobre la carpeta WinSxS y que hacer en las versiones anteriores a Windows XP... la vida es corta)

Utilizar regexp.fll en Visual FoxPro

Lo primero es descargar la FLL en el enlace que aparece al final de este blog y asegurarse de que tiene instaladas las librerías C++ de alguna de las dos formas que describí antes. Entonces, puede empezar a emplearla dentro de Visual FoxPro en sus aplicaciones VFP. La sintaxis es muy sencilla y hay que recordar solamente una función: RegExp(cString, cRegExpression). El parámetro cString es la cadena que desea buscar para la coincidencia y cRegExpression es la expresión regular que desea utilizar al coincidir. RegExp() devolverá .T. para las coincidencias y .F. para las no coincidencias. Puede ayudarle ver el código de ejemplos que muestro a continuación (basta con copiar y pegar en un prg y ejecutarlo)...

CLEAR
*!* Haga que Visual FoxPro sepa de la nueva función
*!* estableciendo la biblioteca regexp.fll
SET LIBRARY TO LOCFILE("regexp.fll","FLL","Locate regexp.fll")
LOCAL lcExpression
*!* Valida direcciones de correo electrónico
lcExpression = "^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$"
? RegExp("john@isp.com",lcExpression)
? RegExp("john@.isp.com",lcExpression)
*!* Valida valores tipo moneda (currency)
lcExpression = "^(\$)?(([1-9]\d{0,2}(\,\d{3})*)|([1-9]\d*)|(0))(\.\d{2})?$"
? RegExp("$1,244,311.81",lcExpression) && Match
? RegExp("$1,24,4311.81",lcExpression) && No Match
*!* Valida días de la semana
lcExpression = "^(Sun|Mon|(T(ues|hurs))|Fri)(day|\.)?$|Wed(\.|nesday)?$|Sat(\.|urday)?$|T((ue?)|(hu?r?))\.?$"
? RegExp("Sunday",lcExpression) && Match
? RegExp("sundae",lcExpression) && No Match
*!* Valida números de teléfono
lcExpression = "^[2-9]\d{2}-\d{3}-\d{4}$"
? RegExp("507-562-0020",lcExpression) && Match
? RegExp("507-56-0020",lcExpression) && No Match
*!* libera la referencia a la biblioteca
SET LIBRARY TO

Documentación sobre RegExp en Boost

Puede encontrar la documentación sobre la sintaxos de RegExp en el sitio web de Boost http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.boost.org/libs/regex/doc/syntax_perl.html (vea que se basa en la sintaxis Perl para expresiones regulares). Puede encontrar además un gran conjunto de ejemplos, información y guías para emplear expresiones regulares en este enlace: http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.google.com/search?hl=en&q=regular+expressions

He aquí el enlace para descargar regexp.fll

He incluido la licencia de Boost y un Readme.txt con esta FLL. No es necesario para distribuirlos con la FLL como biblioteca compilada, sin embargo, yo lo estoy incluyendo para que pueda ver que lo que dice la licencia - el punto básico es, que nosotros lo podemos utilizar libremente con fines comerciales. Si desea más información sobre esta licencia vea: http://www.boost.org/more/license_info.html#requirements

Descarga de regexp.fll (aproximadamente 47 KB) haciendo clic aquí

1 comentario :

  1. Excelente aporte y funciona muy bien. Sin embargo podrías actualizar los links de Documentación sobre RegExp en Boost, están rotos.

    ResponderEliminar