Попробуйте это:
/^(?:[1-9]|[1-4][0-9]|50)$/
UPDATE:
Теперь, когда я вижу этот вопрос был обновлен, чтобы обратиться к MySQL, это существенно меняет дело. Вышеупомянутое регулярное выражение использует не-захват parens, которые не поддерживаются 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)
Это работает, но он будет выполнять плохо на больших наборах данных, поскольку она не может у se индекс, даже если он присутствует. 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)
Этот запрос будет хорошо работать, поскольку он может использовать индекс, а также более читабельным и более удобным. Выигрывает со всех сторон.
привет, спасибо за ваш комментарий. Я пытаюсь сделать следующее в MySQL: Выберите 1 REGEXP '/^(?: [1-9] | [1-4] [0-9] | 50) $ /', но при этом возникает ошибка: Got error ' операнд-оператор повторения недействителен "из regexp. Я видел, что это может быть связано с тем, что вы не избегаете обратного слэша, и я попытался сделать // вместо /, но все равно не работал ... Любые идеи? – Tim 2010-12-03 08:50:33
@Tim: Проблема, вероятно, в синтаксисе `(?: ...)`, в котором вводится группа, не захватывающая запись. Похоже, что MySQL этого не поддерживает, и пытается рассматривать `?` Как оператор повторения, хотя, конечно, ему нечего повторять. Если вы замените `(?: ...)` обычными скобками `(...)`, он должен работать. – 2010-12-03 10:53:07
Спасибо, я попробовал, но/^ (([1-9] | [1-4] [0-9] | 50) $ /), но он не соответствует правильным цифрам. – Tim 2010-12-03 11:36:57