关于截取字符串问题(50分)

  • 主题发起人 主题发起人 wglifs
  • 开始时间 开始时间
W

wglifs

Unregistered / Unconfirmed
GUEST, unregistred user!
若有一字符:$12345$ABCDE$00099998882394932$laldfik23
我需要将$与$之间的字符串分别截取出来,应该怎样做?
 
procedure TForm1.Button1Click(Sender: TObject);
var
Count : Integer;//分离出字串个数
Tmpstrings : TStrings;//存放目的
Tmpstr : PChar;//待分割的字符串
begin
Tmpstr := '$12345$ABCDE$00099998882394932$laldfik23';
try
Tmpstrings := TStringList.Create;
Count := ExtractStrings(['$'],[' ','.'],Tmpstr,Tmpstrings);
Finally
Tmpstrings.Free;
end;
end;
 
to : dhszxh,还是没有将之间的字符串取出来啊?
其实字符串也可以写成 A$12345B$ABCDEC$00099998882394932D$laldfik23
需要将A$,B$,C$,D$后面的字符串截取出来,结果是:12345,ABCDE,00099998882394932,laldfik23
 
给两个函数:GetSubStrNum字串数,GetSubStr取字串,不过适用情况 12345$ABCDE$00099998882394932$laldfik23$
自己稍改下就可
Function GetSubStrNum(aString:String;SepChar:String):integer;
var i:Integer;
StrLen:Integer;
Num:Integer;
begin
StrLen:=Length(aString);
Num:=0;
For i:=1 to StrLen do
If Copy(aString,i,1) = SepChar then
Num:=Num+1;
result:=Num;
end;

Function GetSubStr(var aString:String;SepChar:String):String;
var Mystr:String;
StrLen:Integer;
SepCharPos:Integer;
begin
StrLen:=Length(aString);
SepCharPos:=Pos(SepChar,aString); //计算分割符在子串中的位置
MyStr:=Copy(aString,1,SepCharPos-1); //将分割符前所有字符放到mystr串中
Delete(aString,1,SepCharPos); //除去分割符和分割符前的子串
GetSubStr:=MyStr; //返回要的字串
end;
 
ExtractStrings(['$'],[' '],'$12345$ABCDE$00099998882394932$laldfik23', ListBox1.Items);
 
晕!你看你的问题是怎么提的,已经取出来放到Tmpstrings中难道你还不回去取吗?
 
var
I: Integer;
MyList:TStringList;
begin
MyList:=TStringList.Create;
try
MyList.Delimiter :='$';
MyList.DelimitedText :='$12345$ABCDE$00099998882394932$laldfik23';
for I :=0 to MyList.Count -1 do begin
memo1.Lines.Add(MyList.Strings);
end;
finally
MyList.Free;
end;
end;
 
不算复杂,先判断一下,字符串的第一个字符和最后一个字符是不是“$”,如果不是就加上,然后再用上面同志们提供的方法分解。
 
索性写段代码贴上来吧:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Split(const s:string;SepChar:char;var TTL:TstringList);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Split(const s:string;SepChar:char;var TTL:TstringList);
var
Temp:string;
begin
temp:=s;
if temp[1]<>SepChar then temp:=temp+SepChar;
if temp[length(temp)]<>SepChar then temp:=temp+SepChar;
TTL.Clear;
TTL.Delimiter:=SepChar;
TTL.DelimitedText:=temp;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TL:TstringList;
i:integer;
begin
TL:=TstringList.Create;
Split(edit1.Text,'$',TL);
listbox1.Items.Add(IntToStr(TL.Count));
for i:=0 to TL.Count-1 do
listbox1.Items.Add(tl.Strings);
FreeAndNil(TL);

end;

end.
 
最上面的提问的其实要改一下,真实的情况是这样的:
A$12345B$ABCDEC$00099998882394932D$laldfik23
需要将A$,B$,C$,D$后面的字符串截取出来(A$,B$...是唯一的,需要它后面的字符串),结果需要是:12345,ABCDE,00099998882394932,laldfik23
 
这个好像不是取字符字串的问题了吧。

如果每个字串的位数和长度是固定的话,应该不难,直接可以读取。
 
用我的方法完全可以作得到。

得到的字符分别列在 memo1 中了。

可能得到的结果是:
12345B,
ABCDEC,
00099998882394932D,
laldfik23

这个你只需要:
tmpstr:='12345B'
delete(tmpstr,length(tmpstr),1)

即可以。

有时,并没有什么完美的作的。。。

当这条路行不通的。。。走别一条路吧。

学会变通。。

就象,有人想用 SQL 的存储来返回一个数据表一样了。

变通一个,反而更简单。

就是用存储过程创建一个临时表,然后软件读出这个临时表即可。

不要认死理。

写软件,结果比过程重要(当然,对于普通软件来说)
 
procedure TForm1.Button1Click(Sender: TObject);
const
str='A$12345B$ABCDEC$00099998882394932D$laldfik23';
var
s:string;
i,xs,xe:integer;
begin
i:=2;
xs:=0;
xe:=0;
s:='';
while i<length(str) do
begin
if (str='$') and (str[i-1] in ['A','B','C','D']) then
begin
if xe-xs>0 then
begin
s:=copy(str,xs,xe-xs);
memo1.Lines.Add(s);
end;
xs:=i+1;
end
else
xe:=i;
inc(i);
end;
if xe-xs>0 then
begin
s:=copy(str,xs,xe-xs);
memo1.Lines.Add(s);
end;
end;
 
接受答案了.
 
后退
顶部