代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

有没有办法让tstringlist.commatext不用引号转义逗号?

  •  2
  • Mason Wheeler  · 技术社区  · 14 年前

    我正在做一些代码生成的工作,我需要做的事情之一是创建一个函数调用,其中一个参数是函数调用,如下所示:

    result := Func1(x, y, Func2(a, b, c));
    

    tstringlist.commatext对于生成参数列表非常有用,但是当我遍历树以构建外部函数调用时,最终得到的结果如下:

    result := Func1(x, y, "Func2(a, b, c)");
    

    它引用了第三个参数,因为它包含逗号,并且产生了无效的代码。但是我不能做一些简单的事情,比如用空字符串替换所有双引号,因为函数参数很可能是一个内有双引号的字符串。有没有办法让它不转义包含逗号的行?

    7 回复  |  直到 9 年前
        1
  •  1
  •   Francesca    14 年前
    1. 构建一个“不太可能的字符”数组:不可键入 阿西 , 艾斯 甚至是不可打印的# 129,141,143,144 .
    2. 确认你没有第一个不太可能出现在你的 StringList.CommaText . 或者不太可能移动到下一个,直到你得到一个在你的 字符串列表.commatext . (断言你找到了一个)
    3. 使用这个不太可能的字符作为 QuoteChar 对于你的字符串列表
    4. 得到 StringList.DelimitedText . 你会得到 夸特尔 围绕函数参数,如: result := Func1(x, y, †Func2(a, b, c)†);
    5. 更换不太可能的 夸特尔 (这里) 阿西 )通过空字符串…
        2
  •  4
  •   Rob Kennedy    14 年前

    你可以设定 QuoteChar 作为一个空间,您只需要在输出中获得一些额外的空间,这通常是可以的,因为生成的代码通常看起来不漂亮。不过,字符串文字会受到影响;它们会插入额外的空格,从而更改字符串的值。

    Free Pascal's TStrings class 使用 StrictDelimiter 控制在读取 DelimitedText 财产。当它的时候 ,引用根本不发生。也许德尔菲对待这个属性的方式是一样的。

        3
  •  1
  •   afrazier    14 年前

    编写自己的方法导出 TStringList 一个字符串。

    function MyStringListToString(const AStrings: TStrings): string;
    var
        i: Integer;
    begin
        Result := '';
        if AStrings.Count = 0 then
            Exit;
        Result := AStrings[0];
        for i := 1 to AStrings.Count - 1 do
            Result := Result + ',' + AStrings[i];
    end;
    

    太明显了吗?-)

    或者,如果您设置 StringList.QuoteChar #0 然后叫 StringList.DelimitedText ?

        4
  •  1
  •   r4w8173    14 年前

    我们编写了一个tstringlist的后代类,其中重新实现了delimitedtext属性。您可以从原始实现中复制大部分代码。

        5
  •  1
  •   Jim McKeeth    14 年前

    使用ansiextractQuotedStr的Unicode版本删除引号怎么样?

        6
  •  0
  •   Caleb Hattingh    14 年前
    var
    l列表:t列表;
    s,loutput:字符串;
    开始
    llist:=tstringlist.create;
    尝试
    添加(“x”);
    添加(“y”);
    l列表添加(‘func2(a,b,c)’);
    因为S在L第一个
    LoutPut:=LoutPut+S+',';
    设定长度(Loutput,长度(Loutput)-2);
    m1.addline('结果:=func1('+loutput+')');
    最后
    免费的;
    结束;
    结束;
    
        7
  •  0
  •   chillum    9 年前

    有同样的问题,下面是我如何解决的:

    s := Trim(StringList.Text)
    

    仅此而已;