Как убедиться, что строка содержит только определенные разрешенные символы в C # - PullRequest
1 голос
/ 23 мая 2019

Я делаю основную программу калькулятора, которая получает от пользователя свои входные данные в форме "num1 num2".Я работаю над тем, чтобы принять только тот формат ввода.

Это C #.Я уже пытался использовать массив белых чисел и пробел в качестве как string [], так и char [].Я также попробовал регулярное выражение, а также гибридное регулярное выражение и проверку на наличие пустого пространства.по какой-то причине ни один из них не работал.

string input = "";
int numCheck = 0;
Regex whiteList = new Regex("^[1234567890]$");
do
{
  numCheck = 0;
  Console.Write("Please input the two numbers you wish to use seperated by a space: ");
  input = Console.ReadLine();
  if (input.IndexOf(" ") == -1 || input.Length <= 2 || input.Substring(input.IndexOf(" ")+1).IndexOf(" ") != -1 || (!whiteList.IsMatch(input) && !input.Any(x => Char.IsWhiteSpace(x))));
  {
    Console.WriteLine($"You entered \"{input}\" You did not enter two numbers seperated by a space, please try again.");
    numCheck = 1;
  }
} while (numCheck == 1);

Я ожидаю, что ввод "1 1" пройдет эту проверку.но это не так.

Ответы [ 3 ]

2 голосов
/ 23 мая 2019

Если вам не нужно выполнять регулярные выражения, может сработать что-то вроде этого:

var values = input.Split(' ');
int value;
if (values.Length == 2 && values.All(v => int.TryParse(v, out value)) 
{
    //do stuff
}

Полное решение может выглядеть так:

string input = "";
bool success = false;
while (!success) 
{
    Console.Write("Please input the two numbers you wish to use seperated by a space: ");
    input = Console.ReadLine();

    var values = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    if (values.Length != 2 || !values.All(v => int.TryParse(v, out int value))
    {
        Console.WriteLine($"You entered \"{input}\" You did not enter two numbers separated by a space, please try again.");
    }
    else 
    {
        success = true;
    }
}

ИМХО, в do..while нет ничего плохого, но, поскольку вы уже используете переменную цикла, я думаю, что просто while лучше сообщает с самого начала, что вы входите в цикл, который зависит от успеха процесс под ним.

0 голосов
/ 23 мая 2019

Некоторые изменения:

  • Использование string.Split - это более простой способ получения левых / правых чисел. Затем вы можете проверить ровно 2 части.
  • Вам требуется символ + в вашем регулярном выражении, который указывает 1 или более, в противном случае ваше регулярное выражение будет проверять ложь, если целое число больше 1 цифры.

Существуют и другие способы выполнить то же самое, например, использование int.TryParse, но это прекрасно работает для того, что, как вы описали, вам нужно.


string input = "";
int numCheck = 0;
Regex whiteList = new Regex("^[1234567890]+$");
do
{
    numCheck = 0;
    Console.Write("Please input the two numbers you wish to use seperated by a space: ");
    input = Console.ReadLine();
    var numbers = input.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries);
    if (numbers.Length != 2 || !numbers.All(num => whiteList.IsMatch(num)))
    {
        Console.WriteLine("You entered " + input + " You did not enter two numbers seperated by a space, please try again.");
        numCheck = 1;
    }
}
while (numCheck == 1);

dotnetfiddle

0 голосов
/ 23 мая 2019

Регулярное выражение должно состоять из трех частей:
(number) (space) (number)
Таким образом, регулярное выражение должно быть (\d+) (\d+).
Вы также можете проверить, равна ли длина совпадающей части длине ввода - если нет, это означает, что вход содержит что-то еще.

Regex.Match (строка) в MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...