web-dev-qa-db-fra.com

c # Regex pour les nombres et les tirets uniquement

J'ai le code suivant dans mon code c # - ce que j'aime faire, c'est vérifier si l'expression a des chiffres ou un tiret, mais rien d'autre. Si je tape la lettre K avec un tiret ou un chiffre, elle l’accepte quand même. Comment est-ce que je dis juste avoir le nombre exprès ou un tiret:

     Match match = Regex.Match(input, @"[0-9-]");

Notez que la saisie est le texte que je passe pour l’évaluation. 

18
Nate Pet
Match match = Regex.Match(input, @"^[0-9-]*$");

Le ^ signifie que la correspondance doit commencer au début de l'entrée, le $ qu'il doit se terminer à la fin de l'entrée.

Le * signifie que (seulement) 0 ou plusieurs chiffres ou tirets doivent être présents (utilisez + à la place de 1 ou plus).

36
Hans Kesting

Votre regex correspond à ce que n'importe quel chiffre ou tiret existe dans la chaîne, essayez ceci:

Regex.Match(input, @"^[\d-]+$");

^ Début de chaîne

[\d-]+ un ou plusieurs chiffres ou tirets

$ fin de chaîne

10
mynameiscoffey

N'importe lequel des regex suivants fonctionnera correctement.

[0-9\-]+  ( + one or more occurance)

[\d\-]+ (as \d represents numbers)

si vous voulez - doit être entre chiffres

[\d]+\-*[\d]+ will match any of following
90909900
9090-9009
900--900

si vous voulez utiliser un seul - ou aucun - entre les chiffres, puis 

[\d]+\-?[\d]+ will match any of following
90909900 pass
9090-9009 pass
900--900 fail
3
Manas

Vous devez échapper au second tiret.

Match match = Regex.Match(input, @"[0-9\-]");

J'admets que je n'ai pas essayé, mais ça devrait marcher.

Cela ne fonctionnera réellement qu'avec un seul personnage. Si vous voulez qu'il prenne plus d'un caractère, comme "123-5", changez votre expression régulière en ..

Match match = Regex.Match(input, @"[0-9\-]+");
1
Jesse Webb

Si c'est un tableau de chaînes, envisagez de le faire avec LINQ?

if (arrInput.Any(s => (!Regex.IsMatch(s, @"^[\d-]+$")))){ //OK }
0
Salty