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.


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 .


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).


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.


@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+$

16

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

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

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.

11

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


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


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


".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]+

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"


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}\.]+$");

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.

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.


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])+$

1

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


-4

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.