PDA

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

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.


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...

Caro
28-11-2008, 15:55:07
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