2016-07-23 72 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, "(?<=[()\\-+*/])|(?=[()\\-+*/])") 
相關問題