Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String richtig zerlegen (https://www.delphipraxis.net/120067-string-richtig-zerlegen.html)

bundy 5. Sep 2008 01:30


String richtig zerlegen
 
Hi DP

wie kann ich folgenden String richtig parsen.

Code:
{"class":"Shaman","spec":"Enhancement","role":"DPS","talents":"0\/45\/16","gearraw":"226.63","gearbuffed":"250.99","warncount":1,"rawpos":527,"buffpos":600}
rauskommen soll dann

Delphi-Quellcode:
var
class,spec,role,talents :string;
begin
class:='Shaman';
end;
Es kann aber vorkommen das sich der Parsestring erweitert, sprich es können Werte dazukommen.
Ob die nun vorne oder hinten angereiht werden sei dahingestellt.

Wie kann ich sowas am schönsten lösen ?

lg
bundy

omata 5. Sep 2008 02:47

Re: String richtig zerlegen
 
Delphi-Quellcode:
function MakeClasses(Input:string):string;
var RegExpr, RegExprAtt, RegExprWert:TRegExpr;
    header, strings, zahlen:string;
begin
  Result:='';
  RegExpr:=TRegExpr.Create;
  RegExprAtt:=TRegExpr.Create;
  RegExprWert:=TRegExpr.Create;
  try
    RegExpr.ModifierG:=false;
    RegExpr.Expression:='{(.*)}';
    RegExprAtt.ModifierG:=false;
    RegExprAtt.Expression:='"(.*)":(.*)(,|})';
    if RegExpr.Exec(Input) then begin
      repeat
        if RegExprAtt.Exec(RegExpr.Match[0]) then begin
          header:='';
          strings:='';
          zahlen:='';
          repeat
            if lowercase(RegExprAtt.Match[1]) = 'class' then begin
              if header = '' then
                header:=StringReplace(RegExprAtt.Match[2], '"', '', [rfReplaceAll])
              else
                raise Exception.Create('Fehler, Class-Eintrag zweimal vorhanden.');
            end
            else begin
              RegExprWert.Expression:='(["0-9.]*)';
              if    RegExprWert.Exec(RegExprAtt.Match[2])
                 and (RegExprWert.Match[1] = RegExprAtt.Match[2]) then
              begin
                zahlen:=zahlen + ',' + RegExprAtt.Match[1];
              end
              else strings:=strings + ',' + RegExprAtt.Match[1];
            end;
          until not RegExprAtt.ExecNext;
        end;
        Result:=Result +
          'var'#13 +
          'class' + strings + ' :string;'#13 +
          'begin'#13 +
          'class:=''' + header + ''';'#13 +
          'end;'#13;
      until not RegExpr.ExecNext;
    end;
  finally
    RegExpr.free;
    RegExprAtt.free;
    RegExprWert.free;
  end;
end;
RegExpr

alzaimar 5. Sep 2008 06:34

Re: String richtig zerlegen
 
'class' ist ein ziemlich unglücklich gewählter Bezeichner für ein Delphi-Codefragment. Ich könnte mir gut vorstellen, das der Compiler das ähnlich sieht und schmollt.

mkinzler 5. Sep 2008 06:36

Re: String richtig zerlegen
 
Er wird es ganz bestimmt.

bundy 5. Sep 2008 09:26

Re: String richtig zerlegen
 
hy cool, den code muss ich mal :coder: verarbeiten :thumb: DANKE

alf.stefan 5. Sep 2008 12:52

Re: String richtig zerlegen
 
Und warum nicht einfach so. bzw so ähnlich (übergabe, funktion usw....)

Gruß

Stefan

Delphi-Quellcode:
procedure parse();
var parse1, Parse2, parse3 : string;
    loop: integer;
    theList : TStrings;
    varLine : string;
    defLine : string;


begin
  thestr2Parse := '{"class":"Shaman","spec":"Enhancement","role":"DPS","talents":"0\/45\/16","gearraw":"226.63","gearbuffed":"250.99","warncount":1,"rawpos":527,"buffpos":600}';
  Parse1 := copy(theStr2Parse, 2, length(theStr2Parse)-2);
  parse2 := AnsiReplaceStr(Parse1,':','=');
  parse3 := AnsiReplaceStr(Parse2,'"','');
  theList := TStringList.Create;
  theList.CommaText := parse3;
  memo1.Clear;

  varLine := 'var ';
  for loop := 0 to theList.Count-1 do
  begin
    varLine := varLine + theList.Names[loop];
    if loop = theList.Count-1 then varLine := varLine+';'
    else varLine := varLine+',';
  end;
  memo1.Lines.Append(varLine);
  memo1.Lines.Append('begin');
  for loop := 0 to theList.Count-1 do
  begin
      defLine := #9+theList.Names[loop]+' := '+#39+theList.ValueFromIndex[loop]+#39+#59;
      memo1.Lines.Append(defLine);
  end;
  memo1.Lines.Append('end;');


  theList.Free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 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