Je crée un programme de calcul de base qui prend ses entrées sous la forme de "num1 num2" d'un utilisateur. Je travaille à faire en sorte que seul ce format d'entrée soit accepté.
C'est C #. J'ai déjà essayé d'utiliser un tableau de liste blanche de tous les nombres et un espace en tant que chaîne [] et char []. J'ai également essayé Regex ainsi qu'une regex hybride et vérifier les espaces blancs. aucun d'entre eux n'a fonctionné pour une raison quelconque.
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);
J'attends une entrée de "1 1" pour réussir cette vérification. mais ce n'est pas le cas.
3 Réponses :
L'expression régulière doit être composée de trois parties:
(nombre) (espace) (nombre)
Donc, l'expression régulière devrait être
(\ d +) (\ d +) .
Vous pouvez également vérifier si la longueur de la partie correspondante est égale à la longueur de l'entrée - sinon, cela signifie que l'entrée contient autre chose.
Si vous n'avez pas besoin de faire une expression régulière, quelque chose comme ça peut fonctionner:
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;
}
}
La solution complète pourrait ressembler à ceci:
var values = input.Split(' ');
int value;
if (values.Length == 2 && values.All(v => int.TryParse(v, out value))
{
//do stuff
}
À mon humble avis, il n'y a rien de mal avec le do.. while mais comme vous utilisez déjà une variable de boucle, je pense que l'utilisation de while communique mieux au début que vous entrez dans une boucle qui dépend du succès du processus en dessous.
int.TryParse (v, out int value) afin de se débarrasser de la int value; déclaration (déplacez-la dans TryParse )
Je suggère d'ajouter StringSplitOptions.RemoveEmptyEntries à Split : soyons gentils et tolérons plusieurs espaces d'affilée, par exemple «123 456»
Quelques changements:
string.Split est un moyen plus simple d'obtenir les nombres gauche / droite. Vous pouvez alors rechercher exactement 2 parties. + dans votre regex qui indique 1 ou plus, sinon votre expression régulière testera false si l'entier est supérieur à 1 chiffre. Il existe d'autres façons d'accomplir cette même chose, comme utiliser int.TryParse , mais cela fonctionne bien pour ce dont vous aviez besoin.
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);
Cela l'a résolu! Merci!
Vous avez besoin d'un
@ "^ [0-9] + [0-9] + $"ou@ "^ [0-9] + \ s [0-9] + $"ou@ "^ [0-9] + \ s + [0-9] + $"regexUne calculatrice doit utiliser Decimal.TryParse ().
Vous avez dit «nombre», vouliez-vous dire «entier à un chiffre»?
Salut Evan, bienvenue à SO. Lorsque je travaille avec regex, j'ai trouvé regex101.com un outil très utile, principalement en raison de sa ventilation et de son explication de chaque partie individuelle de votre modèle.
deux nombres entiers quelconques devraient fonctionner pour cela. donc "11 256" devrait fonctionner aussi bien que "1 1"
Je pense que l'utilisation d'une expression régulière est un peu trop, vous pouvez diviser l'entrée par espace, vérifier s'il y a deux éléments puis vérifier si chacun d'eux est un
inten utilisant leInt32.TryParseméthode.acceptez-vous uniquement
Int32, ou des entiers longs arbitraires feront l'affaire, par exemple"123456789012345678901234567890 1"?