RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1146745
Accepted
Артем Ливинов
Артем Ливинов
Asked:2020-06-29 03:07:46 +0000 UTC2020-06-29 03:07:46 +0000 UTC 2020-06-29 03:07:46 +0000 UTC

在旧的 Delphi 7 中是否有类似于 php explode 的函数来处理字符串并通过分隔符将它们拆分为数组?

  • 772

我承诺在 Delphi 7 上纠正一个项目,在那里我必须拆分来自网络的大量数据,以便将它们插入正确的位置。

当然,我已经做了一切copy pos,但事实证明,在项目中它占用了太多的代码空间。我的意思是我copy也pos曾经在一行中找到必要的片段并将它们复制到数组或所需的组件,一般来说,复制到哪里......

真的不是在第 7 个 Delphi 中像 php-shnogo 这样的功能爆炸了吗?这会将我编写的代码减少 2 倍......也许有什么?我希望代码更具可读性且尺寸更小。

строки
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Alex R.
    2020-06-29T03:50:07Z2020-06-29T03:50:07Z

    有几个选项可用于访问分隔字符串的各个元素。

    1. SplitString转换为字符串数组的函数
    uses
      SysUtils, StrUtils, Types;
    
    var
      vList: TStringDynArray;
      i: Integer;
    begin
      vList := SplitString('Один; Два; Три', ';');
    
      for i := Low(vList) to High(vList) do
        WriteLn(Trim(vList[i]));
    
      ReadLn;
    end.
    
    1. 表示为字符串列表的DelimitedText类属性TStrings
    uses
      SysUtils, StrUtils, Classes;
    
    var
      vList: TStrings;
      i: Integer;
    begin
      vList := TStringList.Create;
      try
        vList.Delimiter       := ';';
        //vList.StrictDelimiter := True; //вроде с D2006
        vList.DelimitedText   := 'Один; Два; Три';
    
        for i := 0 to vList.Count - 1 do
          WriteLn(Trim(vList[i]));
      finally
        vList.Free;
      end;
    
      ReadLn;
    end.
    
    • 3
  2. Best Answer
    Евгений Николаев
    2020-06-29T05:47:59Z2020-06-29T05:47:59Z

    根据链接-http://blog.ivru.net/ ?id=195有一个自写的函数explode,以此类推类似于php。

    procedure myExplode(sourceText: string; separator: string; var outMass: array of string; var outMassLen: integer);
    var position,separatorLen: integer;
    begin
      outMassLen:= 0;//Количеству элементов выходного массива присвоим 0(в любом случаи выходной массив будет содержать как минимум элемент с индексом 0, такой результат будет если разделитель не будет найден в исходном тексте вовсе)
      separatorLen:= Length(separator);//Определяем длину разделителя
      Repeat//Цикл с постусловием
        position:= Pos(separator,sourceText);//Пробуем найти позицию вхождения разделителя в исходный текст(или очередной фрагмент исходного текста)
        if (position <> 0) then//Если найдена позиция вхождения разделителя в исходный текст(или очередной фрагмент исходного текста)
        begin
          outMass[outMassLen]:= Copy(sourceText,1,position-1);//Добавим в массив участно
          sourceText:= Copy(sourceText,position+separatorLen,(Length(sourceText)-position-separatorLen+1));//Теперь исходный текст будет начинаться с следующего фрагмента
          Inc(outMassLen);//Увеличиваем значение на 1
        end;
      Until (position = 0);//Здесь условие выхода из цикла а не продолжения
      outMass[outMassLen]:= sourceText;//Добавим в массив последний участок или весь исходный текст если разделитель не был найден вовсе
    end;
    

    仅当您突然使用它时,请注意其中元素数量的计算方式不同。

    该函数有 4 个参数:

    myExplode(sourceText:字符串;分隔符:字符串;var outMass:字符串数组;var outMassLen:整数)

    选项:

    1. 这是您要拆分的原始字符串
    2. 字符串分隔符(您拆分的依据)
    3. 使用此参数,您传递一个预先准备好的变量,结果数组将被写入其中
    4. 也是一个将返回结果的变量——数组中有多少个元素,或者更确切地说,它的索引是最后一个,你还需要在整数类型之前创建这个变量

    也就是说,我再次注意 php 中的差异,例如,explode("a|b","|") 将返回一个索引为 0 和 1 的数组,并且从数组中计数将显示 2。当使用我在delphi中指定的函数您还将获得具有相同索引的相同数组,只有outMassLen将包含值1而不是2(即outMass数组的结束元素的索引,您将其传递给指定的函数Delphi 作为第三个参数)。

    也就是说,根据你的问题:类似于PHP for Delphi的explode过程已经写好了:)如果你愿意,就用它,如果你愿意,写你自己的过程或函数。如果您不想放置和使用建议的爆炸程序,那么 Alex R. 也回答了您。

    • 2

相关问题

  • 为什么这段代码会这样工作?

  • 无法将数字转换为字符串汇编器 NASM

  • Shell 查找和运行命令、删除扩展、操作 {}

  • 如何使 :hover 在表格中除表头之外的所有 tr 行的背景上工作

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5