正则表达式为1-50,不带小数点

时间:2010-12-03 06:22:52

标签: mysql regex digits

我正在寻找一个正则表达式,它将匹配1到50之间的任何数字。到目前为止,我已经找到了示例,但它们都允许字符串包含小数点,我不想包含它。所以1,13,24,50可以,但1.等等。是否有可以使用的REGEXP?

提前致谢, 添

5 个答案:

答案 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)或
  • 后跟1-4后跟任何数字,或
  • 接着是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