2016-07-23 7 views
1

整数、括弧、および+ -/を含む単純な算術式があります。このように:私はRegexクラスc#分割演算式を文字列に変換する

public string[] SplitString(string str) 
{ 
    return Regex.Split(str, "(?<=[()-+*/])|(?=[()-+*/])"); 
} 
でそれをやろうとしています

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

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

私がする必要がどのようなこのようなstring[]にこの式を分割され、

出力データが正しくない:

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

+1

結果を分割せずに計算できます。これはあなたの後のことですか? – user3185569

+1

') - +'は、あなたが期待する以上に一致する範囲をcharクラスに作成することに注意してください。文字クラスの最後にハイフンを置きます。 –

+1

そのエスケープされていないダッシュのほかに、私は他のやりかたをすることをお勧めします:目的のトークンを一致させてすべてのマッチのリストを返す - 単純な正規表現で終わるでしょう: 'return Regex.Matches(str、@"([ ()+ */- ] | \ d +) ")。 –

答えて

1

つまりあなたはダッシュを一致させたい場合は、それをする必要があります最初のまたは正規表現の文字クラスの最後の位置:

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

そうでない場合、それは文字の範囲として解釈される - あなたのケースでは、)から*へ。

Demo.

1

それはあなたの問題を引き起こしてちょうど3-5なら、あなたはエスケープする必要がある「を - 」あなたのパターンで

Regex.Split(str, "(?<=[()\\-+*/])|(?=[()\\-+*/])") 
関連する問題