Comment convertir une chaîne en tableau dans delphi?
-
10-10-2019 - |
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.
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).