2011-06-29 79 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

完美,非常感謝。我知道我缺少正則表達式部門,但這是一個相當新手的疏忽。出於某種原因,我必須去掉兩個正斜槓。他們的目的是什麼? –

+0

@Joey Green:正斜槓是許多語言中的正則表達式(源自perl)的共同定界符。我猜C#(我其實不知道)不是這些語言之一。我會從我的答案中刪除斜槓。請標記答案正確。 – 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; 
    } 
} 
從這個例子字符串
相關問題