Как я могу вытащить все числа (как int) из строки? C # - PullRequest
4 голосов
/ 11 февраля 2010

У меня есть длинная строка, и я хотел бы перебрать ее и вытащить все значения 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 ]

7 голосов
/ 11 февраля 2010

Что-то вроде: (не проверено)

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 : Существует перегрузка TryParse , которая принимает в качестве параметра, среди прочего, побитовое сравнение System.Globalization.NumberStyles . С помощью этой перегрузки вы можете указать, какие типы целочисленных строк он может принимать (AllowExponent - одна из них), поэтому я бы предположил, что не протестировал этот , что 9e09 будет работать. :)

Надеюсь, это поможет!

6 голосов
/ 11 февраля 2010

Подход на основе регулярных выражений будет выглядеть примерно так:

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

Однако, это не обрабатывает 9e09, если это должно представлять 9 x 10 ^ 9 - оно будет интерпретироваться как два отдельных числа, проанализированных как 9 и 9.

3 голосов
/ 11 февраля 2010

«Сумасшедший» путь Линка:

    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);
        }
    }
2 голосов
/ 11 февраля 2010

В ответ на это, если кого-то беспокоит переполнение, в этом сценарии можно также использовать трипарс с помощью временной переменной:

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();
2 голосов
/ 11 февраля 2010

Как насчет:

int[] xx = raw.Split( ' ' ).Where( ( s, o ) => Int32.TryParse( s, out o ) ).Select( p => Int32.Parse( p ) ).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...