Hallo zusammen 😃
ich weiß der Titel klingt erstmal verwirrend xD
Was ich meine ist, ...
ich habe einen String. Zum Beispiel:
X1&&Y≤2||Z≥3||A4
Aus diesem String hätte ich jetzt gerne zwei Listen. Einmal eine Liste mit allen UND und ODER und zwar in der richtigen Reihenfolge, also List<string> { "&&", "||", "||" } und eine zweite Liste mit den Vergleichsoperatoren auch in der richtigen Reihenfolge. In diesem Fall also List<string> { "", "≤", "≥", "" }.
Das einzige was ich bis jetzt hinbekommen habe, ist spezielle Chars in der richtigen Reihenfolge auszulesen aber ich möchte eben nicht nur einen Char, sondern einen String. Hier der Code dazu:
char[] arrayAndOr = conditionTerm.ToCharArray();
arrayAndOr = Array.FindAll<char>(arrayAndOr, (c => (c == '&' || c == '|')));
Ich habe jetzt schon eine Weile gegoogelt und so aber nichts passendes gefunden. Vllt. kann mir ja hier einer helfen 😄
Danke! 😃
Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...
ich denke mal RegEx dürfte dir weiterhelfen. Zum testen gibts hier ein Super Tool:
On-the-fly Regex-Tester: Regex-Lab
ich würde dir gerne einen Snippet geben aber bin leider in RegEx nicht so fit.
MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden!
*"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht."
*"Ignorance simplifies ANY problem."
*"Stoppt die Piraterie der Musikindustrie"
oder du machst das mit klassischer Stringverarbeitung:
string input = "X==1&&Y<=2||Z>=3||A==4";
List<string> andOrList = new List<string>();
List<string> operatorList = new List<string>();
for (int index = 0; index < input.Length-1;)
{
string test = input.Substring(index, 2);
switch(test)
{
case "&&":
case "||":
andOrList.Add(test);
index++;
break;
case "==":
case ">=":
case "<=":
case "!=":
operatorList.Add(test);
index++;
break;
}
index++;
}
Viele Grüße
Jens
Wenn dus einfach haben willst Mach das ganze mit Klammern dann ergibt sich die richtige reihenfolge von selbst
also:
(((A3)||(Y≤3))&&(E5))
Wenn du das programmatisch nun berechnen willst musst du nur nacheinander die klammern prüfen, immer von der untersten zur obersten ebene und dann immer zusammenfassen dh.
du berechnest erst alle untersten klammern
A3 = true
Y≤3 = false
E5 = true
dann die nächste ebene
true || false = true [((A==3)||(Y≤3))]
und dann die letzte
true && true = true [(((A3)||(Y≤3))&&(E5))]
Hallo hfb11,
was ist denn dein eigentliches Ziel, d.h. was willst du mit den Operator-Listen anfangen? Benötigst du einen Parser? Dann ist aber dieses ganze String-Gefrickel meistens der falsche Weg, s. z.B. meinen Parser Parser für mathematische Formeln
P.S: @jbrand, du solltest besser "index += 2" (bzw. noch allgemeingültiger "index += test.Length") benutzen, da sonst z.B. bei "&&&" du zwei mal "&&" extrahieren würdest.
P.S: @jbrand, du solltest besser "index += 2" (bzw. noch allgemeingültiger "index += test.Length") benutzen, da sonst z.B. bei "&&&" du zwei mal "&&" extrahieren würdest.
Nur in dem Fall das ein Operator gefunden wurde, darf der Index um 2 Zeichen weiter verschoben werden, in allen anderen Fällen nur um ein Zeichen. Ist in meinem Snippet nicht ganz so schön zu sehen, da dort im Falle eines Operators die Variable index 2 mal inkrementiert wird.
Im Übrigen gebe ich dir Recht, falls ein Parser benötigt wird, ist das basteln mit Strings nicht der richtige Weg.
Viele Grüße
Jens
Ups, hast recht, ich sollte demnächst genauer hinschauen...
Offensichtlich geht es hier um das Parsen von Ausdrücken. Dafür ist Regex nur bedingt geeignet. Und ein Zerlegen mit String-Operationen ist üblicherweise noch undurchsichtiger. Deshalb ist das Mittel der Wahl, einen Parser zu benutzen.