看过这样一个例子:
http://www.cnstu.net/3856/3856804.htm我想大家都会觉得简单,可是我由此觉得里面有一个很大的缺陷;
比如:
procedure TForm1.Button1Click(Sender: TObject);
var
  sList:TStringList;
  str:string;
  i:integer;
begin sList:=TStringList.Create;
 sList.DelimitedText:=',';
 str:='商品 1,商品 2';
 sList.Delimiter:=',';
 sList.DelimitedText:=Str;
 Memo1.Lines:=sList;
end;这样memo1的输出结果是:
商品
1
商品
2而我的本意是要输出 :
商品 1
商品 2除非把上面的
 str:='商品 1,商品 2'; 修改成   str:='"商品 1","商品 2"';
但是很多时候这里的str很复杂,而且比如做一个通讯报文分解程序,它传过来的str很复杂,我们人为的去增加"",即增加了复杂度,而且可能根本没有办法判断在哪里加""。真搞不懂,StringList的功能既然那么强大,为什么分割字符串的时候,一定把空格符认为是其中之一的默认分割符,不像用它都不行;晕。
如何利用StringList,实现随心所欲的分割;
指定用那个分割符就有哪了,其他乱七八糟的符号不要进来捣乱;

解决方案 »

  1.   

    老实说,我现在使用其它函数这个分割功能,而且也不仅仅限制于只是分割字符,也可以是字符串。比如:
      procedure SplitString(const Source, Ch: string; var sList: TStringList);
      var
        Temp: string;
        i: Integer;
      begin
        Temp := Source;
        i := pos(Ch, Source);
        while i <> 0 do
        begin
          sList.Add(Copy(Temp, 0, i - 1));
          Delete(Temp, 1, i + length(Ch) - 1);
          i := pos(Ch, Temp);
        end;
        sList.Add(Temp);
      end;但是有了问题:
    比如有一个条件字符串
    str:='(name like ''% and %'') and (code like ''%123 %'')';
    我现在想把它分割成两个字符 (name like ''% and %'') 和 code like ''%123 %'')用我上面函数带入: SplitString(str,' and ',sList  );
    但是这样得到的结果是:
    sList[0]:='(name like ''%'';
    sList[1]:='%'')';
    sList[2]:='(code like ''%123 %'')';我的原意是不考虑内部字符串的分割,比如 like '....',这里面的内容不应该参与分割;
    但是StringList是有这个功能的,我们可以把StringList.QuoteChar='''';就能解决这个问题;所有我想改造这个函数:
    procedure SplitString(const Source, Delimiter: string;QuoteChar:char;var sList: TStringList);
    beginend;
    这里面参数的意义分别是:
    Source   -- 要分割的字符串,比如  (a='123') and (b=' and ');
    Delimiter-- 分割的特征字符或字符串,比如: and  
    QuoteChar--    引用特征字字符,表示分割时,Quote里面的字符不参与分割;比如 '希望有朋友能够对该函数功能进行补充;
      

  2.   

    写了一个,没有上机测试,你看看
    procedure SplitString(const ASourceStr, ADelimiter: string;AQuoteChar:char;var sList: TStringList);function isQuoteStr(const Source, Delimiter: string;QuoteChar:char;Apos:integer):boolean;
    begin
      Result:=false;
      if (Apos > 1)  and (length(Source) >= Apos+length(Delimiter)) then
         Result:=(Source[Apos-1]=QuoteChar) and (Source[Apos+length(Delimiter)]=QuoteChar);
       end;end;function PosStart(AposStr,ASrcStr:String;Astart:integer=0):integer;
    var
      Apos:integer;
      Atemp:String;
    begin
      Result:=pos(AposStr,AsrcStr);
      if Astart > 0 then
        begin
            Atemp:=copy(ASrcStr,Astart,Maxint);
    Apos:=pos(AposStr,Atemp);
    if Apos > 0 then
       Result:=Astart+Apos-1;
        end;
    end;var
       i,j:integer;
       Temp: string;
    begin
        Temp := Source;
        j:=0;
        i:=PosStart(Delimiter,Source,j);
        //i := pos(Delimiter, Source);
        while i <> 0 do
        begin
          if not isQuoteStr(Temp,ADelimiter,AQuoteChar,i) then  
            begin
    sList.Add(Copy(Temp, 1, i - 1));
    Delete(Temp, 1, i + length(Ch) - 1);
    j:=0;
    end
    else
       j:=i+1;
          i :=PosStart(Delimiter, Temp);
        end;
        sList.Add(Temp);
    end;
      

  3.   

    少了个参数,补一下。procedure SplitString(const ASourceStr, ADelimiter: string;AQuoteChar:char;var sList: TStringList);function isQuoteStr(const Source, Delimiter: string;QuoteChar:char;Apos:integer):boolean;
    begin
      Result:=false;
      if (Apos > 1)  and (length(Source) >= Apos+length(Delimiter)) then
         Result:=(Source[Apos-1]=QuoteChar) and (Source[Apos+length(Delimiter)]=QuoteChar);
       end;end;function PosStart(AposStr,ASrcStr:String;Astart:integer=0):integer;
    var
      Apos:integer;
      Atemp:String;
    begin
      Result:=pos(AposStr,AsrcStr);
      if Astart > 0 then
        begin
            Atemp:=copy(ASrcStr,Astart,Maxint);
    Apos:=pos(AposStr,Atemp);
    if Apos > 0 then
       Result:=Astart+Apos-1;
        end;
    end;var
       i,j:integer;
       Temp: string;
    begin
        Temp := Source;
        j:=0;
        i:=PosStart(Delimiter,Source,j);
        //i := pos(Delimiter, Source);
        while i <> 0 do
        begin
          if not isQuoteStr(Temp,ADelimiter,AQuoteChar,i) then  
            begin
    sList.Add(Copy(Temp, 1, i - 1));
    Delete(Temp, 1, i + length(Ch) - 1);
    j:=0;
    end
    else
       j:=i+1;
          i :=PosStart(Delimiter, Temp,j);
        end;
        sList.Add(Temp);end;
      

  4.   

    多谢楼上朋友的帮忙,不过您里面的变量 Maxint 是从那里来的?
      

  5.   

    糊涂,Maxint是个system里的变量,非常感激楼上senfore(来而不往非礼也!) 朋友的热心帮助,这个函数真的不好编写啊,佩服您的智慧!!!