Question

En php et java il y a explosera et tokenizer fonction pour convertir une chaîne en tableau sans ponctuations. Sont des fonctions ou sont d'une certaine façon à delphi pour faire le travail. Supposons qu'il y ait un grand fichier « Ceci est, un grand fichier avec ponctuations ,, et des espaces et des numéros 123 ... » Comment pouvons-nous tableau « Ceci est un grand fichier avec ponctuations et des espaces et des numéros 123 »

Merci beaucoup à l'avance.

Oui, nous voulons seulement [0..9], [a..z], [A..Z], comme \ w regex. Peut-on utiliser regex dans Tperlregex pour extraire \ w et les mettre dans TStringList comme si TStringList est un tableau, mais il ne peut pas être si efficace? Merci.

Était-ce utile?

La solution

Si vous avez besoin d'une fonction qui prend une chaîne et retourne un tableau de chaînes, ces chaînes étant les sous-chaînes de l'original séparés par la ponctuation, comme Eugene suggéré dans ma réponse précédente, vous pouvez le faire

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;

Exemple:

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;

Autres conseils

Cela dépend de la définition de « caractère alphanumérique » et « caractère puncutation ».

Si, par exemple, nous définissons l'ensemble des caractères de ponctuation

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

et tenir compte de tous les autres caractères alphanumériques, vous pouvez faire

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;

Cette fonction transforme une chaîne en une chaîne. Si vous voulez transformer une chaîne en un tableau de caractères au lieu, faire juste

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;

(Oui, à Delphes, les chaînes utilisent l'indexation de base 1, alors que les tableaux utilisent l'indexation base 0. Ceci est pour des raisons historiques.)

Il ne semble pas une fonctionnalité intégrée comme en Java tokenizer. Il y a longtemps que nous avons écrit une classe tokenizer similaire à Java celui qui est devenu une partie de suite de composants ELPACK (maintenant ELPACK LMD). Voici quelques mise en œuvre de chaîne tokenizer similaire à Java un (juste trouvé ce lien dans Google, donc je ne peux pas commenter la qualité du code).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top