2016-07-23 13 views
1

Ich habe einen einfachen arithmetischen Ausdruck mit ganzen Zahlen, Klammern und + - */. Wie folgt aus:C# split arithmetischer Ausdruck zu string []

((1+33)()(4+(3-5)))

Was ich tun müssen, ist gespalten diesen Ausdruck auf die string[] wie folgt aus:

{(, (, 1, +, 33,), (,), (, 4, +, (, 3, -, 5,),),)}

Ich versuche es mit Regex Klasse zu tun

public string[] SplitString(string str) 
{ 
    return Regex.Split(str, "(?<=[()-+*/])|(?=[()-+*/])"); 
} 

Aber Ausgangsdaten sind nicht ganz richtig:

{(, (, 1, +, 33,), (,), (, 4, +, (, **3-5**,),),)}

+1

Sie können das Ergebnis berechnen, ohne es zu teilen. Ist das, wonach Sie suchen? – user3185569

+1

Beachten Sie, dass ') - +' einen Bereich in Ihrer Zeichenklasse erstellt, der mehr entspricht als erwartet. Setzen Sie den Bindestrich am Ende der Zeichenklasse. –

+1

Neben diesem ungesäumten Gedankenstrich schlage ich vor, den umgekehrten Weg zu gehen: Entsprechen Sie den gewünschten Token und geben Sie eine Liste aller Treffer zurück - Sie erhalten einen einfacheren Regex: 'return Regex.Matches (str, @" ([() + */-] | \ d +) "). Cast () .Wählen (m => m.Wert). ToArray();' –

Antwort

1

Wenn Sie einen Strich übereinstimmen soll, muss es sein in der ersten oder die letzte Position in einer Zeichenklasse in regex:

(?<=[()+*/-])|(?=[()+*/-]) 
//  ^  ^

Ansonsten ist es als Zeichenbereich interpretiert wird - in Ihrem Fall von ) zu *.

Demo.

1

Wenn es nur die 3-5 verursacht Sie Probleme, müssen Sie die entkommen „-“ in Ihrem Muster dh

Regex.Split(str, "(?<=[()\\-+*/])|(?=[()\\-+*/])")