Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-11-2008
Avatar de Sr.Scorpion
Sr.Scorpion Sr.Scorpion is offline
Miembro
 
Registrado: mar 2005
Posts: 92
Poder: 20
Sr.Scorpion Va por buen camino
Lightbulb 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
__________________
La paciencia es un árbol de raíz amarga pero de frutos muy dulces.

Sr.Scorpion
Responder Con Cita
  #2  
Antiguo 26-11-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #3  
Antiguo 26-11-2008
Avatar de Sr.Scorpion
Sr.Scorpion Sr.Scorpion is offline
Miembro
 
Registrado: mar 2005
Posts: 92
Poder: 20
Sr.Scorpion Va por buen camino
Bueno he probado por arribita .. y hasta ahora todo ok... la estoy revisando ahora con mas calma.... no obstante mis reverencias..
__________________
La paciencia es un árbol de raíz amarga pero de frutos muy dulces.

Sr.Scorpion
Responder Con Cita
  #4  
Antiguo 26-11-2008
Avatar de Sr.Scorpion
Sr.Scorpion Sr.Scorpion is offline
Miembro
 
Registrado: mar 2005
Posts: 92
Poder: 20
Sr.Scorpion Va por buen camino
Cita:
Empezado por Caro Ver Mensaje
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
__________________
La paciencia es un árbol de raíz amarga pero de frutos muy dulces.

Sr.Scorpion
Responder Con Cita
  #5  
Antiguo 26-11-2008
Avatar de Sr.Scorpion
Sr.Scorpion Sr.Scorpion is offline
Miembro
 
Registrado: mar 2005
Posts: 92
Poder: 20
Sr.Scorpion Va por buen camino
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
__________________
La paciencia es un árbol de raíz amarga pero de frutos muy dulces.

Sr.Scorpion
Responder Con Cita
  #6  
Antiguo 26-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

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

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...
Responder Con Cita
  #7  
Antiguo 28-11-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por Sr.Scorpion Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Buscar TAB en un string unreal4u Varios 4 13-07-2012 23:13:27
Buscar substring en string con IndexOf? Belaix Varios 3 12-11-2008 22:22:31
Buscar un string dentro de otro FunBit Varios 2 27-01-2006 14:45:16
Buscar String en AArchivo de texto!!! DB-ADO Varios 2 18-03-2005 16:02:32
Buscar palabra en una String diegofhernando Varios 10 23-05-2003 02:33:13


La franja horaria es GMT +2. Ahora son las 09:43:24.


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
Copyright 1996-2007 Club Delphi