Regex pour les nombres uniquement

309

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 ne corresponde que lorsque la chaîne contenue est composée de tous les nombres; mais avec les deux exemples ci-dessous, il correspond à une chaîne qui contient tous les nombres plus un signe égal comme "1234 = 4321". Je suis sûr qu'il existe un 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 compte, j'utilise C # et .NET2.0.

Timothy Carter
la source
6
Avez-vous besoin de faire correspondre des nombres ou des chiffres ? Par exemple: 123,456 est un nombre, mais ce ne sont pas tous des chiffres.
Joel Coehoorn
Exactement, OP n'est pas totalement clair sur l'utilisation d'entiers ou non
Sune Rievers
3
Pourquoi ne pas essayer la chaîne pour ce cas simple? bool decimal.TryParse (chaîne de chaîne, résultat décimal de sortie) ou bool int.TryParse (chaîne de chaîne, résultat de sortie int)
Makach
Regardez cette réponse pour un traitement définitif de l'analyse des nombres avec des expressions régulières.
tchrist
1
En général, la façon la plus simple de dépanner les expressions Regex, à mon avis, est d'utiliser un interpréteur de ligne de commande, si votre langue le permet (semble que la plupart le font). Étant donné que cet exemple est en C #, vous pouvez utiliser linqpad.net , ou vous pouvez utiliser un point d'arrêt dans le débogueur, puis utiliser la fenêtre Exécution dans VS en tant que CLI.
andrew

Réponses:

478

Utilisez les ancres de début et de fin.

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

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


Notez que "\d"cela correspondra [0-9]et d'autres caractères numériques comme les chiffres arabes orientaux ٠١٢٣٤٥٦٧٨٩. Utilisez "^[0-9]+$"pour restreindre 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 le guide complet de @tchrist pour analyser les nombres avec des expressions régulières .

Bill le lézard
la source
Que diriez-vous d'un nombre défini de valeurs numériques? C'est généralement le cas pour les codes postaux de certains pays comme l'Inde. Je suppose que nous devrons peut-être faire une vérification de la longueur de la chaîne après cela?
Najeeb
2
@Najeeb Oui, puisque les codes postaux indiens sont des nombres à 6 chiffres, vous pouvez utiliser quelque chose comme "^\d{6}$". Certains autres pays ont des règles plus compliquées pour les codes postaux, donc les solutions regex pour plusieurs pays peuvent aussi devenir assez compliquées. Découvrez quelques exemples sur stackoverflow.com/q/578406/1288
Bill the Lizard
Comment se fait-il que si la chaîne d'entrée est quelque chose comme: "3 a", elle correspondra toujours? Est-ce que quelqu'un sait comment je peux le faire correspondre UNIQUEMENT s'il y a des chiffres, et rien d'autre (sauf pour un signe négatif, je suppose). Je l'ai actuellement configuré comme ceci "-? [0-9] +".
Matthew
105

Votre expression régulière correspondra à tout ce qui contient un nombre, vous souhaitez utiliser des ancres pour correspondre à la chaîne entière, puis correspondre à un ou plusieurs nombres:

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

Le ^va ancrer le début de la chaîne, le $va ancrer la fin de la chaîne et le +va correspondre à un ou plusieurs de ce qui le précède (un nombre dans ce cas).

Robert Gamble
la source
38

Si vous devez tolérer la virgule décimale et le marqueur mille

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

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

Andy
la source
@Florin Ghita. Merci. "-" doit être au début.
Andy
3
Cette expression régulière permet également à tort que le signe négatif principal ( -) et la période ( .) se produisent plusieurs fois.
DavidRR
5
vous pouvez faire -et en .option via ?. -?\d+(?:\.\d+)?correspondrait à des nombres entiers ou décimaux. (Le ?:dans les parens fait juste des parens un groupe non-capturant et utilisé uniquement pour le groupe pour plus de clarté.)
butterywombat
2
Il échoue pour les cas marginaux comme 1, 0,5, mais si vous supervisez cela. il échoue quand même pour les cas basiques comme -2. Veuillez le modifier ^-?[0-9][0-9,\.]*$pour éviter d'échouer pour le cas de base. + est remplacé par *
PrivateOmega
Un scénario qui me manque ici est la notation Engineering (1.2345e-4) une suggestion à ce sujet?
WolfiG
18

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 rechercher spécifiquement le début et la fin de la chaîne.

^\d+$
kasperjj
la source
16

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

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }
Raz Megrelidze
la source
3
Gardez à l'esprit que cela Char.IsDigitretourne truepour tout caractère membre de la catégorie UnicodeCategory.DecimalDigitNumber . Ce n'est peut-être pas ce que souhaite le PO. Voir aussi pourquoi Char.IsDigit renvoie true pour les caractères qui ne peuvent pas être analysés en int? .
DavidRR
16

Cela fonctionne avec des nombres entiers et décimaux. Il ne correspond pas si le nombre a le séparateur coma mille,

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

quelques chaînes qui correspondent à ceci:

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

quelques chaînes qui ne le font pas:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.
ultraklon
la source
11

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

Mark Brackett
la source
10

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

^[0-9]+$

1425 TRUE

0142 TRUE

0 VRAI

1 VRAI

154a25 FAUX

1234 = 3254 FAUX

Ujjal Suttra Dhar
la source
10

Voici mon travail:

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

Et quelques 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

Marina K.
la source
".3", "3." sont en fait de bons nombres (signifiant respectivement 0,3 et 3,0). nous le voyons tout le temps dans les systèmes source, et la plupart des fonctions to_number (xx) des langues que vous avez mentionnées les reconnaîtront et les convertiront correctement. Merci.
Tagar
1
@Ruslan, vous avez raison: dans de nombreux systèmes ".3", "3". analyserait un nombre valide et utilisé comme vous l'avez mentionné "0,3" et "3,0". Mais d'autre part - c'est une valeur convertie , donc originale valeur d' ".3" et "3." n'est pas vraiment un numéro existant.
Marina K.
9

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

[0-9]*

Pour un ou plusieurs chiffres:

[0-9]+
fnc12
la source
7

Bien qu'aucune des solutions ci-dessus ne convienne à mon objectif, 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"

Daniele D.
la source
4

Une autre façon: si vous souhaitez faire correspondre des numéros internationaux tels que le persan ou l'arabe, vous pouvez donc utiliser l'expression suivante:

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

Pour faire correspondre l'utilisation de caractère de période littérale:

Regex = new Regex(@"^[\p{N}\.]+$");
SMMousavi
la source
4

utilisez des ancres de début et de fin.

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

Regex pour les nombres entiers et à virgule flottante:

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

Un nombre peut commencer par un point (sans les premiers chiffres) et un nombre peut se terminer par un point (sans les derniers chiffres). Au-dessus de l'expression régulière, les deux seront reconnus comme des nombres corrects.

UNE . (point) lui-même sans chiffres n'est pas un nombre correct. C'est pourquoi nous avons besoin de deux parties d'expressions régulières (séparées par un "|").

J'espère que cela t'aides.

Tagar
la source
1
Il s'agit de la solution la plus complète. Félicitations!
Renato Medeiros
2

Je pense que celui-ci est le plus simple et il accepte la manière européenne et américaine d'écrire des nombres, par exemple USA 10.555,12 European 10.555,12 De plus, celui-ci ne permet pas plusieurs virgules ou points l'un après l'autre, par exemple 10..22 ou 10, .22 En plus de ces chiffres comme .55 ou, 55 passeraient. Cela peut être utile.

^([,|.]?[0-9])+$
Azur
la source
1

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

James Selvakumar
la source
-4

Regex regex = nouveau Regex ("^ [0-9] {1,4} = [0-9] {1,4] $")

Giri babu vuppula
la source
5
Pouvez-vous expliquer un peu votre réponse s'il vous plaît? Vous remarquerez que les autres réponses à cette question ont un certain niveau d'explication de ce que fait chaque partie de l'expression rationnelle, ce qui vous manque.
Wai Ha Lee