2016-07-23 2 views
1

J'ai une expression arithmétique simple contenant des entiers, des parenthèses et + - */. Comme ceci:C# expression arithmétique fractionnée en chaîne []

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

Ce que je dois faire est de diviser cette expression à la string[] comme ceci:

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

Je suis en train de le faire avec Regex classe

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

Mais les données de sortie ne sont pas tout à fait exactes:

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

+1

Vous pouvez calculer le résultat sans le diviser. Est-ce ce que vous êtes après? – user3185569

+1

Notez que ') - +' créer une plage dans votre classe de char qui correspond plus que vous pourriez vous attendre. Placez le trait d'union à la fin de la classe de caractères. –

+1

En plus de ce tableau de bord non échappé, je suggère d'envisager de faire autrement: faire correspondre les jetons désirés et retourner une liste de tous les résultats - vous obtiendrez une expression rationnelle plus simple: 'return Regex.Matches (str, @" ([() + */-] | \ d +) "). Cast () .Sélectionnez (m => m.Value) .ToArray();' –

Répondre

1

Si vous voulez correspondre à un tableau de bord, il doit être dans la première ou la dernière position dans une classe de personnage regex:

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

dans le cas contraire, il est interprété comme une gamme de caractères - dans votre cas, de ) à *.

Demo.

1

Si c'est juste le 3-5 vous causer des problèmes, vous avez besoin d'échapper à la « - » dans votre modèle à savoir

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