2016-07-23 2 views
1

У меня есть простое арифметическое выражение, содержащее целые числа, круглые скобки и + - */. Как это:C# split арифметическое выражение для строки []

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

Что мне нужно сделать, это разделить это выражение на string[] так:

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

Я пытаюсь сделать это с Regex класса

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

Но выходные данные не совсем правильные:

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

+1

Вы можете вычислить результат, не разбивая его. Это то, что вам нужно? – user3185569

+1

Обратите внимание, что ') - +' создайте диапазон в своем классе char, который будет соответствовать больше, чем вы могли ожидать. Поместите дефис в конце класса символов. –

+1

Помимо этого небезопасного тире, я предлагаю рассмотреть другой способ: сопоставить нужные маркеры и вернуть список всех совпадений - вы получите более простое регулярное выражение: 'return Regex.Matches (str, @" ([() + */-] | \ d +) "). Cast () .Выберите (m => m.Value) .ToArray();' –

ответ

1

Если вы хотите, чтобы соответствовать прочерк, это должно быть в первой или последней позиции в классе символов в регулярных выражениях:

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

в противном случае, он интерпретируется как диапазон символов - в вашем случае, от ) к *.

Demo.

1

Если это всего лишь 3-5 причиняя вам проблемы, вам нужно бежать «-» в шаблоне, т.е.

Regex.Split(str, "(?<=[()\\-+*/])|(?=[()\\-+*/])") 
Смежные вопросы