Delphi中怎样将字符串按给定字符分隔(类似split函数的功能)
Delphi中怎样将字符串按给定字符分隔(类似split函数的功能)
今天偶尔要做的Delphi程序,其中涉及到了字符串处理,里面有一个功能类似于VB里的split()函数的功能,于是查了很久才查到些资料,现将这些资料整理一下,方便大家.
首先是一个网友自己编的函数.实现了和split()函数的功能.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type userarray=array of string;
type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private function split(s: string; dot: char): userarray; { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
uses StrUtils;
{$R *.dfm} //按所给字符将字符串分隔成数组 function TForm1.split(s:string;dot:char):userarray; var str:userarray; i,j:integer; begin i:=1; j:=0; SetLength(str, 255);
while Pos(dot, s) > 0 do //Pos返回子串在父串中第一次出现的位置. begin str[j]:=copy(s,i,pos(dot,s)-i); i:=pos(dot,s)+1; s[i-1] := chr(ord(dot)+1); j:=j+1; end; str[j]:=copy(s,i,strlen(pchar(s))-i+1); result:=str; end;
procedure TForm1.Button1Click(Sender: TObject); var ur:userarray; i:Integer; begin ur:=split(Edit1.Text,';'); for i :=0 to 255 do begin if length(ur[i])=0 then Exit; ShowMessage(ur[i]); end;
end;
end.
说明,测试这个代码时请在窗体上放一个文本编辑框和一个按钮,字符串是以';'号分割的;
第二种方法比较简单:
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。 常规的用法大家都知道,现在来讨论它的一些高级的用法。 先把要讨论的几个属性列出来: 1、CommaText 2、Delimiter & DelimitedText 3、Names & Values & ValueFromIndex 先看第一个:CommaText。怎么用呢?用代码说话: const constr :String = 'aaa,bbb,ccc,ddd'; var strs :TStrings; i :Integer; begin strs := TStringList.Create; strs.CommaText := constr; for i := 0 to Strs.Count-1 do ShowMessage(Strs[i]); end; 执行了这段代码后,可以看到ShowMessage显示出来的分别是:aaa bbb ccc ddd。 也就是说,strs.CommaText := constr这一句的作用,就是把一个字符串以','为分割符,分段添加到TStrings中。 那么如果不是以','来分割,又该怎么做呢?现在看第二个例子。使用Delimiter和DelimitedText。 const constr :String = 'aaa/bbb/ccc/ddd'; var strs :TStrings; i :Integer; begin strs := TStringList.Create; strs.Delimiter := '/'; strs.DelimitedText := constr; for i := 0 to Strs.Count-1 do ShowMessage(Strs[i]); end; 可以看到, 显示的效果和第一个例子是一模一样的。解释一下: Delimiter为分隔符,默认为:','。DelimitedText就是按Delimiter为分隔符的一个串,得到赋值后回把这个字符串按Delimiter的字符添加到TStrings中。 说到这里,有想起一个属性,QuoteChar。其默认值为:'"'(不包括单引号) 有何用呢?看例子: const constr :String = '"aaa"/"bbb"/"ccc"/"ddd"'; var strs :TStrings; i :Integer; begin strs := TStringList.Create; strs.Delimiter := '/'; strs.DelimitedText := constr; for i := 0 to Strs.Count-1 do ShowMessage(Strs[i]); end; 显示出来的仍然是aaa bbb ccc ddd。为什么不是:"aaa" "bbb" "ccc" "ddd"呢? 再来看一个例子: const constr :String = '|aaa|/|bbb|/|ccc|/|ddd|'; var strs :TStrings; i :Integer; begin strs := TStringList.Create; strs.Delimiter := '/'; strs.QuoteChar := '|'; strs.DelimitedText := constr; for i := 0 to Strs.Count-1 do ShowMessage(Strs[i]); end; 显示出来的又是aaa bbb ccc ddd。对比一下,应该不难明白吧?这个就不多说了,用得也不多。 但是还要多说一句,当Delimiter为:','而QuoteChar为:'"'时,DelimitedText和CommaText是同等的。 最后要说的三个是:Names & Values & ValueFromIndex。 看看下面的代码: const constr :String = '0=aaa,1=bbb,2=ccc,3=ddd'; var strs :TStrings; i :Integer; begin strs := TStringList.Create; strs.CommaText := constr; for i := 0 to strs.Count-1 do begin ShowMessage(strs.Names[i]); ShowMessage(strs.Values[strs.Names[i]]); ShowMessage(strs.ValueFromIndex[i]); end; end; 通过这个例子不难看出: 这个时候strs中的内容是: 0=aaa 1=bbb 2=ccc 3=ddd 而Names中则是: 0 1 2 3 在Values中则是: aaa bbb ccc ddd
我看了这个资料后按照上面的例子用了,但是发现","号做为分隔符时好用,自己用strs.Delimiter =';'更改不了分隔符,不知为什么,不过能直接用','号分隔已经完成了我想要的功能了,希望哪为高手能指点一下