我想从字符串中搜索整数并将它们存储在数组中

时间:2014-04-02 07:49:19

标签: c# regex string parsing console-application

我正在建立一个基于控制台的彩票游戏,用户输入他/她选择的数字。我需要检查数字是否在1-39之间,用户输入了7个有效数字。我希望以用户在控制台中的一行字符串中写入它们并且程序找到任何空格,逗号或其他非数字字符并忽略它们的方式来执行此操作。剩余的彩票号码应存储在整数数组中,且不包含任何重复数据。

我当前的版本非常糟糕,因为如果用户写入,它很容易出错。数字之间有2个空格。

Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:");
        string userRow = Console.ReadLine();
        int[] userLottery = new int[7];
        for(int i = 0; i < userLottery.Length; i++)
            {
                userLottery = userRow.Split(',', '.', ' ').Select(x => int.Parse(x)).ToArray();
                if(userLottery[i] > 7)
                {
                    Array.Resize(ref userLottery, 7);
                }
            }

我希望以更方便的方式替换当前的方式,因为用户错误的数量不会影响程序。如果用户写入多个空格,则会发生错误。

我尝试构建正则表达式来处理这些情况,但我不能用它来存储它们到数组中。

string userChoice = Console.ReadLine();
        MatchCollection userNumbers = Regex.Matches(userChoice, @"\d+");
        int[] userRow;

        for(int i = 0; i < userNumbers.Count; i++)
        {
            userRow[i] = userNumbers[i].Value;
        }

这表示字符串无法转换为int [] ...

5 个答案:

答案 0 :(得分:1)

您可以使用String.Split RemoveEmptyEntriesint.tryParse来使用此LINQ查询:

int num = 0;
int[] userLottery = userRow.Trim()
    .Split(new[] { '.', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => int.TryParse(s.Trim(), out num) && num > 0 && num < 40)
    .Select(s => num)
    .Distinct()
    .ToArray();
if(userLottery.Length != 7)
    Console.WriteLine("Enter 7 valid numbers between 1 and 39");
else
    Console.WriteLine("You have chosen following numbers: " + string.Join(",", userLottery));

Enumerable.Distinct按要求删除重复项。

答案 1 :(得分:0)

使用Regex.Split()来处理多个空格。

string[] numbers = Regex.Split(userRow, @"\s+");

\s+表示一个或多个空格。如果需要,您只能将[ ]+用于空间。

答案 2 :(得分:0)

您可以先使用RegEx解析它,然后它就可以正常工作。

  using System.Text.RegularExpressions;

  Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:");
  string userRow = Console.ReadLine();
  int[] userLottery = new int[7];

  string[] userEnter = Regex.Split(userRow, " ");

  int n = 0;
  int k = 0;
  for (int i = 0; i < userEnter.Length; i++)
  {
    bool isNumeric = int.TryParse(userEnter[i], out n);
    if(isNumeric == true)
    {
      userLottery[k] = int.Parse(userEnter[i]);
      k++;
    }
  }

答案 3 :(得分:0)

您的代码与用户的指令不匹配。以下是您告诉用户的内容:

  Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:");
  int[] userLottery = new int[7];

  int i = 0;
  while (i < 7)
  {
      Console.Write("Your choice #{0}: ", i+1);
      string userRow = Console.ReadLine();
      int userNumber;

      if (!Int32.TryParse(userRow, out userNumber) || userNumber < 1 || userNumber > 39)
      {
          Console.WriteLine("Invalid number! Please try again!");
      }
      else
      {
          userLottery[i++] = userNumber;
      }
  }

答案 4 :(得分:0)

使用以下代码

        Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:");

        string data = Console.ReadLine();

        int[] userLottery = new int[7];
        int i = 0;

        StringBuilder num = new StringBuilder();
        foreach (char item in data)
        {


            if (!Char.IsDigit(item))
            {
                if (num.Length == 0)
                    continue;
                userLottery[i] = int.Parse(num.ToString());
                i++;
                num.Clear();
                continue;
            }

            num.Append(item);
        }

        if(num.Length > 0)
            userLottery[i] = int.Parse(num.ToString());