'TG1,GK1-GK5,T1,r6,p7-p8'如何分解-------------重开贴讨论(300)

  • 主题发起人 主题发起人 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,KK8-12'---------------'-'这个符号是连接符号,要的是合理的算法 原贴地址为:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3978441 ------------------------------------------------------------------------------放飞兄的解法: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);就可以了 -------------------------希望还有好的解法(效率和代码简洁性方面)
 
本来是四种情况,我按类型分解了: 1.ss:='A1,2,3,4,5,A9'转化后为:‘A1,A2,A3,A4,A5,A9’ 2.ss:='A1-A3,4,5,A9'转化后为:‘A1,A2,A3,A4,A5,A9’ 3.SS:='A1-5,A9,U7' 转化后为:‘A1,A2,A3,A4,A5,A9,U7’ 4.SS:='A1-4,6,8' 转化后为:‘A1,A2,A3,A4,A6,A8'第二点用了许飞兄的解法,1,4我实现了.我是按不同类型来分开解的,现在有一个问题.我能不能不分开全部解出来.------------------------如果有好的解法就另开贴给分,希望大家参与.
 
很郁闷啊,名字都被人写错拿人钱财,与人消灾,呵呵,再送你一个解决方法//拆分:将字符串拆分成字母部分和数字部分,返回值:字母和数字的分界位置function SubStr(const Source: AnsiString; var S, E: AnsiString): Integer;begin Result := 0; repeat Inc(Result) until Source[Result] in ['0'..'9']; if Result = 1 then S := '' else S := Copy(Source, 1, Result - 1); E := Copy(Source, Result, MaxInt);end;//补全只带数字的字符串function FillStr(const S, D: AnsiString): AnsiString;var Q, N: AnsiString;begin if (Length(D) > 0) and (D[1] in ['0'..'9']) and (SubStr(S, Q, N) > 1) then Result := Q + D else Result := '';end;//扩展带横线的字符串function ExtStr(const S, E: AnsiString): AnsiString;var Q, M, N: AnsiString; I: Integer;begin SubStr(S, Q, M); SubStr(E, Q, N); Result := S; for I := StrToIntDef(M, 0) + 1 to StrToIntDef(N, 0) - 1 do Result := Result + ',' + Q + IntToStr(I); Result := Result + ',' + E;end;procedure TForm1.Button2Click(Sender: TObject);var sl: TStringList; S: AnsiString; I: Integer; Q: AnsiString;begin sl := TStringList.Create; try s := 'A1,2,3,4,5,A9-A17,GK3-5,6,8,10'; 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 := ','; sl.CommaText := sl.DelimitedText; //下面是处理只带数字部分的字符串 for I := 1 to sl.Count - 1 do begin Q := FillStr(sl[I - 1], sl); if Q <> '' then sl := Q; end; Memo1.Lines.AddStrings(sl); finally sl.Free end;end;下次记得一次把问题发全了,这三番五次的,跟微软似的,净打补丁了,哈哈
 
UP,不错。-------------这次处理比较复杂一点,晚一点另开两贴放分
 
请放飞先移步这里接分:一。http://www.delphibbs.com/delphibbs/dispq.asp?lid=3978572二。http://www.delphibbs.com/delphibbs/dispq.asp?lid=3978571
 
up一下,以前的分三种情况进行处理的代码一下就搞定,看来得好好看看TSTRINGLIST一下.这两天出差在外,但是每天都会上来看一下的,如果有好的回答,并且有新意,会不断开贴放分.
 
放飞,这贴除了你回外,只能自己UP了。
 
唉,本来delphi用的人就越来越少,再加上这个论坛正向菜市场转化,谁还愿意没事上这里溜达啊
 
呵呵,最后UP一下。
 
接受答案了.
 
后退
顶部