【问题标题】:Add more than 1 delimiter in TStringList在 TStringList 中添加超过 1 个分隔符
【发布时间】:2012-02-27 02:31:36
【问题描述】:

这是我的分隔文本:$HEHDT,10.17,T*28$HEHDT,10.18,T*2A 等等...

逗号是我的句子分隔符。但是,我也想使用星号作为分隔符。

我想要实现的输出是:

$HEHDT 10.17 吨 28 $HEHDT 10.18 吨 2A

如何在 delphi 中指定超过 1 个句子分隔符?这是我到目前为止的代码。

var
  MyStringList: TStringList;
  i: Integer;
begin
  MyStringList:= TStringList.Create;

  MyStringList.Delimiter := ','
  MyStringList.DelimitedText := '$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A' +#13#10;

  for i= 0 to MyStringList.Count-1 do
    ShowMessage(MyStringList[i]);

  MyStringList.Free;
end;

对于上面的代码,它只以逗号作为分隔符。如何包含 2 个分隔符,逗号和星号?

提前非常感谢! =)

【问题讨论】:

  • 请问你的 Delphi 版本是什么?
  • 你最好使用 ExtractStrings 来获得更强大的字符串拆分
  • @user539484:只要他有合适的 Delphi 版本。
  • @menjaraz,为什么? ExtractStrings 可以追溯到拉美西斯时代。
  • @user539484:你是对的。我被误导了,我想到了 StrUtils 中引入的 SplitString。

标签: delphi delimiter tstringlist


【解决方案1】:

Delphi stringlist 非常好,可以让您“免费”解析一个分隔符上的文本。如果你想要一个 set 的分隔符 - 那么你需要使用 StrUtils.SplitString:

http://docwiki.embarcadero.com/VCL/en/StrUtils.SplitString

【讨论】:

    【解决方案2】:

    您可以使用 ReplaceString,将所有星号更改为逗号。将您的分配行更改为:

     String.DelimitedText := ReplaceString('$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A', '*',
                             ',', [rfReplaceAll]);
    

    你上面的代码应该可以工作了。

    注意:我相信 DelimitedText 属性也将空格视为分隔符。因此,如果您的字符串有空格,您的代码可能无法按照您预期的方式运行...

    【讨论】:

    • 如果您将 StrictDelimeter 设置为 True,它不会给您带来任何带空格的烦恼。
    【解决方案3】:
    1. 简短的回答是否定的。
    2. 但您可以使用自定义 TStringList。

    TStringList 接受一个且只有一个分隔符。

    Embarcadero RAD Studio 帮助摘录:

    Classes.TStrings.DelimitedText

    说明

    将 TStrings 对象中的所有字符串表示为 单个 分隔字符串。

    使用 DelimitedText 获取或设置 TStrings 对象中的所有字符串 在单个字符串中,由 character 指定 分隔符属性。


    为了能够使用多个分隔符,您应该通过从 TStringList 类派生一个新类来“扩展”它的功能。

    您可以找到here TStringListEx 类的示例源代码,该类具有类似的行为,您可以轻松地适应您的要求。

    摘录

    TStringListEx = class(TStringList)
    private
      FDelimiter: String;
      function GetDelimitedText: String;
      procedure SetDelimitedText(const Value: String);
    published
      property Delimiter: String read FDelimiter write FDelimiter;
      property DelimitedText: String read GetDelimitedText write SetDelimitedText;
    end;
    

    解决方法包括预处理字符串以设置为 TStringList.DelimitedText 属性和其余的分隔符(第一个被设置为 TStringList.Delimeter 属性)可以实现您的目标,除了解决方案指出在 paulsm4Robert Frank 的帖子中,您还可以使用 Regular Expression

    【讨论】:

      【解决方案4】:

      您可以使用两个字符串列表,一个使用逗号,另一个使用星号作为分隔符。然后将第一个的文本属性分配给第二个的分隔文本属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多