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 parens non-capturantes qui ne sont pas supportées par MySQL. Mais cela soulève aussi la question. devriez-vous vraiment utiliser des expressions régulières pour résoudre ce problème? Nous devons vraiment regarder comment vous stockez vos chiffres qui doivent être entre 1 et 50. Sont-ils varchar
s? Sont-ils int
s? Je vais montrer comment le résoudre dans 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 mettre des données de test dans ce fait que tous nos 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 résoudra 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 u se un index même si l'un 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 compris entre 1 et 50 ont été stockés sous la forme int
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 fonctionnera bien car elle peut utiliser un index et elle est aussi plus lisible et plus facile à maintenir. Gagne tout autour.
Salut, merci pour votre commentaire. J'essaie ce qui suit dans MySQL: Sélectionnez 1 REGEXP '/^(?: [1-9] | [1-4] [0-9] | 50) $ /' mais il arrive avec l'erreur: Erreur ' opérande de répétition-opérateur invalide 'de regexp. J'ai vu que cela pourrait être dû à ne pas échapper à un backslash, et j'ai essayé de faire // au lieu de/mais ne fonctionnait toujours pas ... Des idées? – Tim
@Tim: Le problème est probablement la syntaxe '(?: ...)', qui introduit un groupe non-capturant. Il semble que MySQL ne supporte pas cela, et essaie de traiter '?' Comme un opérateur de répétition, bien que cela n'ait rien à répéter. Si vous remplacez '(?: ...)' par des parenthèses ordinaires '(...)', cela devrait fonctionner. –
Merci, j'ai essayé mais/^ (([1-9] | [1-4] [0-9] | 50) $ /) mais il ne correspond pas aux chiffres corrects. – Tim