Как преобразовать строку в массив в Delphi? - PullRequest
0 голосов
/ 22 октября 2010

В php и java есть функция explode и tokenizer для преобразования строки в массив без знаков препинания.Являются ли функции или каким-то образом в Delphi, чтобы сделать работу.Предположим, что есть большой файл «Это большой файл с пунктуацией, с пробелами и числами 123 ...» Как мы можем получить массив?* Заранее большое спасибо.

Да, нам нужны только [0..9], [a..z], [A..Z], как \ w в регулярном выражении.Можем ли мы использовать регулярные выражения в Tperlregex для извлечения \ w и помещения их в Tstringlist, как если бы tstringlist был массивом, но это может быть не так эффективно?Спасибо.

Ответы [ 3 ]

4 голосов
/ 22 октября 2010

Если вам нужна функция, которая принимает строку и возвращает массив строк, эти строки являются подстроками оригинала, разделенными пунктуацией, как предложил Евгений в моем предыдущем ответе, тогда вы можете сделать

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 голосов
/ 22 октября 2010

Это зависит от определения «буквенно-цифрового символа» и «символа пунктуации».

Если мы, например, определим набор знаков пунктуации

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. Это для историческихпричины.)

0 голосов
/ 22 октября 2010

Кажется, что нет встроенных функций, как в Java tokenizer.Давным-давно мы написали класс токенизатора, аналогичный классу Java, который стал частью набора компонентов ElPack (теперь LMD ElPack).Вот некоторая реализация строкового токенизатора , похожая на Java (только что нашел эту ссылку в Google, поэтому я не могу комментировать качество кода).

...