2010-02-10 91 views
4

我有一個很長的字符串,我想通過它循環並按順序取出所有的int值。這似乎很簡單,但我似乎無法弄清楚。如何從字符串中提取所有數字(如int)? c#

string raw = "I am a string and I have some numbers 3 45 333 2 39 inside of me 1839 9303, and I'd like to get these numbers into 9 -10 00 9e09 into a string[] or something else"; 

int[] justNumbers = raw.????? 

使用C#.NET 3.5並有權訪問正則表達式和Linq(如有必要)。謝謝。

最終結果將是一長串整數。即

List<int> numbers = new List<int>(); 

WHAT我最終使用(不是最有效的,但保護正常工作)沿着線

#region mysolution 
     numbers = new List<int>(); 
     foreach (char item in raw) 
     { 
      if (item.ToString() == "0") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "1") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "2") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "3") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "4") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "5") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "6") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "7") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "8") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
      else if (item.ToString() == "9") 
      { 
       numbers.Add(Convert.ToInt32(item.ToString())); 
      } 
     } 

     #endregion 
+5

什麼是最終結果預計將是什麼樣子? 3,45,333或3,4,5?或者是其他東西。需要更多細節。 – 2010-02-10 21:32:49

回答

7

東西:(另)

var items = raw.Split(' '); 
var integers = new List<int>(); 
foreach(var i in items){ 
    int test = 0; 
    if(int.TryParse(i, out test)){ 
     integers.add(test); 
    } 
} 

EDIT : 有一個overload of TryParse作爲參數,其中包括ab依次比較System.Globalization.NumberStyles。有了這個過載,你可以指定它可以接受哪些類型的整數字符串(AllowExponent就是其中之一),所以我想,還沒有測試過這個9e09會工作。 :)

希望這有助於!

+0

這似乎並不適用於9e09:( – Bryan 2010-02-10 21:40:43

+0

這對我的簡單問題很好,我也做了一系列的if/else語句比較i.ToString ==「0」,每個數字0-9 – discorax 2010-02-10 21:46:30

+0

@ discorax?你添加了什麼代碼?請更新你的問題與你一起去 - 你的評論讓我很好奇 – 2010-02-10 21:50:49

6

基於正則表達式的方法會是這個樣子:

Regex number = new Regex(@"-?\d+"); 
List<int> ints = number.Matches(raw) 
         .Cast<Match>() 
         .Select(m => Int32.Parse(m.Value)) 
         .ToList(); 

然而,這並沒有如果的意思表示9×10^9處理9e09 - 這將它解釋爲兩個不同號碼,解析爲9和9

+0

我讚揚你的線數,但...這是一個複雜的技術的瘋狂應用這個簡單的問題 – 2010-02-10 21:38:54

+0

可以通過將它改爲\ de?\ d *來處理。 不確定哪個符號用於條件e,因爲我習慣了Perl RegExp,但是?中的短語意思是0或1 – 2010-02-10 21:39:16

+0

@Michael:有東西更好地建議? – 2010-02-10 21:39:52

3

「瘋狂」 的LINQ方式:

private static IEnumerable<int> GetNumbers(string str) 
    { 
     foreach (var st in str.Split(new string[]{" "},StringSplitOptions.RemoveEmptyEntries) 
      .Where(s => (s.ToCharArray() 
       .All(c => Char.IsDigit(c))))) 
     { 
      yield return Convert.ToInt32(st); 
     } 
    } 
+1

瘋狂+1 ;-) – 2010-02-10 21:48:17

2

如何:

int[] xx = raw.Split(' ').Where((s, o) => Int32.TryParse(s, out o)).Select(p => Int32.Parse(p)).ToArray(); 
2

針對itowlson,如果有人關心溢出,一方面也可以在這種情況下使用的TryParse有一個臨時變量的幫助:

int tmp = 0; 
var result = (from m in new Regex(@"-?\d+").Matches(s).OfType<Match>() 
       let doesParse = int.TryParse(m.Value, out tmp) 
       where doesParse 
       select tmp).ToList();