有什么方法可以让TStringList.CommaText无法用引号转义逗号?

时间:2010-06-10 17:57:15

标签: delphi code-generation escaping tstringlist

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

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

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

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

它引用了第三个参数,因为它包含逗号,并且产生了无效的代码。但是我不能像StringReplace那样简单地做一些带空字符串的双引号,因为函数参数很可能是一个带双引号的字符串。有没有办法让它不能逃避包含逗号的行?

7 个答案:

答案 0 :(得分:4)

您可以将QuoteChar设置为空格,并且您只需在输出中获得一些额外的空格,这通常是正常的,因为生成的代码通常不会看起来很漂亮。但是,字符串文字会受到影响;他们会插入额外的空格,改变字符串的值。

Free Pascal's TStrings class使用StrictDelimiter来控制在阅读DelimitedText属性时是否发生引用。当它是 true 时,根本不会发生引用。也许德尔福以同样的方式对待这个财产。

答案 1 :(得分:1)

  1. 构建一系列“不太可能的角色”:不可键控,如,甚至不可打印,如# 129,#141,#143 ,#144
  2. 确认您的StringList.CommaText中的第一个不太可能。或者移动到下一个不太可能,直到你的StringList.CommaText没有使用。 (断言你找到了一个)
  3. 将此不太可能的char用作StringList的QuoteChar
  4. 获取StringList.DelimitedText。您将获得QuoteChar围绕功能参数,例如:result := Func1(x, y, †Func2(a, b, c)†);
  5. 用空字符串替换不太可能的QuoteChar(此处)......

答案 2 :(得分:1)

编写您自己的方法,将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会发生什么?

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如何使用Unicode版本的AnsiExtractQuotedStr删除引号?

答案 5 :(得分:0)

var
  LList: TStringList;
  s, LOutput: string;
begin
  LList := TStringList.Create;
  try
    LList.Add('x');
    LList.Add('y');
    LList.Add('Func2(a, b, c)');
    for s in LList do
      LOutput := LOutput + s + ', ';
    SetLength(LOutput, Length(LOutput) - 2);
    m1.AddLine('result := Func1(' + LOutput + ')');
  finally
    LList.Free;
  end;
end;

答案 6 :(得分:0)

有同样的问题,我在这里修理它:

s := Trim(StringList.Text)

全部; - )