Las expresiones regulares no son mi fuerte

Necesitaba hacer una expresión regular que me permitiera cambiar de las sintaxis

Call(Objeto,&ParametroIN, ......, &ParametroOUT)

a

&ParametroOUT = Objeto.udp(&ParametroIN,......)

La expresión regular mas sencilla que encontré (con la invalorable ayuda de Nicolás) , que funciona bien en los casos que los probé es:

(\s+)?(call\(({0})([\s\b]*)(,(.*)(,[\s\b]*)(&([a-z0-9\-]+))|,(.*)(&([a-z0-9\-]+)))[\s\b]*\)|(({0})(.call) ?\(((.*)(,[\s\b]*)(&([a-z0-9\-]+))|(.*)(&([a-z0-9\-] +)))[\s\b]*\)))

donde debo remplazar {0} por el nombre del objeto.

Luego debe remplazar en el código con la expresión super amigable:

$1$8$11$19$22 = $3$14.udp($6$17)

La potencia de las expresiones regulares es asombrosa, pero también es asombroso lo complejas que pueden quedar con casos bastantes sencillos.

PD: La próxima version de KBDoctor, tendrá una opción que identifica los programas que tienen todos los parámetros IN, menos el ultimo OUT y cambia todas las invocaciones al formato UDP. Esto hace el código mas claro y que GeneXus detecte algunos errores al especificar.

UPDATE: Tuve que actualizarla a
       
(\s+)?(call\([\s\b]*({0})([\s\b]*)(,(.*)(,[\s\b]*)(&([a-z0-9\-]+))|,(.*)(&([a-z0-9\-]+)))[\s\b]*\)|(({0})(.call) ?\(((.*)(,[\s\b]*)(&([a-z0-9\-]+))|(.*)(&([a-z0-9\-] +)))[\s\b]*\)))

Comentarios

Entradas más populares de este blog

El Sordo

StackOverflow Documentation

Codigo simple