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

时间:2010-02-10 21:29:58

标签: c# regex string

我有一个长字符串,我想循环遍历它并按顺序提取所有int值。这看起来很简单,但我似乎无法弄明白。

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并在必要时可以访问Regex和Linq。感谢。

最终结果将是一长串的整数。即

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

我最终使用了什么(不是最有效,但是工作)

#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 个答案:

答案 0 :(得分: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);
    }
}

修改: 有overload of TryParse作为参数,其中包括System.Globalization.NumberStyles的按位比较。有了这个重载,你可以指定它可以接受的整数字符串类型(AllowExponent就是其中之一),所以我想,没有测试过这个 9e09会工作。 :)

希望这有帮助!

答案 1 :(得分:6)

基于正则表达式的方法看起来像这样:

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

然而,如果这意味着代表9 x 10 ^ 9,它不会处理9e09 - 它会将其解释为两个单独的数字,解析为9和9。

答案 2 :(得分: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);
        }
    }

答案 3 :(得分:2)

怎么样:

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

答案 4 :(得分: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();