delphi关于字符串的循环重复提取

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi关于字符串的循环重复提取相关的知识,希望对你有一定的参考价值。

因为这句命令字符是 (商品代码:103;商品数量:8;商品代码:101;商品数量:8 ;商品代码:104;商品数量:8;商品代码:105;商品数量:8;) 其中 ( 商品代码:105;商品数量:8) 是不固定的还可能出现的跟多 我要得到是后面的数字 怎么能用循环语句来识别得到 比如 第一组 (商品代码:105; 商品数量:8;)得到105和8 数字 第二组 (商品代码:106; 商品数量:7;)得到106和7 数字 第三组 (商品代码:107; 商品数量:9;)得到107和9 数字 依此类推

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
Private declarations
function SplitBE(ASource:String;ABegin,AEnd:String;ADest:TStrings):Integer;
function FenZu(ASource:String;Var ACode:String;var ANum:String):Integer;
public
Public declarations
end;

var
Form1: TForm1;

implementation

$R *.dfm

procedure TForm1.Button1Click(Sender: TObject);
const
c1='商品代码:103;商品数量:8;商品代码:101;商品数量:8 ;商品代码:104;商品数量:8;商品代码:105;商品数量:8;';
var
st1:TStringList;
i:Integer;
s1:String;
sCode,sNum:String;
begin
st1:=TStringList.Create;
try
SplitBE(c1,'商品代码',';商品代码',st1);
for i:= 0 to st1.Count- 1 do
begin
s1:=st1[i];
if s1[Length(s1)]=';' then//去掉最后的分号
Delete(s1,Length(s1),1);
FenZu(s1,sCode,sNum);
Memo1.Lines.Add('第 '+IntToStr(i+1)+' 组: '+sCode+' '+sNum);
end;
finally
st1.Free;
end;
end;

//把字符串中的商品代码、商品数量分解出来
function TForm1.FenZu(ASource: String; var ACode, ANum: String): Integer;
var
st1:TStringList;
i:Integer;
begin
st1:=TStringList.Create;
try
st1.Delimiter:=';';
st1.DelimitedText:=ASource;
if st1.Count>1 then
begin
i:=Pos('商品代码:',st1[0]);
ACode:=Copy(st1[0],Length('商品代码:')+i,Length(st1[0]));
i:=Pos('商品数量:',st1[1]);
ANum:=Copy(st1[1],Length('商品数量:')+i,Length(st1[1]));
Result:=1;
end
else
Result:=-1;
finally
st1.Free;
end;
end;

//根据字符串中的首、尾字符串,化分为不同的组。
function TForm1.SplitBE(ASource: String; ABegin,AEnd:String;ADest: TStrings): Integer;
var
s1:String;
iBegin,iEnd:Integer;
begin
iBegin:=Pos(ABegin,ASource);
iEnd:=Pos(AEnd,ASource);
if iBegin>0 then
begin
if iEnd>0 then
begin
s1:=Copy(ASource,iBegin,iEnd);
ADest.Add(s1);
end
else begin//如果到了结尾
s1:=Copy(ASource,iBegin,Length(ASource));
ADest.Add(s1);
end;
end;
//如果字符串与源字符串相同,则认为已经结束
if Length(ASource)=Length(s1) then
begin
Result:=ADest.Count;
end
else begin//否则,继续分析
ASource:=Copy(ASource,iEnd+1,Length(ASource));
Result:=SplitBE(ASource,ABegin,AEnd,ADest);
end;
end;

end.
参考技术A 测试代码如下,当然这不是最简单的方法,要简单的话可以用正则表达式,但是这是需要知道详细内容的

var
str:string;
sl: Tstringlist;
sli: Tstringlist;
i,c:integer;

begin
str:='商品代码:103;商品数量:8;商品代码:101;商品数量:8 ;商品代码:104;商品数量:8;商品代码:105;商品数量:8;';
sl := tstringlist.Create;
sli:= tstringlist.Create;
ExtractStrings([';'], [' '], pchar(str), sl);
if (sl.Count > 0) then
begin
i:=0;c:=0;
repeat
if trim(sl.Strings[i])<>'' then begin
inc(c);
showmessage('第'+inttostr(c)+'组为'+sl.Strings[i]+','+sl.Strings[i+1]);
sli.Clear;
ExtractStrings([':'], [' '], pchar(sl.Strings[i]), sli);
if sli.Count>=1 then showmessage('第'+inttostr(c)+'组代码'+sli.Strings[1]);
sli.Clear;
ExtractStrings([':'], [' '], pchar(sl.Strings[i+1]), sli);
if sli.Count>=1 then showmessage('第'+inttostr(c)+'组数量'+sli.Strings[1]);
end;
i:=i+2;
until i>sl.Count-2 ;
end;
end;
参考技术B 第一,程序运行之后你这些数据从何而来,是事先写在代码中吗?如果是事先写在代码中,那么你这毫无意义,因为这还不如事先把需要的数字列出来。
第二,你要这些数据干什么?说出来我们再想想其它办法。因为你的表述,实在让人看不懂。

以上是关于delphi关于字符串的循环重复提取的主要内容,如果未能解决你的问题,请参考以下文章

delphi关于stringgrid字符串转换的问题

Delphi For循环占用CPU100%释放问题

delphi怎么获取字符串之间多个字符内容?

关于delphi字符长度的问题?

delphi关于字符串的截取问题

如何在2个Delphi应用程序之间传递字符串[重复]