Wie wäre es wenn du den Parser schreiben würdest
Ich würde das mit einem endlichen Zustandsautomaten angehen:
Delphi-Quellcode:
function unescape(const input: AnsiString): AnsiString;
var
state: (stNormal, stExpectX, stHex1, stHex2);
curLength, cur: integer;
escaped: string[3];
procedure normal; inline;
begin
state := stNormal;
inc(curLength);
result[curLength] := input[cur];
end;
begin
setLength(result, length(input));
curLength := 0;
state := stNormal;
for cur := 1 to length(input) do
begin
case state of
stNormal:
if input[cur] <> '\'
then normal
else state := stExpectX;
stExpectX:
if input[cur] = 'x'
then state := stHex1
else normal;
stHex1:
if input[cur] in ['0'..'9', 'a'..'f', 'A'..'F'] then
begin
escaped := '$' + input[cur];
state := stHex2;
end else normal;
stHex2:
begin
if input[cur] in ['0'..'9', 'a'..'f', 'A'..'F']
then escaped := escaped + input[cur]
else state := stNormal;
inc(curLength);
result[curLength] := Chr(StrToInt(escaped));
if state = stNormal
then normal
else state := stNormal;
end;
end;
end;
setLength(result, curLength);
end;
Nicht getestet, aber das Prinzip sollte klar werden.