Quelle est l'expression régulière de "Tout entier positif, à l'exclusion de 0"

91

Comment peut- ^\d+$on améliorer pour interdire 0?

EDIT (Rendez-le plus concret):

Des exemples pour permettre:
1
30
111 Des
exemples d'interdire:
0
00
-22

Peu importe si les nombres positifs avec un zéro non significatif sont autorisés ou non (par exemple 022).

Ceci est pour l'implémentation Java JDK Regex.

Zeemee
la source
2
Voulez-vous accepter, par exemple 076,?
Karl Knechtel - loin de chez soi
@Karl Knechtel: Mais je peux sacrifier cette fonctionnalité par souci de simplicité.
Zeemee
3
«Tout entier positif, à l'exclusion de 0», notez que 0 n'est pas un entier positif.
SK9

Réponses:

176

Essaye ça:

^[1-9]\d*$

... et un peu de remplissage pour dépasser la limite de réponse de 30 caractères SO :-).

Voici la démo

Tomasz Nurkiewicz
la source
Juste par curiosité, pourquoi avons-nous besoin de \ d + à la fin? Pourquoi ne ^[1-9]+$marcherait pas ?
mtahmed
18
@mtahmed: ^[1-9]+$ne permettrait pas 10
Lie Ryan
1
Cela autorisera 1. "\ d *" correspond également à la chaîne vide.
Daniel
@mtahmed ^[1-9]+$ne le permettrait pas 10. @Mulmoth la suggestion permettra 1, car \d*correspond à zéro fois ou plus. Cependant, cela ne le permettra pas 076, car cela ne commence pas par un [1-9].
Karl Knechtel - à l'extérieur de la maison
2
Mais qu'en est-il 01?
Museful
71

Désolé d'être arrivé en retard mais le PO veut autoriser 076mais ne veut probablement PAS autoriser 0000000000.

Donc, dans ce cas, nous voulons une chaîne d'un ou plusieurs chiffres contenant au moins un non nul . C'est

^[0-9]*[1-9][0-9]*$
Ray Toal
la source
Cela semble répondre à ce que le PO voulait
Abdul
je veux un entier positif et un décimal positif. vous avez une solution?
Vous devriez poser cela comme une nouvelle question plutôt que comme un commentaire. Mais spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$mais c'est faire une hypothèse sur ce que vous entendez par «décimal». Avez-vous besoin de pièces d'exposant? C'est assez compliqué, alors posez une autre question.
Ray Toal
1
+1 pour considérer le cas d'angle! BTW, ce modèle fonctionnera exactement de la même manière: ^0*[1-9]\d*$puisque le premier [0-9]*n'est actif que jusqu'à ce qu'il [1-9]trouve le premier non nul, c'est-à-dire qu'il n'est actif que jusqu'à ce qu'il y ait des zéros initiaux ( 0*).
mg007
1
C'est la bonne réponse. Il accepte 00098 qui est le comportement correct selon la question.
Varun Sharma
20

Vous pouvez essayer une assertion d'anticipation négative:

^(?!0+$)\d+$
Karl Knechtel - loin de chez soi
la source
30
Oh mon dieu, j'ai peur.
Daniel
1
Cela permet 01, 02, etc…
Matijs
12

Essayez celui-ci, celui-ci fonctionne le mieux pour répondre aux exigences.

[1-9][0-9]*

Voici l'exemple de sortie

String 0 matches regex: false
String 1 matches regex: true
String 2 matches regex: true
String 3 matches regex: true
String 4 matches regex: true
String 5 matches regex: true
String 6 matches regex: true
String 7 matches regex: true
String 8 matches regex: true
String 9 matches regex: true
String 10 matches regex: true
String 11 matches regex: true
String 12 matches regex: true
String 13 matches regex: true
String 14 matches regex: true
String 15 matches regex: true
String 16 matches regex: true
String 999 matches regex: true
String 2654 matches regex: true
String 25633 matches regex: true
String 254444 matches regex: true
String 0.1 matches regex: false
String 0.2 matches regex: false
String 0.3 matches regex: false
String -1 matches regex: false
String -2 matches regex: false
String -5 matches regex: false
String -6 matches regex: false
String -6.8 matches regex: false
String -9 matches regex: false
String -54 matches regex: false
String -29 matches regex: false
String 1000 matches regex: true
String 100000 matches regex: true
Palash Kanti Kundu
la source
2
Merci, mais cela n'ajoute aucune valeur ou élégance par rapport à la réponse acceptée [1-9]\d*.
Zeemee
1
@Zeemee qui n'est pas correct car \ d peut inclure des chiffres qui ne sont pas 0-9. Par exemple, des chiffres arabes comme واحد dans certaines bibliothèques.
dummyDev
@dummyDev Je n'étais pas au courant de cela. Merci d'avoir mentionné!
Zeemee
Malheureusement, cela reviendra vrai pour "123abcd".
Charith Jayasanka
Charith Jayasanka - oui, il lui faut encore un ^ au début et un "$" à la fin :-)
Steve Baroti
7

^\d*[1-9]\d*$

cela peut inclure toutes les valeurs positives, même si elle est complétée par zéro à l'avant

Permet

1

01

dix

11 etc.

ne permettent pas

0

00

000 etc.

manoj
la source
3

Tout entier positif, à l'exclusion de 0: ^\+?[1-9]\d*$
Tout entier positif, y compris 0:^(0|\+?[1-9]\d*)$

user11856357
la source
2

J'ai celui-ci:

^[1-9]|[0-9]{2,}$

Quelqu'un le bat? :)

Zeemee
la source
3
Cela permettrait 00Voulez-vous cela? Et cela permettra 1aaaaaet abcd01. ^appartient uniquement à la première alternative et $uniquement à la seconde, pour résoudre ce problème, mettez des crochets autour d'elle^([1-9]|[0-9]{2,})$
stema
Eh bien, cela accepte 000000000. Vous avez dit n'importe quel entier à l' exclusion de zéro .
Ray Toal
2

Juste pour le plaisir, une autre alternative utilisant les lookaheads:

^(?=\d*[1-9])\d+$

Autant de chiffres que vous le souhaitez, mais au moins un doit l'être [1-9].

porges
la source
2

Vous voudrez peut-être ceci (modifier: autoriser le numéro du formulaire 0123):

^\\+?[1-9]$|^\\+?\d+$

cependant, si c'était moi, je ferais plutôt

int x = Integer.parseInt(s)
if (x > 0) {...}
Mensonge Ryan
la source
1
Deux problèmes: cela correspond également à "123abc" et renvoie 123, ce qui peut générer une exception ParseException.
Daniel
@Daniel: Je suppose que cela pourrait être utilisé dans un schéma d'analyse plus large, donc vous auriez un regex / BNF qui capture uniquement les chiffres, et un code java pour vérifier que les chiffres capturés sont positifs non nuls.
Lie Ryan
@Daniel: dans tous les cas, vous auriez toujours besoin des données sous forme d'entier et donc tôt ou tard vous devrez encore appeler parseInt () ou lancer votre propre parseInt ().
Lie Ryan
@Daniel: Integer.parseInt()lui - même ajoute très peu de frais généraux. C'est le lancement et la capture d'exceptions qui coûtent cher.
Alan Moore
@Lie: quel est le problème avec les \\+?préfixes? Je suppose que c'est censé être un signe plus échappé tel qu'il apparaîtrait dans le code source Java, mais pourquoi? Si les signes moins ne sont pas autorisés, je pense qu'il est prudent de supposer que les signes plus sont également absents.
Alan Moore
0

Ce RegEx correspond à tout entier positif sur 0:

(?<!-)(?<!\d)[1-9][0-9]*

Il fonctionne avec deux regards négatifs, qui recherchent un moins avant un nombre, ce qui indique qu'il s'agit d'un nombre négatif. Cela fonctionne également pour tout nombre négatif supérieur à -9 (par exemple -22).

Alexander Hammans
la source
0

Mon modèle est compliqué, mais il couvre exactement "Tout entier positif, à l'exclusion de 0" (1 - 2147483647, pas long). C'est pour les nombres décimaux et n'autorise pas les zéros non significatifs.

^((1?[1-9][0-9]{0,8})|20[0-9]{8}|(21[0-3][0-9]{7})|(214[0-6][0-9]{6})
|(2147[0-3][0-9]{5})|(21474[0-7][0-9]{4})|(214748[0-2][0-9]{3})
|(2147483[0-5][0-9]{2})|(21474836[0-3][0-9])|(214748364[0-7]))$
OleksiiMLD
la source
-2

^ [1-9] * $ est le plus simple auquel je puisse penser


la source
Cette expression régulière échouera par erreur à faire correspondre des nombres tels que 10et 29303. Il correspondra également à une chaîne vide.
OmnipotentEntity
-3

Cela ne devrait autoriser que les décimales> 0

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