我正在寻找一个正则表达式,它将匹配1到50之间的任何数字。到目前为止,我已经找到了示例,但它们都允许字符串包含小数点,我不想包含它。所以1,13,24,50可以,但1.等等。是否有可以使用的REGEXP?
提前致谢, 添
答案 0 :(得分:8)
试试这个:
/^(?:[1-9]|[1-4][0-9]|50)$/
现在我发现问题已经更新以引用MySQL,这会显着改变。上述正则表达式使用MySQL不支持的非捕获parens。但它也引出了一个问题;你真的应该使用正则表达式来解决这个问题吗?我们真的要看看你如何存储必须在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
列中存储为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)
此查询将表现良好,因为它可以使用索引,并且它也更易读,更易于维护。四处游动。
答案 1 :(得分:4)
'^(0?\d|[1-4]\d|50)$'
那是:
编辑:以上允许你肯定不想要的0(和00)。所以,假设你真的不希望无论如何允许前导零:
'^([1-9]|[1-4]\d|50)$'
编辑:由于OP后来的评论表明这是针对MySQL的,我已经更改了指定模式的语法。
答案 2 :(得分:1)
^([1-9] | [1-4] [0-9] | 50)$
答案 3 :(得分:0)
“作弊”Perl6::Rules:
/ ( \d+ ) { 1 <= $1 && $1 <= 50 or fail } /
或者在Perl 5.10及以上,
/(\d+)(?(?{1>$1||50<$1})(*FAIL))/
答案 4 :(得分:0)
尝试这个
([0-4]{1}[0-9]{0,1}[.]{0,1}[0-9]{0,2}|50)
将遵循
45.00 - Match
4 - Match
78 - Not Match
51 - Not Match
21.25 - Match