如何分割一个字符串?字符串以一个特定字符分成几部分,如何把他们分割到一个字符数组中(50分)

  • 主题发起人 主题发起人 qhliaok
  • 开始时间 开始时间
Q

qhliaok

Unregistered / Unconfirmed
GUEST, unregistred user!
rt

记得在PHP中有一个split 函数,把“dog,cat ,rice" 这个字符串分成
字符串数组[“dog","cat","rice"]

在delphi中有相同的函数吗?
 
自己写一个吧,用pos判断特定字符的位置,用copy 来处理。
 
唉,看来只有自己动手了,不过还有点麻烦的是,有些地方的空格为几个,需要一一判断。

大家快来,送分了,见者有份
 
在www.vclxx.com有大量的构件可以进行字符串分割,去找找吧。
其中有一个叫RegExpr的,功能与Perl中的正则表达式差不多,功能十分强大。
 
Procedure SplitTextIntoWords(Const S: String
var words: TStringlist);
Var
startpos, endpos: Integer;
Begin
Assert(Assigned( words ));
words.clear;
startpos := 1;
While startpos <= Length(S) Do Begin
// skip non-letters
While (startpos <= Length(S)) and not IsCharAlpha(S[startpos]) Do
Inc(startpos);
If startpos <= Length(S) Then Begin
// find next non-letter
endpos := startpos + 1;
While (endpos <= Length(S)) and IsCharAlpha(S[endpos]) Do
Inc(endpos);
words.add( Copy( S, startpos, endpos-startpos));
startpos := endpos+1;
End
{ If }
End
{ While }
End;
 
另法:
var
s:TStringList;
begin
s:=TStringList.Create
s.CommaText:='a,b,c,d';
showmessage(s.Strings[1]);
s.Free
end;
 
unit strdeal;

interface
uses
SysUtils;

Type
CharSet = Set Of Char;
sArray=array of string;
//返回一个字符串中的词的个数
Function WordCount(S:String;WordDelims:CharSet):{$IfNDef H+}Byte{$Else}Integer{$EndIf};
//返回一个字符串指定的序数的词
Function ExtractWord(N:{$IfNDef H+}Byte{$Else}Integer{$EndIf};S:String;WordDelims:CharSet):String;
//对给定字符串进行格式化
function formatstr(s:string;WD:charset):string;


implementation

Function WordCount;
Var
I:Word;
Begin
Result := 0;
I := 1;
While I <= Length(S) Do
Begin
While (I <= Length(S)) And (S In WordDelims) Do
Inc(I);
If I <= Length(S) Then
Inc(Result);
While (I <= Length(S)) And Not(S In WordDelims) Do
Inc(I);
End;
End;

Function ExtractWord;
Var
I,J:Word;
Count:Byte;
SLen:Integer;
Begin
Count := 0;
I := 1;
Result := '';
SLen := Length(S);
While I <= SLen Do Begin
While (I <= SLen) And (S In WordDelims) Do Inc(I);
If I <= SLen Then Inc(Count);
J := I;
While (J <= SLen) And Not(S[J] In WordDelims) Do Inc(J);
If Count = N Then Begin
Result := Copy(S,I,J-I);
Exit
End;
I := J;
End;
End;

function formatstr;
var
strlen,i:integer;
str:string;
spos:set of 1..255;
begin
s:=Trim(s);
strlen:=length(s);
spos:=[];
for i:=1 to strlen do
if (s in WD) then s:=';';
for i:=1 to strlen do
if (s=';')and(s[i-1]=';') then
spos:=spos+;
str:='';
for i:=1 to strlen do
if not(i in spos) then
str:=str+s;
result:=str;
end;

end.




 
我也有同样的问题
http://www.delphibbs.com/delphibbs/dispq.asp?lid=553693
不过要求在ASP下实现,谁能帮小弟一把,先谢了!
不要让我自己写一个组件哦!
 
qhliaok兄是对的,在ASP里可以用split函数,不知道为什么delphi里没这个函数呢
应该很常用的啊
 
如果是空格的话可以用trim判断啊,这个delphi里好象是有的吧
 
var
i:Integer;
SL:TStringList;
begin
SL:=TStringList.Create;
SL.CommaText:='dog,cat ,rice'
//CommaText 宝贝呀!
for i:=0 to SL.Count-1 do
Memo1.Lines.Add(SL);
end;

多简单! ^_^
 
假如分割符不是",",而是别的符号"||",那我还能用tstringlist对象呢?
如:
'dog,cat ,rice'改成:'dog||cat||rice'
 
r 整个串, r2 分隔符号, 取第 n 个符号前的串,从0开始计算

function sgetpart(r,r2:string;no:Integer):string;
var i,cc:integer;
temp:string;
begin
temp:='';
cc:=0;

for i:=1 to length(r) do
begin
if no=0 then if r=r2 then cc:=cc+1;
if cc=no then
begin
temp:=temp+r;
if no>0 then if r[i+1]=r2 then cc:=cc+1;
end;
if no>0 then if r=r2 then cc:=cc+1;
end;

sgetpart:=temp;
end;
 
我也有同样的问题。
我是需要把字符串“select table1.column1,table1.column2,table2.column1 from ……”
中的table1、table2和column1、column2等分别取出
 
不要太强求
 
自己写个吧, 不难,
这个都写不出来,就不要编程了
 
我不同意htw的看法,qhliaok未别写不出来,可能只是想求精
 
参考rxlib的StrUtils可以省事一些。例如
'dog||cat||rice'改成:'dog,cat ,rice'用
ReplaceStr。。。delphi不提供现成函数就
自己做一个吧,最贴进自己的需要。
 
short String2Array( char * p, char del, char * q, char * ptr[], short max )
{
if ( !p )
return -1;
if ( * p == 0 )
return 0;
short k = 0;
ptr[k] = q;
while ( * p )
{
*q = *p++;
if ( *q == del )
{
*q = 0;
if ( k++ < max )
ptr[k] = q + 1;
}
q ++;
}
*q = 0;
return k + 1;
}
 
int Split(AnsiString SourceStr,AnsiString * TargetStr,AnsiString SplitChar)
{
int i0=1,i1=1,Count=0;//i0表示子串的起始位置,i1表示結束位置,Count子串計數器
if(SourceStr.Length() >0)//如果有內容,加上一個分隔符
SourceStr+=SplitChar;
for (i1=1;i1<=SourceStr.Length();i1++)
if(SourceStr.SubString(i1,SplitChar.Length())==SplitChar)
{
TargetStr[Count]=SourceStr.SubString(i0,i1-i0);
i0=i1+SplitChar.Length();
i1=i0-1;
Count++;
};
return Count;
}
int Split(AnsiString SourceStr,TStringList *TargetStr,AnsiString SplitChar)
{
TargetStr->Clear();
int i0=1,i1=1,Count=0;//i0桶尨赽揹腔&amp;#63232;宎弇离ㄛi1桶尨賦旰弇离ㄛCount赽揹數杅&amp;#63239;
if(SourceStr.Length() >0)//&amp;#63537;彆衄囀&amp;#63527;ㄛ樓奻珨跺煦路睫
SourceStr+=SplitChar;
for (i1=1;i1<=SourceStr.Length();i1++)
if(SourceStr.SubString(i1,SplitChar.Length())==SplitChar)
{
TargetStr->Add(SourceStr.SubString(i0,i1-i0));
i0=i1+SplitChar.Length();
i1=i0-1;
Count++;
};
return Count;
}
/*///////////////ex:
TStringList* MyList = new TStringList();
Split("aaa,efg",MyList,",");
for( int i=0;i<MyList->Count;i++)
{
r->Lines->Add(MyList->Strings);
}
delete MyList;

*/

//---------------------------------------------------------------------------

__fastcall TFMain::TFMain(TComponent* Owner)
: TForm(Owner)
{
sFileNo=FileNo;
// sFileNo="1 2 3";
String stmp=sFileNo.Trim();
while(stmp.Pos(" ")!=0) //
{
String sChange=stmp;
sChange.Delete(stmp.Pos(" "),2);
sChange.Insert(" ",stmp.Pos(" "));
stmp=sChange;
}
AnsiString Par[10];

int i=0;
sFileNo=stmp;
while(stmp.Pos(AnsiString(" "))!=0)
{
stmp.Delete(stmp.Pos(AnsiString(" ")),1);
i++;
}
if(i>=2)
{
Type="1";
Split(sFileNo,Par," ");
systemCode=Par[0].Trim();//系統代碼
dataSource=Par[1].Trim()
//資料來源
docTxnNo=Par[2].Trim();//交換互動編號

}
else
{
Type="3";
Split(sFileNo,Par," ");
//Log_ROrg=Par[1].Trim();//
Seq=Par[0].Trim()
//公文序號
}
Added=false
//Count.dbf是否累加了

}
 
后退
顶部