Попробуйте это:
/^(?:[1-9]|[1-4][0-9]|50)$/
UPDATE:
Теперь, когда я вижу, что вопрос был обновлен для ссылки на MySQL, это значительно меняет ситуацию. Вышеупомянутое регулярное выражение использует парентные символы без захвата, которые не поддерживаются MySQL. Но это также напрашивается на вопрос; Вы действительно должны использовать регулярные выражения для решения этой проблемы? Нам действительно нужно посмотреть, как вы храните свои номера, которые должны быть от 1 до 50. Они varchar
с? Они int
с? Я покажу, как решить это в обоих направлениях. Сначала я настрою тестовую таблицу с индексами:
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;
Теперь поместите в него некоторые тестовые данные, чтобы убедиться, что все наши крайние случаи покрыты:
insert into regextest (varchar_number, int_number)
values ('0', 0), ('1', 1), ('35', 35), ('49', 49), ('50', 50), ('51', 51);
А теперь, вот запрос, который решит вашу проблему, предполагая, что ваши числа хранятся в виде строк в столбце 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)
Это работает, но оно плохо работает с большими наборами данных, поскольку не может использовать индекс, даже если он присутствует. MySQL должен запускать регулярное выражение один раз для каждой строки в таблице. Предположим, что ваши числа от 1 до 50 были сохранены как int
s в столбце int_number
. Вы можете просто сделать это:
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)
Этот запрос будет работать хорошо, поскольку он может использовать индекс, а также он более читабелен и более удобен в обслуживании. Побеждает все вокруг.