Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Buscar con comodines # ó * en una string (https://www.clubdelphi.com/foros/showthread.php?t=61903)

Sr.Scorpion 26-11-2008 17:48:18

Buscar con comodines # ó * en una string
 
Hola:

Tengo la siguiente cadena:
11/17/08 09:45AM 126 01 2079775103 00:08'33 3040

Quisiera implementar una funcion a la cual... le pase como parametro la cadena anterior y el termino a buscar sea ##/##/## me devuelva 11/17/08, si le pongo como parametro a buscar ##:##** me devuelva 09:45AM (La simbologia # solo me busca numeros, la simbologia * me busca cualquier caracter). Si entro ## me devuelve 01, si entro #### me devuelve 3040.. y asi sucesivamente

Para mi esto resulta mas que complicado hacerlo a base ciclos whiles.. etc etc... por lo q no tengo ninguna idea de como empezar.... alguien pudiera sugerirme algo ???

OJO: La cadena puede tener ese orden pero tambien puede cambiar de posicion es decir la fecha de ultimo.... la hora tambien etc.

Saludos

Caro 26-11-2008 18:26:16

Hola Scorpion, lo que se me ocurre es esto, la función no esta bien controlada y talvez tenga varios errores, como te digo solo es una idea.

Solo toma en cuenta # para las llamadas.

Código Delphi [-]
function Buscar(cadena, formato : String): String;
var
 Indice : Integer;
 sl, slFormato : TStringList;
begin
 sl := TStringList.Create;
 slFormato := TStringList.Create;
 
 sl.DelimitedText := cadena;
 
 for i:=1 to Length(cadena) do
  if cadena[i] in ['0'..'9','A'..'Z'] then
   cadena := StringReplace(cadena,cadena[i],'#',[rfReplaceAll]);
 
 slFormato.DelimitedText := cadena;
 
 Indice := slFormato.IndexOf(formato);

 if Indice>=0 then
  Result := sl[Indice]
 else
  Result := 'No existe';
end;
 
.....................
 cadena := '11/12/08 09:45AM 126 01 2079775103 00:08''33 3040';
 showmessage(Buscar(cadena, '##/##/##'));
 showmessage(Buscar(cadena, '##:####'));

Saluditos

Sr.Scorpion 26-11-2008 19:10:28

Bueno he probado por arribita .. y hasta ahora todo ok... la estoy revisando ahora con mas calma.... no obstante mis reverencias.. :D

Sr.Scorpion 26-11-2008 19:41:09

Cita:

Empezado por Caro (Mensaje 328122)
Hola Scorpion, lo que se me ocurre es esto, la función no esta bien controlada y talvez tenga varios errores, como te digo solo es una idea.

Solo toma en cuenta # para las llamadas.

Código Delphi [-]function Buscar(cadena, formato : String): String; var Indice : Integer; sl, slFormato : TStringList; begin sl := TStringList.Create; slFormato := TStringList.Create; sl.DelimitedText := cadena; for i:=1 to Length(cadena) do if cadena[i] in ['0'..'9','A'..'Z'] then cadena := StringReplace(cadena,cadena[i],'#',[rfReplaceAll]); slFormato.DelimitedText := cadena; Indice := slFormato.IndexOf(formato); if Indice>=0 then Result := sl[Indice] else Result := 'No existe'; end; ..................... cadena := '11/12/08 09:45AM 126 01 2079775103 00:08''33 3040'; showmessage(Buscar(cadena, '##/##/##')); showmessage(Buscar(cadena, '##:####'));


Saluditos


Por ejemplo si en la fecha pongo '##/##' me dice q no existe... hay otra funcion q no sea Indexof q busca por lo menos parte de la cadena ???

Saludos

Sr.Scorpion 26-11-2008 22:12:02

Bueno aqui he hecho un procedimiento q se acerca bastante a lo q quiero, me imagino q se pueda simplificar y pulir un poco mas

Código Delphi [-]
function Buscar2(Cadena, formato: string): string;
var
I, J : Integer;
SubCad: string;
begin
J:=0;
for i:=1 to Length(cadena) do
begin
inc(J);
  if formato[j] = '#' then
   if cadena[i] in ['0'..'9'] then SubCad:= SubCad + cadena[i]
   else
    begin
     SubCad:='';
     J:=0;
    end;
  if formato[j] = '*' then
   if cadena[i] in ['A'..'Z'] then SubCad:= SubCad + cadena[i]
   else
    begin
     SubCad:='';
     J:=0;
    end;
  if (formato[j] <> '#') and (formato[j] <> '*') then
    if formato[j] = cadena [i] then SubCad:= SubCad + cadena[i]
    else
    begin
     SubCad:='';
     J:=0;
    end;
 if (j >= Length(formato)) and (cadena[i+1]=' ') Then break
end;
Result:=SubCad;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(Buscar2(Edit1.Text, '##:##**'));
end;

La cadena seria:
11/17/08 09:45AM 126 01 2079775103 00:08'33 3040

Por lo q mostraria 09:45AM

Saludos

maeyanes 26-11-2008 22:54:07

Hola...

Se me ocurre algo así (hecho de memoria y todavía no probado :p):

Código Delphi [-]
function SearchFor(const Str, SearchFormat: string): string;
var
  I: Intetger;
  Temp: string;

begin
  for I := 0 to Length(Str) do
    if (Str[i] in ['0'..'9', 'A'..'Z'] then
      Temp := StringReplace(Str, Str[i], '#', [rfReplaceAll]);
  I := Pos(SearchFormat, Str);
  if I > 0 then
    Result := Copy(Str, I, Length(SearchFormat))
  else
    Result := ''
end;


Saludos...

Caro 28-11-2008 15:55:07

Cita:

Empezado por Sr.Scorpion (Mensaje 328209)
Bueno aqui he hecho un procedimiento q se acerca bastante a lo q quiero, me imagino q se pueda simplificar y pulir un poco mas


Código Delphi [-]
function Buscar2(Cadena, formato: string): string;
var
I, J : Integer;
SubCad: string;
begin
J:=0;
for i:=1 to Length(cadena) do
begin
inc(J);
if formato[j] = '#' then
if cadena[i] in ['0'..'9'] then SubCad:= SubCad + cadena[i]
else
begin
SubCad:='';
J:=0;
end;
if formato[j] = '*' then
if cadena[i] in ['A'..'Z'] then SubCad:= SubCad + cadena[i]
else
begin
SubCad:='';
J:=0;
end;
if (formato[j] <> '#') and (formato[j] <> '*') then
if formato[j] = cadena [i] then SubCad:= SubCad + cadena[i]
else
begin
SubCad:='';
J:=0;
end;
if (j >= Length(formato)) and (cadena[i+1]=' ') Then break
end;
Result:=SubCad;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(Buscar2(Edit1.Text, '##:##**'));
end;


La cadena seria:
11/17/08 09:45AM 126 01 2079775103 00:08'33 3040

Por lo q mostraria 09:45AM

Saludos


Hola de nuevo, yo no lo haría así, funciona, pero talvez podría fallar en algunos casos, ademas si fuera así tendrías que aumentar mas y mas condiciones, en la función que te he mandado era solo aumentar dos lineas para cambiar las letras por el *, pero claro no funciona con subcadenas dentro cada palabra "##/##" y tu función tampoco funciona para ese caso.

Lo mejor es que uses el Pos para buscar subcadenas, como te ha indicado mayanes, corrigiendo algunos errores de su función y aumentando para que funcione con el *, quedaría así:

Código Delphi [-]
function SearchFor(const Str, SearchFormat: string): string;
var
  I: Integer;
  Temp: string;
begin
  Temp := Str;
  for I := 0 to Length(Temp) do
   begin
    if (Temp[i] in ['0'..'9']) then
      Temp := StringReplace(Temp, Temp[i], '#', [rfReplaceAll]);
    if (Temp[i] in ['A'..'Z']) then
      Temp := StringReplace(Temp, Temp[i], '*', [rfReplaceAll]);
   end;

  I := Pos(SearchFormat, Temp);
  if I > 0 then
    Result := Copy(Str, I, Length(SearchFormat))
  else
    Result := ''
end;
 
cadena := '11/12/08 09:45AM 126 01 2079775103 00:08''33 3040';
showmessage(SearchFor(cadena, '##:##**'));

Saluditos


La franja horaria es GMT +2. Ahora son las 02:22:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi