Ver la Versión Completa : Buscar con comodines # ó * en una string
Sr.Scorpion
26-11-2008, 17:48:18
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
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.
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
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 [-] (http://www.clubdelphi.com/foros/#)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
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):
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...
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í:
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
vBulletin v3.6.8, Derechos ©2000-2013, Jelsoft Enterprises Ltd.