Moin Chris,
hier mal ein erweiterbares Muster.
Es wäre u.U. sinnvoller mit einer speziellen Liste für das Ergebnis zu arbeiten (Einträge als Record mit den Feldern Token für die Kennung was es denn nun ist, und Attribute für den Wert).
Der Einfachheit halber mal als StringListe, und die Typen als Konstanten, statt Aufzählungstyp.
Das Muster entspricht im Wesentlichen dem, was ich Dir schon mal vorgeschlagen hatte.
Die Leerzeichen entfallen, da Du sie nach der Aufspaltung der Zeile eh' nicht mehr brauchst.
Delphi-Quellcode:
procedure SplitCommandLine(const AsCommandLine : string;const AslResult : TStrings);
const
_iIsKeyword = 1;
_iIsVariable = 2;
_iIsStringConst = 3;
var
iIndex : integer;
iCount : integer;
begin
AslResult.Clear;
iIndex := 1;
while iIndex <= length(AsCommandLine) do
begin
case AsCommandLine[iIndex] of
'a'..'z','A'..'Z' : begin // Keyword filtern
iCount := 1;
while (iIndex < length(AsCommandLine)) and (AsCommandLine[iIndex+iCount] in ['a'..'z','A'..'Z']) do inc(iCount);
AslResult.AddObject(copy(AsCommandLine,iIndex,iCount),Pointer(_iIsKeyword));
inc(iIndex,iCount);
end;
'"' : begin // StringKonstante
iCount := 1;
while (iIndex < length(AsCommandLine)) and (AsCommandLine[iIndex+iCount] <> '"') do inc(iCount);
AslResult.AddObject(copy(AsCommandLine,iIndex+1,iCount-1),Pointer(_iIsStringConst));
inc(iIndex,iCount+1);
end;
'$' : begin // Variable
iCount := 1;
while (iIndex < length(AsCommandLine)) and (AsCommandLine[iIndex+iCount] in ['0'..'9']) do inc(iCount);
AslResult.AddObject(copy(AsCommandLine,iIndex,iCount),Pointer(_iIsVariable));
inc(iIndex,iCount);
end;
else begin
inc(iIndex);
end;
end;
end;
end;
procedure TfrmMAIN.Button1Click(Sender: TObject);
begin
SplitCommandLine('findwindow "test" "test test" $1',Memo1.Lines);
end;