2016-07-23 69 views
1

我有一个简单的算术表达式,其中包含整数,括号和+ - */。就像这样:c#将算术表达式拆分为字符串[]

((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 ().Select(m => m.Value).ToArray();' –

回答

1

如果你想匹配一个破折号,它需要在第一或在字符类的最后位置在正则表达式:

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

否则,它被解释为一个字符范围 - 在你的情况下,从)*

Demo.

1

如果只是3-5造成你的问题,你需要躲避“ - ”在你的模式,即

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