又是一个关于Memo的简单问题,需要大家帮忙. ( 积分: 100 )

  • 主题发起人 主题发起人 菜鸟黄
  • 开始时间 开始时间

菜鸟黄

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个对Memo中的数据进行模糊查找.
如:
Memo中数据为:
123456
123465
152364
254136
我要查找的数为:
1***6*
我要的得到的是:
123465
152364
查找的数为自由录入,可以是1个已知,也可以是多个已知.*代表未知数
 
var
s:string[6];
begin
for i:=0 to Memo1.line.count-1 do
begin
s:=Memo1.line;
if s[1]='1' and s[5]='6' then
{寻找成功}
end;
end;
 
我要查的数是不定的啊,
有可能是:1**2**,也有可能***123....等等
如果象楼主说的这样我还用来这里问吗?问这种问题我自己都不好意思啦.
 
procedure TForm4.Button5Click(Sender: TObject);
var
vFindStr, VTmpStr: String;
vStrings: TStrings;
vI, vCount, vJ, vK, vIdx: Integer;
procedure GetFindChar(AFindStr: String; AStrings: TStrings);
var
vI, vCount: Integer;
begin
vCount := length(AFindStr);
AStrings.Clear;
for vI := 1 to vCount do
begin
if AFindStr[vI] <> '*' then
AStrings.AddObject(AFindStr[vI], TObject(vI));
end;
end;
begin
vStrings := TStringList.Create;
vFindStr := Trim(Edit1.Text);
GetFindChar(vFindStr, vStrings);
vCount := Memo1.Lines.Count - 1;
Memo2.Lines.Clear;
for vI := 0 to vCount do
begin
VTmpStr := Memo1.Lines.Strings[vI];
vK := vStrings.Count - 1;
if vK < 0 then Continue;
if length(VTmpStr) < vStrings.Count then Continue;
for vJ := 0 to vK do
begin
vIdx := integer(vStrings.Objects[vJ]);
if vIdx > length(VTmpStr) then Break;
if (VTmpStr[vIdx] <> vStrings.Strings[vJ]) then Break;
if vJ = vK then Memo2.Lines.Add(VTmpStr);
end;
end;
vStrings.Free;
end;
 
说白了,有一个要查找的数据组:
***123
*456**
12****
1**2**
我要把满足这些条件的数都查出来.
 
来自:暗夜中独舞,
再改下
var
s1,s2:string;
i,L:integer;
begin
s2:='2**4**'; //例如
L:=length(s2);
for i:=0 to Memo1.line.count-1 do
begin
s1:=Memo1.line;
if length(s1)>=L then
begin
for i:=1 to L do
begin
if S2<>'*' and s1<>S2 then
begin
{寻找失败}
break;

end;
end;
end;


end;
end;
 
上网络上下一个正则表达式
 
以下代码将查出的结果存入memo2中,其中用于判断的函数为MyFinder


unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Memo2: TMemo;
function MyFinder(a,b:string):boolean;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function TForm1.MyFinder(a,b:string):boolean;
var
i:integer;

begin
result:=false;
for i:=1 to 6 do
begin
if b='*' then a:='*';
end;
if a=b then result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
memo2.Clear;
for i:=0 to memo1.Lines.Count-1 do
if myfinder(memo1.Lines.Strings,'1**4**') then
memo2.Lines.add(memo1.Lines.Strings);
end;





end.
 
大家可能还没有看懂意思:

说白了,有一个要查找的数据组:(数据组的个格式和个数都是不定的,有一点相同的就是都是6位数)
***123
*456**
12****
1**2**
我要把同时满足这些条件的数都查出来.
 
一個都查出來了.然後打個循环就可以了.
 
菜鸟黄 : 你试了我的吗> 我晕. 我的没有做任何限制啊! 就估计是汉字的话可能不行
 
to kk2000
用你的方法,我改良了一下,就可以实现了,谢谢
只有你的答案是最完整的,分就给大半你了.
 
接受答案了.
 
后退
顶部