2011-06-29 7 views
3

int[]を次の文字列から取得しようとしています。私は最初にRegex().Split()を行っていましたが、わかるように、この文字列を分割する明確な方法はありません。私は[a-z]に分割することができましたが、その後、カンマを削除する必要があります。それは遅れており、私はこれを行う良い方法を考えることができません。誰かが正規表現で私を助けてくれますか?

"21,false,false,25,false,false,27,false,false,false,false,false,false,false,false" 

次の

+1

この例の文字列から、あなたは 'たいです[21,25,27]'や '[21,0,0,25,0 、0,27,0、...] '(ここで、false = 0)? –

答えて

6

スプリット:

[^\d]+ 

あなたの文字列がない場合、あなたの文字列が末尾の番号および/または空要素で始まっていない場合は、最初に空の要素を得ることができます数字で終わります。このような場合は、それらの要素をトリミングすることができます。さらに、空の文字列を返さないようにするには、Regex().Split()が何らかのフラグをサポートしている場合は、それを使用してください。

+0

パーフェクト、ありがとう。私は正規表現部門に欠けていることを知っていましたが、それはかなり初心者の見落としでした。何らかの理由で2つのスラッシュを削除しなければならなかった。彼らの目的は何ですか? –

+0

@Joey Green:スラッシュは、多くの言語(perl由来)の正規表現の一般的な区切り文字です。私はC#(実際にはわからない)がこれらの言語の1つではないと思います。私は私の答えからスラッシュを削除します。正しい答えを記入してください。 – Asaph

+0

私はRegex()を使用しています。Split()にはStringSplitOptionsを受け入れるコンストラクタがありません。あなたがもっと良い方法を知らない限り、私が思う ""要素を無視することができます。 –

0

単純な解決方法は、文字列をパターン\d+と一致させることです。 時にはあなたが一致したくない値で分割することが容易であるが、ここではアンチパターンとして機能します。:

MatchCollection numbers = Regex.Matches(s, @"\d+"); 

別の解決策は、正規のstring.SplitといくつかのLINQの魔法を使用することです。まず、カンマで分割して、与えられたトークン内のすべての文字が数字であることを確認してください。

var numbers = s.Split(',').Where(word => word.All(Char.IsDigit)); 

は、それは一般的に無視され、実際.NETで\dすべてのUnicode数字だけではなく、[0-9]と一致している(してみてくださいあなたの配列の123、ちょうど楽しみのために)。より堅牢なソリューションは、定義されたカルチャに従って各トークンを解析し、有効な数値を返そうとすることです。この簡単小数、指数や民族数値のフォーマットをサポートするように適合させることができます。

static IEnumerable<int> GetIntegers(string s) 
{ 
    CultureInfo culture = CultureInfo.InvariantCulture; 
    string[] tokens = s.Split(','); 
    foreach (string token in tokens) 
    { 
     int number; 
     if (Int32.TryParse(token, NumberStyles.Integer, culture, out number)) 
      yield return number; 
    } 
} 
関連する問題