Verfasst am: 30.01.2012, 16:29
Titel: String zerlegen um Zahlenpaare zu bekommen
Hallo zusammen,
ich habe folgendes Problem: Ich möchte einen String in mehrere Paare aus Zahlen umwandeln. Die Zahlenpaare können entweder aus nur einer Zahl (nicht wirklich ein Paar) bis hin zu 6 Zahlen bestehen. Hier ein Beispiel zur Verdeutlichung:
Code:
% string aus svg file path.raw = 'M100.111,720.688l0.479-0.474v-0.72 l0.241-0.956l1.434-0.241v-1.43 c1.916-3.732-0.952-6.006-2.387-8.831l-1.191-1.671V722.6z';
Mit M beginnt der String, gefolgt von x/y Koordinate, ab dann kann in loser Reihenfolge folgendes vorkommen: Die Buchstaben m, l, h,v,c, z (groß oder klein geschrieben) jeweils gefolgt von min. einer und max. 6 Zahlen. Positive Zahlen sind durch Komma getrennt, negative durch ein Minus.
Ich möchte nun ein Struct mit separierten Buchstaben und Zahlen (jede Zahl einzeln dem vorausgegangenen Buchstaben zuordenbar). Folgenden Code habe ich schon. Es wird ein Struct path erzeugt, dann trenne ich mit regexp an den Buchtsaben und erhalte path.pairs und path.attributes. Nun habe ich kleinere strings, die weiter zerlegt werden müssen. Dies wollte ich über str2num machen (siehe for-Schleife). Und genau da ist der Haken. Sobald Minuszeichen auftauchen werden die zahlen nicht separat ausgegeben, sondern aufaddiert/subtrahiert. Siehe z.B. path.coordinate(7).
Code:
% string aus svg file path.raw = 'M100.111,720.688l0.479-0.474v-0.72 l0.241-0.956l1.434-0.241v-1.43 c1.916-3.732-0.952-6.006-2.387-8.831l-1.191-1.671V722.6z';
% Definieren der relevanten Buchstaben
pattern = 'm|l|h|v|c|z|M|L|H|V|C|Z';
% Trennen der einzelnen Koordinatenpaare [path.pairspath.attributes] = regexp(path.raw, pattern,'split','match');
% Achtung das M am Anfang erzeugt einen leeren String in path.pairs der gelöscht werden muss path.pairs(1)=[];
% Ersetzen von "-" durch ",-"; Evtl nicht nötig? path.pairs_new = regexprep(path.pairs,'-','; -');
% Ersetzen von "," durch ";"; Evtl nicht nötig? path.pairs_new = regexprep(path.pairs_new,',', '; ');
% Schleife über alle Koordinatenstrings um Zahlen herauszulösen for i=1:length(path.pairs) path.coordinate(i).coordinates = str2num(path.pairs{i});
end
vielen Dank für deine Hilfe. Nur eine Frage noch: Was bedeutet $1. Ich konnte bereits rausfinden, dass \d für eine beliebige Ziffer steht, aber zu $1 konnte ich nichts finden.
REGEXPREP macht ja eine Ersetzung in String.
Ich suche ja nach folgenden Pattern: "Beliebige Zahl und Minuszeichen".
Ich will das Pattern durch "Komma und Minuszeichen" ersetzen.
Das Problem dabei ich habe eine Zahl in Pattern, welche ich verlieren würde.
Also muss ich durch Klammern (\d) verdeutlichen, dass es sich um ein Argument handelt. Und $1 sage dass es erstes Argument sei, was übernommen werden muss.
Dann verlieren ich keine Zahl mehr.
Sicher man konnte einfach nur Minus durchs Komma ersetzen, aber dann kämen wohl an anderer Stelle Probleme, wo Minus vor keiner Zahl stünde.
Deswegen musste ich explizit nach einer Zahl abfragen.
Michael2000
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 31.01.2012, 16:40
Titel: Danke
Vielen Dank
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.