線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1984
推到 Plurk!
推到 Facebook!

在DELPHI中有分割字符串的函数吗?

尚未結案
bolidehi
一般會員


發表:11
回覆:11
積分:4
註冊:2004-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-21 15:49:18 IP:218.88.xxx.xxx 未訂閱
各位大侠: 我记得在PERL语言很容易的利用函数一个字符串分段的取出来,如:字符串为:028|5412468|888|BOLIDEHI|,能把它输入到STR的数组中,分别是: STR[0]:=028,STR[1]:=5412468,STR[2]:=888,STR[3]:=BOLIDEHI; 请问各位大侠,在DELPHI中这样的函数吗?它的机理是否还是有循环扫描字符串实现的. 非常感谢!
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-21 18:35:52 IP:61.218.xxx.xxx 未訂閱
需要自己寫一下    
a := TStringList.Create
a.Text := StringReplace( '028|5412468|888|BOLIDEHI|','|',#13#10,[rfReplaceAll] );    for i := 1 to a.count do
  showmessage( a.Strings[i-1] );
 
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-21 21:21:19 IP:61.229.xxx.xxx 未訂閱
利用TStringList物件可以輕易做到,如下:
procedure TForm1.Button1Click(Sender: TObject);
const
  s = '028|5412468|888|BOLIDEHI';
var
  ss:TStringList;
begin
  ss:=TStringList.Create;
  try
    ss.Delimiter:='|'; //設定分隔的字元
    ss.DelimitedText:=s;
    Memo1.Lines.Assign(ss);
  finally
    ss.Free;
  end;
end;
不過會有個bug,就是當s為'028|54 12468|888|BOLIDEHI'時,原本的"54 12468"會被拆成兩個
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-21 22:57:56 IP:211.76.xxx.xxx 未訂閱
bolidehi 您好 : 您是要問 Regular Expressions 還是類似 C 的 strtok 功能?? 免錢的請參考 :http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41594 [只是 API ,沒有包成 Class] 另外一個包裝精美,功能強大,但要 $$ 的請參考 [包成 Class] : http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41602 如果是要類似 strtok 的功能 .. 陳寬達先生的 "Delphi 深度歷險"一書有他的自製函式庫... 在 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=45270 中我偷用了 GetToken (XShadow.pas) .. 您可以參考看看 .. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
bolidehi
一般會員


發表:11
回覆:11
積分:4
註冊:2004-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-26 09:19:09 IP:218.88.xxx.xxx 未訂閱
本人经查找,EXTRACTSTRINGS()这个函数有此功能;
qjzh
一般會員


發表:0
回覆:1
積分:0
註冊:2003-07-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-27 14:29:32 IP:218.18.xxx.xxx 未訂閱
用ExtractStrings函数,无论你有多少个'|'都能以它来分割 procedure TForm1.Button1Click(Sender: TObject); var strs:tstringlist; i:integer; begin strs:=tstringlist.create; ExtractStrings(['|'],[],'1|abcde|fgggg',strs); for i:=0 to strs.Count -1 do ShowMessage(strs.Strings[i]); strs.free; end;
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-27 23:29:51 IP:220.137.xxx.xxx 未訂閱
extractstrings()感覺也蠻有彈性的 但若切割字串含有空字串似乎沒支援..要另處理 感覺一般用途 自己寫一個比較方便.. 但若考慮字串內含#13#10 可能程式要多作處理 先轉換成其他代碼..    
function mySplit(cSrcStr,cDelimiter:string):TStrings;
begin
  result:=TStringList.Create;
  result.Text:=StringReplace(cSrcStr,cDelimiter,#13#10,[rfReplaceAll]);
end;
seedbcc
高階會員


發表:232
回覆:272
積分:105
註冊:2003-12-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-28 15:17:58 IP:221.169.xxx.xxx 未訂閱
看看 這是不是你要的
Function GetCutbStr(Str:String ; Xs,Xe:Word):String; 
//求字串截取後新字串
//Str:舊字串
//Xs:截取舊字串起始位置
//Xe:截取舊字串長度
var S:String;
begin
  Result:=Str;
  if (Length(Str)=0) or ((Xe Xs-1)>Length(Str)) then Exit;
  if (Xs<1) then Exit;
  S:='';
  if Xs>1 then S:=Copy(Str,1,Xs-1);
  S:=S Copy(Str,Xs Xe,Length(Str)-(Xs Xe-1));
  Result:=S;
  //DEMO: GetCutbStr('0123456789',3,5):='01789';
  //CvStr:=GetCutbStr(CvStr,Pos('F=' Query3fav_itm.Text,CvStr),Length('F=' Query3fav_itm.Text) 1);
end;
thatiswhyyougo2004
一般會員


發表:2
回覆:1
積分:0
註冊:2004-05-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-28 17:58:43 IP:221.216.xxx.xxx 未訂閱
我试验一下,简体中文能发言吗:)
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-29 11:06:07 IP:61.56.xxx.xxx 未訂閱
我也來湊個熱鬧吧...
procedure SplitStr(AStr:string; Separator:TSysCharSet; var Strings:TStrings);
var a,b:integer;
begin
  a:=1;
  Strings.Clear;
  AStr:=AStr '_';
  for b:=1 to Length(AStr) do
    if (AStr[b] in Separator) or (b=Length(AStr)) then
      begin
        if b-a>1 then Strings.Add(Copy(AStr,a,b-a));
        a:=b 1;
      end;
end;
系統時間:2024-05-04 5:01:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!