1
votes

Comment s'assurer qu'une chaîne ne contient que certains caractères autorisés en C #

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.


7 commentaires

Vous avez besoin d'un @ "^ [0-9] + [0-9] + $" ou @ "^ [0-9] + \ s [0-9] + $" ou @ "^ [0-9] + \ s + [0-9] + $" regex


Une 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 int en utilisant le Int32.TryParse méthode.


acceptez-vous uniquement Int32 , ou des entiers longs arbitraires feront l'affaire, par exemple "123456789012345678901234567890 1" ?


3 Réponses :


0
votes

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.

Regex.Match (String) sur MSDN


0 commentaires

2
votes

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.


2 commentaires

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»



0
votes

Quelques changements:

  • L'utilisation de string.Split est un moyen plus simple d'obtenir les nombres gauche / droite. Vous pouvez alors rechercher exactement 2 parties.
  • Vous avez besoin d'un symbole + 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);

dotnetfiddle


1 commentaires

Cela l'a résolu! Merci!