如何从字符串中提取所有数字(如int)? c#

问题描述:

我有一个很长的字符串,我想通过它循环并按顺序取出所有的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

东西:(另)

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

基于正则表达式的方法会是这个样子:

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

“疯狂” 的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

如何:

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

针对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();