'TG1,GK1-GK5,T1,r6,p7-p8'如何分解(10月12日晚上结贴)(200)

  • 主题发起人 主题发起人 luoyanqing119
  • 开始时间 开始时间
L

luoyanqing119

Unregistered / Unconfirmed
GUEST, unregistred user!
'TG1,GK1-GK5,T1,r6,p7-p8'如何分解为'TG1,GK1,GK2,GK3,GK4,GK5,T1,r6,p7,p8'---------------'-'这个符号是连接符号,要的是合理的算法
 
目前有比较烂的方法,如果有好的算法的话,另付400分
 
不见得非要 精妙的算法,除非性能要求高.否则容易理解,很快就能实现的就是好算法.
 
可能数据会很多,所以有最好的方法会提高程序的效率
 
用正则替换-
 
你说的好的方法,是指什么?是效率比较高的,还是看起来比较简洁的?如果是简洁的,那么先用StringReplace替换其中的 - 为 ,然后再利用 TStringList 类的 CommandText就可以将逗号分割的字符串变成一行一个的代码如下procedure TfrmUdpMain.btnTestClick(Sender: TObject);var sl: TStringList; s: AnsiString;begin sl := TStringList.Create; try s := 'TG1,GK1-GK5,T1,r6,p7-p8'; s := StringReplace(s, '-', ',', [rfReplaceAll]); sl.CommaText := s; Memo1.Lines.AddStrings(sl); finally sl.Free; end;end;如果是效率的,那就不好说了,没有最好,只有更好
 
to:放飞 谢谢你的回复,从代码简洁性能讲,是非常不错了。但是这个字符串不仅是要解出为字符,还要把有'A1-A3'这种串解析为:'A1,A2,A3'这种样式。 本贴继续,另开一贴先放分
 
请放飞先移步这里接分:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3978520
 
有好的回答都会先开贴放分
 
可能描述不是很清楚:我有字符串:‘A1,A4,A7,A9-A12,T2-T3,T7-T10’想转化为:‘A1,A4,A7,A9,A10,A11,A12,T2,A3,T7,T8,T9,T10’就是把有连接符“-”这种拆分开,如上面的拆法
 
噢,没有看清楚你的问题,抱歉。分不能白拿,我再给一个我的解决办法吧function ExtStr(s, e: AnsiString): AnsiString;var Q: AnsiString; I: Integer;begin I := 1; repeat Inc(I) until S in ['0'..'9']; Q := Copy(S, 1, I - 1); Result := S; for I := StrToIntDef(Copy(S, I, MaxInt), 0) + 1 to StrToIntDef(Copy(E, I, MaxInt), 0) - 1 do Result := Result + ',' + Q + IntToStr(I); Result := Result + ',' + E;end;procedure TForm1.Button2Click(Sender: TObject);var sl: TStringList; S: AnsiString; I: Integer;begin sl := TStringList.Create; try s := 'TG1,GK1-GK5,T1,r6,p7-p8'; sl.CommaText := s; sl.NameValueSeparator := '-'; for I := 0 to sl.Count - 1 do begin if sl.Names <> '' then sl := ExtStr(sl.Names, sl.ValueFromIndex); end; sl.QuoteChar := ' '; sl.Delimiter := ','; Memo1.Lines.Add(sl.DelimitedText) finally sl.Free end;end;这次得到的是你要的结果了Memo1的内容是一个连续的字符串,如果你想每个处理后的字符串占一行,那么你只需要将 sl.Delimiter := ',';下面的 Memo1.Lines.Add(sl.DelimitedText);替换为 sl.CommaText := sl.DelimitedText; Memo1.Lines.AddStrings(sl);就可以了
 
看到 Delphi 的 TStringList 的强大了吧,哈哈还能排序呢,甚至仅仅写个比较函数就可以按照自定义的方式排序。不过这里用不到。
 
我没有用TStringList,也搞出来了。不过太繁杂了。用了好多数组。用好tstringlist确实事半功倍。结贴先
 
没用过 TStringList 不算用过 Delphi 呵呵,我用 Delphi 的时候,几乎天天和他打交道。不过你结贴太快了,没准有人有更好的方法呢。
 
我会重开贴,再讨论的。
 
后退
顶部