Laden...

Strings aus String auslesen. Richtige Reihenfolge.

Erstellt von hfb11 vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.552 Views
Thema geschlossen
H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 10 Jahren
Strings aus String auslesen. Richtige Reihenfolge.

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...

P
660 Beiträge seit 2008
vor 10 Jahren

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"

30 Beiträge seit 2007
vor 10 Jahren

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

R
212 Beiträge seit 2012
vor 10 Jahren

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
E
5 = true

dann die nächste ebene

true || false = true [((A==3)||(Y≤3))]

und dann die letzte

true && true = true [(((A3)||(Y≤3))&&(E5))]

4.942 Beiträge seit 2008
vor 10 Jahren

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.

30 Beiträge seit 2007
vor 10 Jahren

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

4.942 Beiträge seit 2008
vor 10 Jahren

Ups, hast recht, ich sollte demnächst genauer hinschauen...

Hinweis von herbivore vor 10 Jahren

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.

Thema geschlossen