MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。
MySQL 的正则表达式使用 REGEXP 这个关键字来指定正则表达式的匹配模式,REGEXP 操作符所支持的匹配模式
匹配模式 | 描述 | 实例 |
---|---|---|
^ | 匹配文本的开始字符 | ‘^te’ 匹配一te开头的字符串 |
$ | 匹配文本的结束字符 | ‘xt$’ 匹配以xt结尾的字符串 |
. | 匹配任何单个字符 | ‘t.x’ 匹配任何t和x之间有一个字符的字符串 |
* | 匹配零个或多个在它面前的字符 | ‘t*t’ 匹配t前面有任意个t |
+ | 匹配前面的字符1次或者多次 | ‘’ |
字符串 | 匹配包含指定的字符串 | ‘te’ 匹配含有te的字符串 |
p1|p2 | 匹配P1或P2 | ‘te|xt’ 匹配te或者xt |
[…] | 匹配字符集合中的任意一个字符 | ‘[abc]’ 匹配a或者b或者c |
[^…] | 匹配不在括号中的任何字符 | [^ab] 匹配不包含a或者b的字符串 |
{n} | 匹配前面的字符串n次 | ‘g{2}’ 匹配含有2个g的字符串 |
{n,m} | 匹配前面的字符串至少n次,至多m次 | ‘f{1,3}’ 匹配f最少1次,最多3次 |
了解正则表达式的匹配规则之后,就可以将这些规则技巧应用于 SQL 语句中,从而可以更准确、更快速的查出所需的记录。
下面通过示例的方式详细介绍 MySQL 正则表达式的使用方法。
mysql> select id,name,level from player where name REGEXP '^us';
+-----+---------+-------+
| id | name | level |
+-----+---------+-------+
| 448 | useless | 1 |
+-----+---------+-------+
1 row in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'ss$' ;
+-----+---------+-------+
| id | name | level |
+-----+---------+-------+
| 448 | useless | 1 |
| 713 | guess | 25 |
+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'ok';
+-----+--------+-------+
| id | name | level |
+-----+--------+-------+
| 795 | senoku | 15 |
+-----+--------+-------+
1 row in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'shir.ey';
+------+---------+-------+
| id | name | level |
+------+---------+-------+
| 2460 | shirley | 1 |
+------+---------+-------+
1 row in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'ok|ss';
+-----+---------+-------+
| id | name | level |
+-----+---------+-------+
| 448 | useless | 1 |
| 713 | guess | 25 |
| 795 | senoku | 15 |
+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> select id,name,level from player where name REGEXP 'oooo*';
+------+--------+-------+
| id | name | level |
+------+--------+-------+
| 1735 | oooooo | 1 |
| 2718 | ooo | 1 |
+------+--------+-------+
2 rows in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'oooo+';
+------+--------+-------+
| id | name | level |
+------+--------+-------+
| 1735 | oooooo | 1 |
+------+--------+-------+
1 row in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP '^[d-f]';
+-----+----------------------+-------+
| id | name | level |
+-----+----------------------+-------+
| 199 | D 丶狙击王 | 46 |
| 272 | D 丶抢人头辅助 | 45 |
+-----+----------------------+-------+
2 rows in set (0.00 sec)