web-dev-qa-db-fra.com

Regex pour les nombres seulement

Je n'ai pas du tout utilisé d'expressions régulières, j'ai donc du mal à résoudre les problèmes. Je veux que l'expression régulière corresponde uniquement lorsque la chaîne contenue est composée de tous les nombres; mais avec les deux exemples ci-dessous, cela correspond à une chaîne qui contient tous les nombres plus un signe égal comme "1234 = 4321". Je suis sûr qu'il y a moyen de changer ce comportement, mais comme je l'ai dit, je n'ai jamais vraiment fait grand chose avec les expressions régulières.

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

Au cas où cela importerait, j'utilise C # et .NET2.0.

274
Timothy Carter

Utilisez les ancres de début et de fin.

Regex regex = new Regex(@"^\d$");

Utilisez "^\d+$" si vous devez faire correspondre plusieurs chiffres.


Notez que "\d" correspondra à [0-9] et à d'autres caractères numériques tels que les chiffres de l'arabe orientale ٠١٢٣٤٥٦٧٨٩. Utilisez "^[0-9]+$" pour limiter les correspondances aux seuls chiffres arabes 0 à 9.


Si vous devez inclure des représentations numériques autres que des chiffres (comme des valeurs décimales pour les débutants), consultez @ tchrist 's guide complet pour l'analyse de nombres avec des expressions régulières .

439
Bill the Lizard

Votre regex correspondra à tout ce qui contient un nombre, vous voulez utiliser des ancres pour faire correspondre toute la chaîne, puis un ou plusieurs nombres:

regex = new Regex("^[0-9]+$");

Le ^ ancrera le début de la chaîne, le $ ancrera la fin de la chaîne et le + correspondra à un ou plusieurs de ce qui le précède (un numéro dans ce cas ).

94
Robert Gamble

Si vous devez tolérer le point décimal et le marqueur de milliers

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

Vous aurez besoin d'un "-" si le nombre peut devenir négatif.

34
Andy

Il correspond, car il trouve "une correspondance" et non une correspondance de la chaîne complète. Vous pouvez résoudre ce problème en modifiant votre expression rationnelle pour qu'elle recherche spécifiquement le début et la fin de la chaîne.

^\d+$
17
kasperjj

Peut-être que ma méthode vous aidera.

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }
15
Raz Megrelidze

Cela fonctionne avec des nombres entiers et décimaux. Cela ne correspond pas si le nombre contient le séparateur de milliers de coma,

"^-?\\d*(\\.\\d+)?$"

quelques chaînes qui correspondent à ceci:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

des chaînes qui ne le font pas:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.
14
ultraklon

^\d + $, qui est "début de chaîne", "1 ou plusieurs chiffres", "fin de chaîne" en anglais.

11
Mark Brackett

Voici mon travail:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

Et des tests

Tests positifs:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

Tests négatifs:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

Vérifié non seulement pour C #, mais aussi avec Java, Javascript et PHP

10
Marina K.

Désolé pour le formatage laid. Pour n'importe quel nombre de chiffres:

[0-9]*

Pour un ou plusieurs chiffres:

[0-9]+
9
fnc12

Si vous devez vérifier si tous les chiffres sont des nombres (0-9) ou non,

^[0-9]+$

1425 VRAI

0142 TRUE

0 VRAI

1 VRAI

154a25 FAUX

1234 = 3254 FAUX

9

Bien qu'aucune des solutions ci-dessus ne corresponde à mes objectifs, cela a fonctionné pour moi.

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

Exemple de valeurs valides: "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

Exemple de valeurs non valides: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"

5
Daniele D.

Autre méthode: si vous souhaitez faire correspondre des numéros internationaux tels que le persan ou l’arabe, vous pouvez utiliser l’expression suivante:

Regex = new Regex(@"^[\p{N}]+$");

Pour correspondre à un caractère de période littéral, utilisez:

Regex = new Regex(@"^[\p{N}\.]+$");
4
S.M.Mousavi

utiliser des ancres de début et de fin.

 Regex regex = new Regex(@"^\d$");
 Use "^\d+$" if you need to match more than one digit.
3
lipika chakraborty

Je pense que celui-ci est le plus simple et qu’il accepte, par exemple, les chiffres européens et américains. USA 10 555,12 Européen 10 555,12 Celui-ci n'autorise pas non plus plusieurs virgules ou points l'un après l'autre, par ex. 10..22 ou 10, .22 En plus de cela, des nombres tels que .55 ou, 55 passeraient. Cela peut être pratique.

^([,|.]?[0-9])+$
2
Azur

Regex pour les nombres entiers et les nombres en virgule:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

Un numéro peut commencer par un point (sans chiffres de début) et un numéro peut se terminer par un point (sans les derniers caractères). Ci-dessus, l'expression rationnelle reconnaîtra les deux nombres corrects. UNE . (point) lui-même sans chiffres n'est pas un nombre correct. C'est pourquoi nous avons besoin de deux parties de regex (séparées par un "|").

J'espère que cela t'aides.

2
Tagar

Si vous souhaitez extraire uniquement des nombres d'une chaîne, le modèle "\ d +" devrait vous aider.

1
James Selvakumar