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

Closed 14 years ago

Last modified 13 years ago

#297 closed defect (fixed)

Error en la función TextMatch

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 (9)

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.

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

Resolution: fixed
Status: reopenedclosed

(In [3495]) Fixes #297
TextMatch calls to TextMatch _tcl if available and else sows a warning and use old BText::Match

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

(In [3496]) Fixes #297
TextMatch calls to TextMatch _tcl if available and else sows a warning and use old BText::Match

comment:7 Changed 13 years ago by Jorge

The following implementation is more efficient (twice as fast)

Real TextMatch_Tcl(Text text, Text pattern, Real case)
{
  Set tclScript = [[ "string", "match" ]];
  Set If( Not(case), Set Append( tclScript, [[ "-nocase" ]] ) );
  Set Append( tclScript, [[ pattern, text ]] );
  TextToReal( Tcl_EvalEx( tclScript )[1] )
};

comment:8 Changed 13 years ago by Jorge

(In [4163]) refs #297, implementación más eficiente de TextMatch_Tcl

comment:9 Changed 13 years ago by Jorge

(In [4164]) refs #297, implementación más eficiente de TextMatch_Tcl

Note: See TracTickets for help on using tickets.