RegEx Hilfe bei Stringspltittung
Hallo Community, ich schreibe gerade an einer Chemie-App. Und zwar möchte ich die Edukte der Reaktionsgleichung (die Linke Seite einer Reaktionsformel zB. H2SO4 + NaCl --> .... ) in dem Fall H2SO4 und NaCl in jeweils dem String [FONT=Consolas]MolekülLeft[/FONT][0] und [FONT=Consolas]MolekülLeft[/FONT][1] haben. Bekomme aber mit dem Pattern nur H2SO4 in MolekülLeft[0]. Kann mir da jemand Helfen? Hier noch ein Bsp. Code:
Code:
[FONT=Consolas][FONT=Consolas][FONT=Consolas][FONT=Consolas][FONT=Consolas][FONT=Consolas]Regex[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] rMolekülLeft = [/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]new[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]Regex[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas]([/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]"(?:([0-9]*((([A-Z]{1})[a-z]*)[0-9]*)*))"[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas]); [/FONT][/FONT]
[FONT=Consolas][FONT=Consolas][FONT=Consolas]
[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]MatchCollection[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] allMatchResultsMolekülLeft = rMolekülLeft.Matches(leftFormulaSide.Text); [/FONT][/FONT]
[FONT=Consolas][FONT=Consolas][FONT=Consolas]
[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]string[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][] MolekülLeft = [/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]new[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]string[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][allMatchResultsMolekülLeft.Count];[/FONT][/FONT]
[FONT=Consolas][FONT=Consolas]
[/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]for[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] ([/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]int[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] i = 0; i < allMatchResultsMolekülLeft.Count; i++) [/FONT][/FONT]
[FONT=Consolas][FONT=Consolas] {
MolekülLeft[i] = allMatchResultsMolekülLeft[i].Groups[0].Value;
[/FONT][/FONT][FONT=Consolas][FONT=Consolas] MoleküleLeft.Text = MolekülLeft[0] + [/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]" "[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] + MolekülLeft[1];[/FONT][/FONT]
[FONT=Consolas][FONT=Consolas]
}
[/FONT][/FONT][/FONT][/FONT][/FONT]
. Vielen Dank im voraus für eure Hilfe. Agredo
AW: RegEx Hilfe bei Stringspltittung
also der regex stimmt soweit. ganz nützlich ist für so was z.B. rick.measham.
der Hund liegt in deinem for: du gehst nur bis allMatchResultsMolekülLeft.Count-1, weil du i<allMatchResultsMolekülLeft.Count; machst. mach <= , denn for prüft die bedingung for ausführung, nur do..while danach.
Code:
for (int i = 0; i <= allMatchResultsMolekülLeft.Count; i++)
dann ist auch deine string deklaration seltsam:
Code:
string[] MolekülLeft = newstring[allMatchResultsMolekülLeft.Count];
warum weist du dem string die Zeichenlänge zu, die der Anzahl deiner regex-Treffer entspricht?
mach doch lieber
Code:
string MolekülLeft;
. Die String-Klasse braucht nicht unbedingt einen Initiator.
und: wenn du nur ein Molekül hast, bekommst du mit deinem String
Code:
MoleküleLeft.Text = MolekülLeft[0] + " " + MolekülLeft[1];
auch unschöne Sachen. ich würde da
Code:
string strTrenner = " ";
MolekülLeft = String.Join(strTrenner, allMatchResultsMolekülLeft);
die Methode Join der Klasse String nimmt dann den Array der regexTreffer und fügt sie in der vorgegebenen Reihenfolge aneinander, dazwischen den strTrenner.
AW: RegEx Hilfe bei Stringspltittung
Vielen Dank fur deine Antwort. Bin immer wieder erstaunt wie schnell hier doch, produktive Antworten kommen :)
Zitat:
Zitat von
yjeanrenaud
also der regex stimmt soweit. ganz nützlich ist für so was z.B.
rick.measham.
der Hund liegt in deinem for: du gehst nur bis allMatchResultsMolekülLeft.Count-1, weil du i<allMatchResultsMolekülLeft.Count; machst. mach <= , denn for prüft die bedingung for ausführung, nur do..while danach.
Code:
for (int i = 0; i <= allMatchResultsMolekülLeft.Count; i++)
dann ist auch deine string deklaration seltsam:
Code:
string[] MolekülLeft = newstring[allMatchResultsMolekülLeft.Count];
warum weist du dem string die Zeichenlänge zu, die der
Anzahl deiner regex-Treffer entspricht?
Also das mache ich, weil ich nicht mehr Strings haben möchte, als Treffer kommen. Jedes Molekül soll in einem eigenen String gespeichert werden. Oder denke ich da jetzt falsch?
mach doch lieber
Code:
string MolekülLeft;
. Die String-Klasse braucht nicht unbedingt einen Initiator.
und: wenn du nur ein Molekül hast, bekommst du mit deinem String
Code:
MoleküleLeft.Text = MolekülLeft[0] + " " + MolekülLeft[1];
auch unschöne Sachen. ich würde da
Code:
string strTrenner = " ";
MolekülLeft = String.Join(strTrenner, allMatchResultsMolekülLeft);
dieses mache ich nur um zu gucken ob überhaupt jedes Molekül in einem eigenen String gespeichert wird. Der Teil dient nur zu meiner Überprüfung. Das ist die Hauptaufgabe die dieser Code machen soll
die Methode Join der Klasse String nimmt dann den Array der regexTreffer und fügt sie in der vorgegebenen Reihenfolge aneinander, dazwischen den strTrenner.
Mit der kostenlosen
PocketPC.ch App von meinem RM-821_eu_euro2_248 aus geschrieben.
AW: RegEx Hilfe bei Stringspltittung
Also ich habe jetzt rausgefunden, dass bei der Eingabe von H2O+H2SO4, MolekülLeft[0] "H2O", MolekülLeft[1] " "(also ein Leerzeichen, MolekülLeft[2] H2SO4 und MolekülLeft[3] " " enthält.
jetzt ist meine Frage woher die Leerzeichen kommen?
AW: RegEx Hilfe bei Stringspltittung
Zitat:
Zitat von
yjeanrenaud
Code:
for (int i = 0; i <= allMatchResultsMolekülLeft.Count; i++)
Das wird so nicht funktionieren. Auflistungen werden ab 0 indiziert. Wenn eine Auflistung also 4 Elemente haben werden diese mit 0, 1, 2, 3 indiziert. 4 ist schon außerhalb.
Ich glaube der reguläre Ausdruck ist nicht der den du haben möchtest.
Ich glaube dieser hier tut was du möchtest:
Code:
((?<educt>[^\s\+]+)[\s\+]+)+
Insgesammt kann man das dann auf 3 Zeilen kürzen:
Code:
Regex rMolekülLeft = new Regex(@"((?<educt>[^\s\+]+)[\s\+]+)+");
var allMatchResults = rMolekülLeft.Match(leftFormulaSide.Text).Groups["educt"].Captures.Cast<Capture> ().Select(a => a.Value);
MoleküleLeft.Text = string.Join(" + ", allMatchResults);
Ich glaube du hast den Unterschied zwichen group und capture nicht ganz verstanden, daher rührt der Denkfehler.
LG pdelvo
AW: RegEx Hilfe bei Stringspltittung
oh stimmt, 0indiziert, ganz übersehen.