Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Explode-Funktion erweitern, um "a b c" zu ignorieren (https://www.delphipraxis.net/202729-explode-funktion-erweitern-um-b-c-zu-ignorieren.html)

DieDolly 2. Dez 2019 20:28

Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Ich benutze seit langer zeit diesen Code. Ich bevorzuge es mit Explode() zu wrappen. Nur deswegen dieser für manche umständliche Aufruf.
Darum gehts aber nicht.
Delphi-Quellcode:
function Explode(const Delimiter, Str: string): TArray<string>;
begin
 SetLength(Result, 0);
 Result := Str.Split([Delimiter]);
end;

Kann man Split() irgendwie dazu nutzen, damit in " gesetzte Wörter nicht getrennt werden?
Delphi-Quellcode:
a b c d
// ergibt ein Array mit Länge 4
Delphi-Quellcode:
a "b c" d
// soll ein Array mit Länge 3 ergeben

Uwe Raabe 2. Dez 2019 21:43

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Klar:
Delphi-Quellcode:

  Result := Str.Split([Delimiter], '"');

DieDolly 2. Dez 2019 21:56

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Wie kann ich daraus denn 2 überladene Funktionen machen, ohne einen Compilerfehler zu bekommen?

Delphi-Quellcode:
function Explode(const Delimiter, Str: string; QuoteChar: Char): TArray<string>;
begin
 SetLength(Result, 0);
 Result := Str.Split([Delimiter], QuoteChar);
end;

function Explode(const Delimiter, Str: string): TArray<string>;
begin
 Result := Explode(Delimiter, Str, ''); // compilerfehler hier, wenn '' dort steht.
end;
In der oberen Explode steht noch etwas mehr drin, weswegen ich diese natürlich am Ende von allen überladenen Funktionen auch aufrufen möchte

DeddyH 2. Dez 2019 22:00

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Man kann eben einen Leerstring nicht als Zeichen übergeben, es muss schon ein Zeichen sein.

DieDolly 2. Dez 2019 22:03

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Dann habe ich da ein kleines Designproblem was die überladenen Funktionen angeht.

Uwe Raabe 2. Dez 2019 22:06

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Na so in etwa:
Delphi-Quellcode:
function Explode(const Delimiter, Str: string; QuoteChar: Char): TArray<string>; overload;
begin
 Result := Str.Split([Delimiter], QuoteChar);
end;

function Explode(const Delimiter, Str: string): TArray<string>; overload;
begin
 Result := Str.Split([Delimiter]);
end;
Man kann die gequotete Version von Split nicht verwenden, wenn man keine Quotes hat. Deswegen gibt es da halt verschiedene Überladungen.

DieDolly 2. Dez 2019 22:09

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1452614)
Na so in etwa:

Das Problem ist, dass ich danach noch etwas Code aufrufe. Meine Idee dazu lautet jetzt

Delphi-Quellcode:
function Base(const aArray: TArray<string>): TArray<string>;
begin
 Result := mach-was-mit-aArray; // keine sorge, gehört alles zum eigentlichen Explode-Algorithmus was hier passiert
end;

function Explode(const Delimiter, Str: string; QuoteChar: Char): TArray<string>;
begin
 Result := Base(Str.Split([Delimiter], QuoteChar));
end;

function Explode(const Delimiter, Str: string): TArray<string>;
begin
 Result := Base(Str.Split([Delimiter]));
end;
Funktioniert auch soweit

Zitat:

a "b c" d

a
"b
c"
d
Zitat:

a "b c" d

a
"b c"
d

Uwe Raabe 2. Dez 2019 22:14

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren
 
Das ist so vollkommen legitim :thumb:

Da die beiden Explode-Overloads eigentlich nichts anderes sind, als Wrapper um den Split-Aufruf, könnte man die auch als inline Deklarieren. Dann spart man sich ein wenig Stack-Geschubse.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz