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

因为这句命令字符是(商品代码:103;商品数量:8;商品代码:101;商品数量:8;商品代码:104;商品数量:8;商品代码:105;商品数量:8;)其中(商品代码:10... 因为这句命令字符是 (商品代码:103;商品数量:8;商品代码:101;商品数量:8 ;商品代码:104;商品数量:8;商品代码:105;商品数量:8;) 其中 ( 商品代码:105;商品数量:8) 是不固定的还可能出现的跟多 我要得到是后面的数字 怎么能用循环语句来识别得到 比如 第一组 (商品代码:105; 商品数量:8;)得到105和8 数字 第二组 (商品代码:106; 商品数量:7;)得到106和7 数字 第三组 (商品代码:107; 商品数量:9;)得到107和9 数字 依此类推 展开
 我来答
景茹炜L8
推荐于2018-04-12 · TA获得超过481个赞
知道小有建树答主
回答量:617
采纳率:0%
帮助的人:379万
展开全部
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.
syht2000
高粉答主

2012-09-30 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部
测试代码如下,当然这不是最简单的方法,要简单的话可以用正则表达式,但是这是需要知道详细内容的

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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liu55721
2012-09-30 · TA获得超过922个赞
知道大有可为答主
回答量:1861
采纳率:100%
帮助的人:877万
展开全部
第一,程序运行之后你这些数据从何而来,是事先写在代码中吗?如果是事先写在代码中,那么你这毫无意义,因为这还不如事先把需要的数字列出来。
第二,你要这些数据干什么?说出来我们再想想其它办法。因为你的表述,实在让人看不懂。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式