比如这样一组数据
2C 44 2C 01 09 AF 3C 44 11 0A 2C 44 D4 BB CD 3C 44 CA以'2C 44' 和 '3C 44'为关键字 分割后 包含2C 44 的里面不能有 3C 44 反之依然.
希望分割后的效果
2C 44 2C 01 09 AF
3C 44 11 0A
2C 44 D4 BB CD
3C 44 CA如果是1个分割符的我会做procedure ReplacePack(str: string);
var
  sl: TStringList;
  YourString: string;
  i:  integer;
  packstr: string;
  YourDelimiter: string;
begin
  YourString := str;
  YourDelimiter:='2C 44';
  sl := TStringList.Create;
  try
    sl.Text := StringReplace(YourString, YourDelimiter, #13#10, [rfReplaceAll]);
    for i := 0 to sl.Count - 1 do
    begin
      if Trim(sl.Strings[i]) <> '' then
      begin
        packstr := '2C 44 ' + Trim(sl.Strings[i]);
        Form1.mmo4.lines.Add(packstr);
      end;
    end;
  finally
    sl.Free;
  end;
end;
以'2C 44'分割出来是如下效果
2C 44 2C 01 09 AF 3C 44 11 0A
2C 44 D4 BB CD 3C 44 CA
可是我希望的
2C 44 2C 01 09 AF 
3C 44 11 0A
2C 44 D4 BB CD 
3C 44 CA
这个要如何实现?

解决方案 »

  1.   

    如果你的字符串都是这种HEX字符串的话,这样最省事:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s: string;
    begin
      s:= '2C 44 2C 01 09 AF 3C 44 11 0A 2C 44 D4 BB CD 3C 44 CA ';
      s := stringreplace(s, '2C 44', '","2C 44', [rfReplaceAll]);
      s := stringreplace(s, '3C 44', '","3C 44', [rfReplaceAll]);
      if pos('","', s)=1 then delete(s, 1, 3);
      s := '"'+s+'"';
      memo1.Lines.CommaText := s;
    end;
      

  2.   

    非常基本的字符串处理算法, 没有什么复杂或高级的地方:
    uses StrUtils;procedure SplitString(S, T1, T2: String;  var AList: TStringList);
    var
      i, j, a, b: Integer;
    begin
      j := 1;
      repeat
        i := j;
        a := PosEx(T1, S, i + 1);
        b := PosEx(T2, S, i + 1);
        if a = 0 then a := Length(S) + 1;
        if b = 0 then b := Length(S) + 1;
        if a < b then j := a else j := b;
        AList.Add(Copy(S, i, j - i));
      until j > Length(S);
    end;//调用示例
    procedure TForm1.Button1Click(Sender: TObject);
    var
      AList: TStringList;
      iLoop: Integer;
    begin
      AList := TStringList.Create;
      try
        SplitString('2C 44 2C 01 09 AF 3C 44 11 0A 2C 44 D4 BB CD 3C 44 CA', '2C 44', '3C 44', AList);
        for iLoop := 0 to AList.Count - 1 do
          ShowMessage (AList.Strings[iLoop]);
      finally
        AList.Free;
      end;
    end;
      

  3.   

    我把问题说的详细些,请各位给出答案,分不够可以再加我想做的功能是封包拆分,实际数据可能有几百行,分割符(包头标志)目前发现3个,分割出来的数据以后发送要用到想了半天麻烦的问题就出在StringReplace这个函数中了,这个函数分割后会把分割符去掉分割符号'/' 分割符号2 '+' 分割符号3 '-'
    几组数据做例
    /3
    分割效果3/3
    分割效果
    3
    /3+33/11
    分割效果
    +33
    /111/3+2+2-3/4/6
    分割效果需要
    1
    /3
    +2
    +2
    -3
    /4
    /6用StringReplace分割我已经写了几十行代码还是没能解决,这样的数据分割StringReplace是不是不适合?希望高手给个解决方法。
      

  4.   


    我靠 高人。问题这么简单就解决了?我的代码给你看看,估计得把你气坏了这还没解决,如果是10个八个分隔符我估计得写个几万行了哈哈!!!
    procedure ReplacePack(str: string);
    var
      sl, sl2:    TStringList;
      YourString: string;
      i, ii:      integer;
      packstr:    string;
      YourDelimiter, YourDelimiter2: string;
    begin
      YourString     := str;
      YourDelimiter  := '/';
      YourDelimiter2 := '+';
      if pos(YourDelimiter, yourstring) = 0 then // 如果不包含YourDelimiter
      begin
        //判断是否包含YourDelimiter2
        Form1.mmo2.Lines.Add(YourString + '不包含分割符/');
        if pos(YourDelimiter2, yourstring) = 0 then  // 如果不包含YourDelimiter2
        begin
          Form1.mmo2.Lines.Add(YourString + '不包含分割符+');
        end
        else//包含分割符号YourDelimiter2
        begin
          sl      := TStringList.Create;
          sl.Text := StringReplace(YourString, YourDelimiter2, #13#10, [rfReplaceAll]);
          for i := 0 to sl.Count - 1 do
          begin
            if Trim(sl.Strings[i]) <> '' then
            begin
              if leftstr(Trim(sl.Strings[i]), 1) = YourDelimiter2 then
              begin
                packstr := Trim(sl.Strings[i]);
              end
              else
              begin
                packstr := YourDelimiter2 + ' ' + Trim(sl.Strings[i]);
              end;
              Form1.mmo2.Lines.Add('Packed:' + packstr);
            end;
          end;
          sl.Free;
        end;  end
      else //如果包含   YourDelimiter
      begin
        sl      := TStringList.Create;
        sl.Text := StringReplace(YourString, YourDelimiter, #13#10, [rfReplaceAll]);
        for i := 0 to sl.Count - 1 do
        begin
          if Trim(sl.Strings[i]) <> '' then
          begin
            if leftstr(Trim(sl.Strings[i]), 1) = YourDelimiter2 then
            begin
              packstr := Trim(sl.Strings[i]);
            end
            else
            begin
              packstr := YourDelimiter + Trim(sl.Strings[i]);
            end;
            if pos('YourDelimiter2', packstr) = 0 then//是否包含YourDelimiter2          Form1.mmo2.Lines.Add('Packed:' + packstr)
            else
            begin
              sl2      := TStringList.Create;
              sl2.Text := StringReplace(sl.Strings[i], YourDelimiter2,
                #13#10, [rfReplaceAll]);
              for ii := 0 to sl2.Count - 1 do
              begin
                if Trim(sl2.Strings[ii]) <> '' then
                begin
                  if leftstr(Trim(sl2.Strings[ii]), 1) = YourDelimiter then
                  begin
                    packstr := Trim(sl.Strings[ii]);
                  end
                  else
                  begin
                    packstr := YourDelimiter2 + Trim(sl2.Strings[ii]);
                  end;
                  Form1.mmo2.Lines.Add('Packed:' + packstr);
                end;
              end;
            end;
          end;
        end;
        sl.Free;
      end;
    end;