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

判斷取出有效字串

尚未結案
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-06 14:15:02 IP:219.130.xxx.xxx 未訂閱
大家好!    比如有一個字串str:=27 02 01 F8 25 02 01 F8 23 02 01 F8 21 02 01 F8 2C 02 01 F8...   請問如何判斷首尾字串(分別為01,02),取出中間有效字串如'F8 25','F8 23'... 並將取出的字串加至一個StringList的變數中. 不知如何去做,請各位幫忙指點一下.謝謝!
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-06 14:54:19 IP:222.248.xxx.xxx 未訂閱
procedure GetSubStr(str: string; var strls: TStrings);
var
  TempStrLs: TStrings;
  Temp: string;
  i: integer;
begin
  StrLs.Clear;
  Temp := Str;
  while Str <> '' do
  begin
    StrLs.Add(Copy(Temp, 1, 2);
    Delete(Temp, 1, 3);
  end;
  if StrLs.Count < 6 then
  begin
    StrLs.Clear;
    StrLs.Add('字串長度不够。');
    exit;
  end;
  TempStrLs := TStringList.Create;
  for i := 0 to StrLs.Count - 1 do
  begin
    if (StrLs.Strings[i] = '02') and (StrLs.Strings[i   1] = '01') and (StrLs.Strings[i   4] = '02') and (StrLs.Strings[i   5] = '01') then
    TempStrLs.add(StrLs.Strings[i   2]);
    TempStrLs.add(StrLs.Strings[i   3]);
  end;
  StrLs.Clear;
  StrLs.AddStrings(TempStrLs);
  TempStrLs.Free;
end;    
---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-06 17:16:37 IP:61.64.xxx.xxx 未訂閱
這問題會不會太單?
var
  i,k: Integer;
  Str,StrMark,NewStr: String;
  StrList: StringList;
~~~ 中略 ~~
 StrMark := '02 01';
 k := Length(StrMark);
 i := Pos(StrMark,Str);
 if i = 1 then
 begin
  Str := Copy(Str,i k,Length(Str));
  i := Pos(StrMark,Str);
 end;
 whilt i > 0 then
 begin      NewStr := Copy(Str,1,i-1);
  Str := Copy(Str,i k,Length(Str));
  StrList.Add(NewStr);
  i := Pos(StrMark,Str)     end;
 if Length(Str) > 0 then StrList.Add(Str);
發表人 - syntax 於 2005/08/06 17:20:31
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-08 11:31:37 IP:219.132.xxx.xxx 未訂閱
感謝h@visli,syntax兩位大大的解答! to:h@visli大大: 有參考試過h@visli大大的方法,會出現錯誤信息:out of memory to:syntax大大: 可以通過,但是這樣判斷(StrMark := '02 01';)會有一個問題:當str字串如果是:01 開頭(如: str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02';,則取得的第一組個有效數據不對,(結果為:01 12 B5),其他組數據沒有問題,不知有何改善方法?謝謝!
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-08 12:33:42 IP:59.104.xxx.xxx 未訂閱
var
  Str,MarkStr,S:String;
  i            :Integer;
begin
  MarkStr:='02 01';
  Str    :='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02';
  Delete(Str,1,Pos(MarkStr,Str) Length(MarkStr));//<-消掉1~MarkStr間的無效字串
  repeat
    i:=Pos(MarkStr,Str);
    List.Add(Copy(Str,1,i-1));
    Delete(Str,1,i Length(MarkStr));
  until(i<=0);
end;
發表人 - jest0024 於 2005/08/08 12:36:03
jeff377
初階會員


發表:9
回覆:60
積分:33
註冊:2004-08-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-08 12:37:53 IP:61.66.xxx.xxx 未訂閱
 
procedure GetSubStr(Text: String; List: TStrings);
var
  P1,P2: Integer;
  sTemp: String;
  sValue: String;
begin
  List.Clear;
  sTemp:= Text;
  P1:= Pos('01',sTemp);
  if P1<=0 then exit;
  sTemp:= Copy(sTemp,P1 2,Length(sTemp) 1);
  sTemp:= Trim(sTemp);
  While P1>0 do
  begin
    P2:= Pos('02',sTemp);
    if P2<=0 then exit;
    sValue:= Trim(Copy(sTemp,1,P2-1));
    List.Add(sValue);
    sTemp:= Copy(sTemp,P2 2,Length(sTemp) 1);
    P1:= Pos('01',sTemp);
    if P1<=0 then exit;
    sTemp:= Copy(sTemp,P1 2,Length(sTemp) 1);
  end;
end;
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-08 12:57:51 IP:210.243.xxx.xxx 未訂閱
來個偷吃步.... sList.Text:= StringReplace(Str1, '02', #13#10, [rfReplaceAll]); 這樣資料就通通存到stringlist中了... 然後你再判斷字首是不是01就好... 當然這個方法很快,只是風險會有一點,就是當你資料有02沒01時會有問題 其它方法當然也有這個問題 所以要再加判斷... 試試
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-08 13:47:16 IP:220.130.xxx.xxx 未訂閱
 
function TForm1.SplitString(S, Delimiter: string): TStringList;
begin
  Result := TStringList.Create;
  Result.Text := StringReplace(S, Delimiter, #13, [rfReplaceAll]);
end;    procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
  I, J: Integer;
  L: TStringList;
begin
  S := #$27#$02#$01#$F8#$25#$02#$01#$F8#$23#$02#$01#$F8#$21#$02#$01#$F8#$2C#$02#$01;
  L := SplitString(S, #$02#$01);
  try
    for I := 0 to L.Count-1 do
    begin
      S := '';
      for J := 1 to Length(L[I]) do
              S := S   Format('%.2x', [Ord(L[I][J])]);
      ListBox1.Items.Add(S);
    end;
  finally
    L.Free;
  end;
end;    
發表人 - jow 於 2005/08/08 13:49:43
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-08 14:17:15 IP:59.36.xxx.xxx 未訂閱
真的很感謝h@visli,syntax,jest0024,jeff377,jimmy_wei,jow各位大大的關注與解答。讓我受益不少。我參考jeff377大大說的方法來做。問題已解決!謝謝!謝謝大家!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-10 02:25:50 IP:61.64.xxx.xxx 未訂閱
引言: 感謝h@visli,syntax兩位大大的解答! to:h@visli大大: 有參考試過h@visli大大的方法,會出現錯誤信息:out of memory to:syntax大大: 可以通過,但是這樣判斷(StrMark := '02 01';)會有一個問題:當str字串如果是:01 開頭(如: str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02';,則取得的第一組個有效數據不對,(結果為:01 12 B5),其他組數據沒有問題,不知有何改善方法?謝謝!
妳的問題很奇怪 既然妳設定 "01 02" 為關鍵字 當然 只有 01 沒有 02 時,就是一般資料啊 不然妳就只要用 01 當關鍵字就好了,幹嘛用 "01 02" ?
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-10 08:55:07 IP:218.16.xxx.xxx 未訂閱
syntax大大,非常感謝! 因為是要判斷首'01',尾'02'同時符合條件資料. 而如果我們一開始就判斷StrMark := '02 01';那么如果是'01'開頭的資料就會第一組資料不對了. 比如說的:str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02' 後來我加上判斷
 if leftstr(str,2) = '01' then
    str := '02 '  str;
可以了.非常感謝!!!!!這么多大大關心回答我的問題.一分實在是不夠分,還請見應諒啦!感恩!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-10 16:42:46 IP:61.64.xxx.xxx 未訂閱
引言: syntax大大,非常感謝! 因為是要判斷首'01',尾'02'同時符合條件資料. 而如果我們一開始就判斷StrMark := '02 01';那么如果是'01'開頭的資料就會第一組資料不對了. 比如說的:str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02' 後來我加上判斷
 if leftstr(str,2) = '01' then
    str := '02 '  str;
可以了.非常感謝!!!!!這么多大大關心回答我的問題.一分實在是不夠分,還請見應諒啦!感恩! < face="Verdana, Arial, Helvetica"> 這就是你的資料結構在設計上的問題了 這樣的設計,必須檢查 「首」 與 「尾」 有必要嗎? 同時你使用了一般符號來作為分隔用,這樣符號可以用來當資料的範圍就少了兩個,也就是說你的資料中不可以有 "01" 或 "02" 要是哪天你忘記,產生中的資料有 "01" 或 "02",而去被當成分隔符號而不是資料符號時,你的程式就會大亂 可以的話,建議你直接用 TStringList 的特性,可以少寫很多程式,直接用 Delphi 幫你設計好的,這本來就是 Delphi 的用意 而分隔符號就會是 #13#10,當然 TStringList 也有自己指定分隔符號的能力,所以是很方便的元件 甚至可以使用 Name = Value 的方式 這樣可以大大提升你的效率與簡化你的時間
系統時間:2024-04-26 4:20:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!