试试这个:
/^(?:[1-9]|[1-4][0-9]|50)$/
更新:
现在我看到问题已经更新以引用MySQL,这会显着改变.上述正则表达式使用MySQL不支持的非捕获parens.但它也引出了一个问题;你真的应该使用正则表达式来解决这个问题吗?我们真的要看看你如何存储必须在1到50之间的数字.它们是varchars吗?他们是彗星吗?我将演示如何以两种方式解决它.首先,我将建立一个带索引的测试表:
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_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)
此查询将表现良好,因为它可以使用索引,它也更易读,更易于维护.四处奔走.