Использование LINQ для разбора чисел из строки - PullRequest
10 голосов
/ 14 августа 2010

Можно ли написать запрос, в котором мы получаем все те символы, которые могут быть проанализированы в int из любой заданной строки?

Например, у нас есть строка типа: "$%^DDFG 6 7 23 1"

Результат должен быть "67231"

И даже немного сложнее: мы можем получить только первые три числа?

Ответы [ 7 ]

22 голосов
/ 14 августа 2010

Это даст вам строку

string result = new String("y0urstr1ngW1thNumb3rs".
    Where(x => Char.IsDigit(x)).ToArray());

И для первых 3 символов используйте .Take(3) перед ToArray()

11 голосов
/ 14 августа 2010

Должно сработать следующее:

var myString = "$%^DDFG 6 7 23 1";

//note that this is still an IEnumerable object and will need
// conversion to int, or whatever type you want.
var myNumber = myString.Where(a=>char.IsNumber(a)).Take(3);

Не ясно, хотите ли вы, чтобы 23 считалась одной последовательностью чисел или двумя разными числами.Мое решение выше предполагает, что вы хотите, чтобы конечный результат был 672

3 голосов
/ 14 августа 2010
public static string DigitsOnly(string strRawData)
  {
     return Regex.Replace(strRawData, "[^0-9]", "");
  }
2 голосов
/ 14 августа 2010
string testString = "$%^DDFG 6 7 23 1";
string cleaned = new string(testString.ToCharArray()
    .Where(c => char.IsNumber(c)).Take(3).ToArray());

Если вы хотите использовать белый список (не всегда цифры):

char[] acceptedChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
string cleaned = new string(testString.ToCharArray()
    .Where(c => acceptedChars.Contains(c)).Take(3).ToArray());
1 голос
/ 14 августа 2010

Как насчет этого?

var yourstring = "$%^DDFG 6 7 23 1";  
var selected = yourstring.ToCharArray().Where(c=> c >= '0' && c <= '9').Take(3);
var reduced = yourstring.Where(char.IsDigit).Take(3); 
0 голосов
/ 06 июля 2013
> 'string strRawData="12#$%33fgrt$%$5"; 
> string[] arr=Regex.Split(strRawData,"[^0-9]"); int a1 = 0; 
> foreach (string value in arr) { Console.WriteLine("line no."+a1+" ="+value); a1++; }'

Output:line no.0 =12
line no.1 =
line no.2 =
line no.3 =33
line no.4 =
line no.5 =
line no.6 =
line no.7 =
line no.8 =
line no.9 =
line no.10 =5
Press any key to continue . . .
0 голосов
/ 14 августа 2010

Regex:

private int ParseInput(string input)
{
    System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+");
    string valueString = string.Empty;
    foreach (System.Text.RegularExpressions.Match match in r.Matches(input))
        valueString += match.Value;
    return Convert.ToInt32(valueString);
}

И даже немного сложнее: мы можем получить только первые три числа?

    private static int ParseInput(string input, int take)
    {
        System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+");
        string valueString = string.Empty;
        foreach (System.Text.RegularExpressions.Match match in r.Matches(input))
            valueString += match.Value;
        valueString = valueString.Substring(0, Math.Min(valueString.Length, take));
        return Convert.ToInt32(valueString);
    }
...