Je veux faire correspondre un nombre inférieur ou égal à 100, cela peut être compris entre 0 et 100, mais l'expression régulière ne doit pas correspondre pour un nombre supérieur à 100, tel que 120, 130, 150, 999, etc.
Essaye ça
\b(0*(?:[1-9][0-9]?|100))\b
Explication
"
\b # Assert position at a Word boundary
( # Match the regular expression below and capture its match into backreference number 1
0 # Match the character “0” literally
* # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
(?: # Match the regular expression below
# Match either the regular expression below (attempting the next alternative only if this one fails)
[1-9] # Match a single character in the range between “1” and “9”
[0-9] # Match a single character in the range between “0” and “9”
? # Between zero and one times, as many times as possible, giving back as needed (greedy)
| # Or match regular expression number 2 below (the entire group fails if this one fails to match)
100 # Match the characters “100” literally
)
)
\b # Assert position at a Word boundary
"
Visitez (lien supprimé) pour les problèmes futurs.
Que diriez-vous de cela pour la regex:
^([0-9]|[1-9][0-9]|100)$
cela validerait 7, 82, 100 pour des exemples, mais not validerait 07 ou 082.
Cochez cette case pour plus d'informations (et leurs variations, y compris le préfixage zéro) sur la vérification de la plage de numéros
Si vous devez gérer des nombres à virgule flottante, vous devriez lisez ceci , voici une expression que vous pouvez utiliser:
Virgule flottante: ^[-+]?([0-9]|[1-9][0-9]|100)*\.?[0-9]+$
Utilisez Code Assertions si vous avez besoin d’une expression rationnelle (éventuellement):
/^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/
Tester:
my @nums = (-1, 0, 10, 22, 1e10, 1e-10, 99, 101, 1.001e2);
print join ',', grep
/^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/,
@nums
Résultat:
0,10,22,1e-010,99
Mon conseil pratique.
Personnellement, je m'abstiendrais d'écrire une regex aussi complexe. Et si votre nombre passait de 100 à 200 dans un avenir proche. Votre regex devra changer de manière significative et il sera peut-être encore plus difficile à écrire. Toutes les solutions ci-dessus ne sont pas explicites et vous devrez les compléter avec un commentaire dans votre code. C'est une odeur.
La lisibilité est importante. Le code est pour les humains et non pour les machines.
Pourquoi ne pas écrire du code autour de lui et garder regex morte simple à comprendre.
cela correspond à 0 à 100
^0*([0-9]|[1-8][0-9]|9[0-9]|100)$
Ce regEx correspond aux chiffres 0 à 100 diapason et interdit les numéros comme 001:
\b(0|[1-9][0-9]?|100)\b
regex pour cela
Perl -le 'for (qw/0 1 19 32.4 100 77 138 342.1/) { print "$_ is ", /^(?:100|\d\d?)$/ ? "valid input" : "invalid input"}'