2017-07-07 12 views
0

C#でサービスを試しているので、Console.WriteLine(...)を使用して値をデバッグできません。C#でRegex.Split()が正常に動作しない

public int addAndSoustractNumberFromAString(string ustr) 
    { 
     int result = 0; 

     if(!string.IsNullOrEmpty(str)) 
     { 
      string str = ustr.Trim(); 

      //Regexes 
      System.Text.RegularExpressions.Regex valid_regex = new System.Text.RegularExpressions.Regex(@"[\+]\d+|[\-]\d+"); 
      System.Text.RegularExpressions.Regex invalid_regex = new System.Text.RegularExpressions.Regex(@"[a-zA-Z]"); 

      //Handling errors 
      if (invalid_regex.IsMatch(str) || !valid_regex.IsMatch(str) || !Char.IsDigit(str[str.Length - 1])) return 0; 
      if (Char.IsDigit(str[0])) str = "+" + str; 

      //Load all numbers in a string array 
      List<string> numbers = new List<string>(valid_regex.Split(str).ToArray()); 

      //Cast string numbers to int + result calculation 
      foreach (string number in numbers) { if (!int.TryParse(number, out int n)) return 99; result += n; } 
     } 

     return result; 
    } 

私のコードを何:私は最後に私の変数の数であるかわからない理由ですか? 私は加算&の減算を入力します。演算は&の演算結果を整数として返します。

例: 私は "52-2 + 3" を入力した場合には、53

問題を返す必要があります:は私のコードは常に99ウィッヒは解析が失敗したことを返し 。 その場合、代わりにint.TryParse("-2", out int n)を試してみましたが、正常に動作します。働いていない

ライン:

List<string> numbers = new List<string>(valid_regex.Split(str).ToArray());

私の正規表現は、私は、ウェブサイトregexstorm netでそれらをテストし、罰金です。

私の質問は、正規の仮定された正規表現を使用して私の文字列が正しく分割されない理由は何ですか? Regex.Split()は私が信じていることをしていないのですか? (私は文字列を+数字または-number文字列に分割することにしました)

サイドノート:記号で始まらないといいです。文字列が数字で始まる場合、最後に "+"が追加されます正規表現の目的。

+0

なぜTryParseへの呼び出しの中でintを宣言しますか?この値を取得したくないですか?あなたは 'int n;'と 'int.TryParse(number、out n)'を宣言しようとしましたか? – Rafalon

+0

他の方法でもうまくいきます。私がテストしても、それはまだ99を示しています。それをTryParse関数の中で宣言するのは大丈夫です。 –

+0

このコードをコンソールアプリケーションに入れてそこでデバッグできませんでしたか? –

答えて

1

あなたの正規表現は、正規表現をINGのスプリット()ではありません。

スプリト()区切り文字(カンマやセミコロンのすなわち分割)を定義するための正規表現を期待しています。あなたの正規表現は値を示します。

Split()ではなくMatches()の結果が必要なようです。

これはあなたの例で私のために働くようだ:

List<string> numbers = valid_regex.Matches(str).Cast<Match>().Select(m => m.Value).ToList(); 

はまた、LinqPadは、このようなコードスニペットのプロトタイプを作成するための素晴らしいツールです。

+0

それは働いている!だから期待どおり、私はregex.split()関数を誤解していました。ありがとう! –

0

正規表現を([\+\-]\d+)に置き換えると、"52-2+3"hereのトリックが作成されました。

また、分割後に.Where(x => !String.IsNullOrEmpty(x)).ToList();を追加すると、空の文字列を取り除くことができます。

関連する問題