close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 20 years ago

Last modified 13 years ago

#297 closed defect

Error en la función TextMatch — at Version 4

Reported by: fdelamuela Owned by: Víctor de Buen Remiro
Priority: normal Milestone:
Component: Text Version: head
Severity: normal Keywords:
Cc:

Description (last modified by Víctor de Buen Remiro)

La función TextMatch de TOL no funciona bien:

Real TextMatch("farola","*o*a"); da FALSO, de hecho da falso a partir de
tener en el patrón dos caracteres y algún asterisco (por lo menos en todos
los casos en los que lo he probado).

Change History (4)

comment:1 Changed 18 years ago by Víctor de Buen Remiro

Owner: changed from danirus to Víctor de Buen Remiro

comment:2 Changed 18 years ago by Víctor de Buen Remiro

Resolution: duplicate
Status: newclosed

Ante todo perdón por la tardanza en la respuesta. Se nos había traspapelado este bug.

La función TextMatch es pobre pero honrada. Lo que hace es exactamente lo que dice que va a hacer. Sería bueno que existiese una verdadera función de reconocimiento de expresiones regulares pero eso ya estaba pedido en el bug 49 así que lo pongo como duplicado a la espera de tiempo para su desarrollo.

Real TextMatch(Text cadena, Text modelo [, Real modo = 0 ])

Devuelve verdadero si el modelo o patrón es equiparable con una cadena dada. Trabaja o no de modo sensible a mayúsculas y minúsculas. Si no es especificado dicho modo, se sobreentiende el caso no sensible.El carácter comodín * puede equipararse a cualquier combinación de uno o más caracteres. El carácter comodín * único puede usarse al comienzo o al final del modelo.
Ejemplos:

Match ("Alfa", "Alfa") = CIERTO;
Match ("Alfa", "Alf*") = CIERTO;
Match ("Alfa", "*lfa") = CIERTO;
Match ("Alfa", "*lf*") = CIERTO;
Match ("Alfa", "*Alfa") = CIERTO;
Match ("Alfa", "*lfa*") = CIERTO;
Match ("Alfa", "*lfaX") = FALSO;
Match ("Alfa", "*l*f*") = FALSO;

* This bug has been marked as a duplicate of bug 49 *

comment:3 Changed 14 years ago by Pedro Gea

Component: MathText
Resolution: duplicate
Status: closedreopened

No entiendo por qué este bug está cerrado, si el problema persiste:

Real TextMatch("farola", "*o*a");
//> False

El tique #49 (también cerrado) recoge el deseo de tener una función como ésta. Pero si está implementada ya, o se corrije o se quita. Y si no se quita, al menos debería llevar un warning diciendo que no te fíes o allá tú.

Adjunto una variante (como se hacía en #49 basada en SQL) pero basada en Tcl, de modo que sólo es válida si Tcl está presente (tolsh o tolbase):

Real TextMatch_Tcl(Text text, Text pattern, Real case) {
  Text text.tcl = "{"<<Replace(Replace(Replace(text, "\\", "\\\\"), 
    "{",  "\\{"), "}",  "\\}") << "}";
  Text pattern.tcl = "{"<<Replace(Replace(Replace(pattern, "\\", "\\\\"), 
    "{",  "\\{"), "}",  "\\}") << "}";
  Text caseText = If(case, "", "-nocase ");
  Eval(Tcl_Eval("string match "<<caseText<<pattern.tcl<<" "<<text.tcl)[1])
};

Real TextMatch("farola", "*o*a"); //-> False
Real TextMatch_Tcl("farola","*o*a", 1); //-> True

comment:4 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)

Esta es una función que yo no hice y que soy incapaz de descifrar.
Todo lo que puedo hacer es meter TextMatch_Tcl en la StdLib si está TCL activo y luego cortocircuitar TextMatch para que la llame si existe.

Note: See TracTickets for help on using tickets.