【问题标题】:How to convert a string into array in delphi?delphi如何将字符串转换为数组?
【发布时间】:2010-10-22 14:24:43
【问题描述】:

在 php 和 java 中有explode 和 tokenizer 函数可以将字符串转换为不带标点符号的数组。是函数或delphi中的某种方式来完成这项工作。假设有一个大文件“This is, a large file with punctuations,, and space and numbers 123...”我们怎么得到 array "这是一个带有标点符号和空格以及数字 123 的大文件"

非常感谢您。

是的,我们只需要 [0..9],[a..z],[A..Z],就像正则表达式中的 \w。我们可以在 Tperlregex 中使用正则表达式来提取 \w 并将它们放入 Tstringlist 中,就好像 tstringlist 是一个数组一样,但它可能没有那么高效?谢谢。

【问题讨论】:

  • 你可能想观察一个字符串,本质上,一个字符数组。
  • 根据您的示例,您似乎只想从字符串中删除逗号。您能否更准确地编辑您的问题?
  • 谢谢 Andreas Rejbrand 和 Eugene Mayevski

标签: arrays string delphi character punctuation


【解决方案1】:

如果您需要一个接受字符串并返回字符串数组的函数,这些字符串是原始字符串的子字符串,由标点符号分隔,正如 Eugene 在我之前的回答中建议的那样,那么您可以这样做

type
  StringArray = array of string;
  IntegerArray = array of integer;
  TCharSet = set of char;

function split(const str: string; const delims: TCharSet): StringArray;
var
  SepPos: IntegerArray;
  i: Integer;
begin
  SetLength(SepPos, 1);
  SepPos[0] := 0;
  for i := 1 to length(str) do
    if str[i] in delims then
    begin
      SetLength(SepPos, length(SepPos) + 1);
      SepPos[high(SepPos)] := i;
    end;
  SetLength(SepPos, length(SepPos) + 1);
  SepPos[high(SepPos)] := length(str) + 1;
  SetLength(result, high(SepPos));
  for i := 0 to high(SepPos) -  1 do
    result[i] := Trim(Copy(str, SepPos[i] + 1, SepPos[i+1] - SepPos[i] - 1));
end;

例子:

const
  PUNCT = ['.', ',', ':', ';', '-', '!', '?'];

procedure TForm4.FormCreate(Sender: TObject);
var
  str: string;
begin
  for str in split('this, is, a! test!', PUNCT) do
    ListBox1.Items.Add(str)
end;

【讨论】:

    【解决方案2】:

    这取决于“字母数字字符”和“标点符号”的定义。

    例如,如果我们定义一组标点符号

    const
      PUNCT = ['.', ',', ':', ';', '-', '!', '?'];
    

    并考虑所有其他字母数字字符,然后您可以这样做

    function RemovePunctuation(const Str: string): string;
    var
      ActualLength: integer;
      i: Integer;
    const
      PUNCT = ['.', ',', ':', ';', '-', '!', '?'];
    begin
      SetLength(result, length(Str));
      ActualLength := 0;
      for i := 1 to length(Str) do
        if not (Str[i] in PUNCT) then
        begin
          inc(ActualLength);
          result[ActualLength] := Str[i];
        end;
      SetLength(result, ActualLength);
    end;
    

    此函数将字符串转换为字符串。如果你想把一个字符串变成一个字符数组,就这样做

    type
      CharArray = array of char;
    
    function RemovePunctuation(const Str: string): CharArray;
    var
      ActualLength: integer;
      i: Integer;
    const
      PUNCT = ['.', ',', ':', ';', '-', '!', '?'];
    begin
      SetLength(result, length(Str));
      ActualLength := 0;
      for i := 1 to length(Str) do
        if not (Str[i] in PUNCT) then
        begin
          result[ActualLength] := Str[i];
          inc(ActualLength);
        end;
      SetLength(result, ActualLength);
    end;
    

    (是的,在 Delphi 中,字符串使用从 1 开始的索引,而数组使用从 0 开始的索引。这是出于历史原因。)

    【讨论】:

    • 我相信 OP 需要一个解析器函数,它将接受一个字符串并创建一个子字符串数组,通过在标点符号上拆分来提取。
    • 啊,我明白了。 (但他/她为什么不这么说呢?)
    【解决方案3】:

    似乎没有像 Java 标记器那样的内置功能。很久以前,我们编写了一个类似于 Java 的标记器类,它成为 ElPack 组件套件(现在的 LMD ElPack)的一部分。这里有一些类似于 Java 的implementation of string tokenizer(刚刚在 Google 中找到了这个链接,所以我无法评论代码质量)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多