比如这样一组数据
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
这个要如何实现?
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
这个要如何实现?
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;
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/3
分割效果
3
/3+33/11
分割效果
+33
/111/3+2+2-3/4/6
分割效果需要
1
/3
+2
+2
-3
/4
/6用StringReplace分割我已经写了几十行代码还是没能解决,这样的数据分割StringReplace是不是不适合?希望高手给个解决方法。
我靠 高人。问题这么简单就解决了?我的代码给你看看,估计得把你气坏了这还没解决,如果是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;