Question

Je cherche une expression régulière qui correspond à tout nombre de 1 à 50 inclus. Jusqu'à présent, j'ai trouvé des exemples, mais ils permettent tous la chaîne pour contenir un point décimal, que je ne veux pas inclure. Donc, 1,13,24,50 sont OK mais 1., etc ne sont pas. Y at-il un REGEXP que je peux utiliser?

Merci à l'avance, Tim

Était-ce utile?

La solution

Essayez ceci:

/^(?:[1-9]|[1-4][0-9]|50)$/

Mise à jour:

Maintenant que je vois la question a été mis à jour pour faire référence à MySQL, cela change considérablement les choses. L'expression régulière mentionnée ci-dessus utilise des parenthèses non-capture qui ne sont pas pris en charge par MySQL. Mais il pose aussi la question; si vous vraiment utiliser des expressions régulières pour résoudre ce problème? Nous devons vraiment voir comment vous stockez vos numéros qui doivent être compris entre 1 et 50. Sont-ils varchars? Sont-ils ints? Je vais montrer comment résoudre les deux sens. D'abord, je vais mettre en place une table de test avec des index:

create table regextest (
    id int unsigned primary key auto_increment,
    varchar_number varchar(5) not null,
    int_number int not null,
    index(varchar_number),
    index(int_number)
) engine=innodb;

Maintenant, mettez des données de test dans ce que tous nos faire cas de bord sont couverts:

insert into regextest (varchar_number, int_number)
    values ('0', 0), ('1', 1), ('35', 35), ('49', 49), ('50', 50), ('51', 51);

Et maintenant, voici une requête qui va résoudre votre problème en supposant que vos numéros sont stockés sous forme de chaînes dans la colonne varchar_number:

mysql> select * from regextest where varchar_number rlike '^([1-9]|[1-4][0-9]|50)$';
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
|  2 | 1              |          1 |
|  3 | 35             |         35 |
|  4 | 49             |         49 |
|  5 | 50             |         50 |
+----+----------------+------------+
4 rows in set (0.00 sec)

Cela fonctionne, mais il fonctionnera mal sur de grands ensembles de données, car il ne peut pas utiliser un index, même si l'on est présent. MySQL doit exécuter l'expression régulière une fois pour chaque ligne de la table. Supposons que vos numéros entre 1 et 50 ont été stockés sous forme ints dans la colonne int_number. Vous pouvez simplement faire ceci:

mysql> select * from regextest where int_number between 1 and 50;
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
|  2 | 1              |          1 |
|  3 | 35             |         35 |
|  4 | 49             |         49 |
|  5 | 50             |         50 |
+----+----------------+------------+
4 rows in set (0.00 sec)

Cette requête se produira bien car il peut utiliser un index et il est aussi plus lisible et plus maintenable. Remporte tout autour.

Autres conseils

'^(0?\d|[1-4]\d|50)$'

C'est:

  • Le début de l'entrée
  • suivi d'un seul chiffre (en option précédée d'un 0), ou
  • suivi d'un 1-4 suivi par un chiffre, ou
  • puis 50
  • et veiller à ce que nous voyons la fin de l'entrée.

Edit: 0 ci-dessus permet (et 00) que vous ne voulez pas sûrement. Donc, en admettant que vous ne vouliez pas vraiment des zéros à gauche autorisé de toute façon:

'^([1-9]|[1-4]\d|50)$'

Edit:. que les commentaires plus tard OP indiquent que ceci est pour MySQL, j'ai changé la syntaxe pour spécifier le motif

^ ([1-9] | [1-4] [0-9] | 50) $

essayez celui-ci

([0-4]{1}[0-9]{0,1}[.]{0,1}[0-9]{0,2}|50)

va faire suivant

45.00 - Match
4     - Match
78    - Not Match
51    - Not Match
21.25 - Match

"Tricherie" avec Perl6 :: Règles :

/ ( \d+ ) { 1 <= $1 && $1 <= 50 or fail } /

Ou en Perl 5.10 et plus,

/(\d+)(?(?{1>$1||50<$1})(*FAIL))/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top