使用正则表达式可以检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。
在MySQL中,使用 REGEXP 关键字指定正则表达式的字符匹配模式。
选项 | 说明 | 例子 | 匹配值示例 |
^ | 匹配文本的开始字符 | ^b | book,big,banana |
$ | 匹配文本结束字符 | st$ | test,resist |
. | 匹配任何单个字符 | b.t | bit,bat,but |
* | 匹配零个或多个在它前面的字符 | f*n:匹配字符n前面的0个或多个f字符的字符串 | fn,fan,faan |
+ | 匹配前面的字符1次或多次 | ba+:匹配以 b 开头后面紧跟1个或多个a的字符串 | ba,bay,bare |
<字符串> | 匹配包含指定的字符串的文本 | fa:匹配包含“fa”的字符串 | fan,afa.faad |
[字符集合] | 匹配字符集合中的任何一个字符 | '[xz]':匹配 x 或者 z | dizzy,zebra |
[^] | 匹配不在括号中的任何字符 | '[^abc]':匹配任何不包含a、b、c的字符串 |
desk,fox |
字符串{n,} | 匹配前面的字符串至少n次 | b{2}:匹配有2个或更多的b字符的字符串 | bbb,bbbb |
字符串{n,m} | 匹配前面的字符串至少n次,至多m次。如果n为0,次参数为可选参数 | b{2,4}:匹配至少有2个,最多有4个b字符的字符串 | bb,bbb,bbbb |
1. 查询以特定字符或字符串开头的记录
字符^可以匹配以特定字符或者字符串开头的文本。
【例】在 fruits 表中,查询 f_name 字段以字母 b 开头的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP '^b'; +------+------+------------+---------+ | f_id | s_id | f_name | f_price | +------+------+------------+---------+ | b1 | 101 | blackberry | 10.20 | | b2 | 104 | berry | 7.60 | | t1 | 102 | blanana | 10.30 | +------+------+------------+---------+
2. 查询以特定字符或字符串结尾的记录
【例】在 fruits 表中,查询 f_name 字段以字母 y 结尾的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP 'y$'; +------+------+------------+---------+ | f_id | s_id | f_name | f_price | +------+------+------------+---------+ | b1 | 101 | blackberry | 10.20 | | b2 | 104 | berry | 7.60 | | c0 | 101 | cherry | 3.20 | | m2 | 105 | xbabay | 2.60 | +------+------+------------+---------+
3. 代替字符串中的任意一个字符
字符‘.’可以匹配任意一个字符。
【例】在 fruits 表中,查询 f_name 字段以包含字母 a 与 g 且两个字母之间只有一个字母的记录。SQL 语句如下
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP 'a.g'; +------+------+--------+---------+ | f_id | s_id | f_name | f_price | +------+------+--------+---------+ | bs1 | 102 | orange | 11.20 | | m1 | 106 | mango | 15.60 | +------+------+--------+---------+
4. 匹配多个字符
星号(*) 可以任意次匹配前面的字符,包括 0 次。加号(+)至少匹配前面的字符一次。
【例】在 fruits 表中,查询 f_name 字段以包含字母 b 开头,且 b 后面出现字母 a 的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP '^ba*'; +------+------+------------+---------+ | f_id | s_id | f_name | f_price | +------+------+------------+---------+ | b1 | 101 | blackberry | 10.20 | | b2 | 104 | berry | 7.60 | | t1 | 102 | banana | 10.30 | +------+------+------------+---------+
【例】在 fruits 表中,查询 f_name 字段以包含字母 b 开头,且 b 后面至少出现一次字母 a 的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP '^ba+'; +------+------+--------+---------+ | f_id | s_id | f_name | f_price | +------+------+--------+---------+ | t1 | 102 | banana | 10.30 | +------+------+--------+---------+
5. 匹配指定字符串
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间 使用分隔符“|”隔开。
【例】在 fruits 表中,查询 f_name 字段值中包含字符串 on 的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP 'on'; +------+------+---------+---------+ | f_id | s_id | f_name | f_price | +------+------+---------+---------+ | bs2 | 105 | melon | 8.20 | | l2 | 104 | lemon | 6.40 | | o2 | 103 | coconut | 9.20 | +------+------+---------+---------+
【例】在 fruits 表中,查询 f_name 字段值中包含字符串 on 或者 ap 的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP 'on|ap'; +------+------+---------+---------+ | f_id | s_id | f_name | f_price | +------+------+---------+---------+ | a1 | 101 | apple | 5.20 | | a2 | 103 | apricot | 2.20 | | bs2 | 105 | melon | 8.20 | | l2 | 104 | lemon | 6.40 | | o2 | 103 | coconut | 9.20 | | t2 | 102 | grape | 5.30 | +------+------+---------+---------+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【注】区分 LIKE 运算符
LIKE 运算符用来匹配字符串,语法格式为“expr LIKE 匹配条件”。如果 expr 满足匹配条件,则返回值为 1(TRUE); 如果不匹配,则返回值为 0(FALSE)。 若 expr 或匹配条件中任何一个为 NULL,则结果为NULL。
LIKE 运算符在进行匹配运算时,可以使用下面两种通配符。
(1) %: 匹配任意数目的字符,甚至包括零字符。
(2) _: 只能匹配一个字符。
【例】使用运算符 LIKE 进行字符串匹配运算,SQL语句如下:
- mysql> select 'stud' LIKE 'stud','stud' LIKE 'stu_', 'stud' LIKE '%d', 'stud' LIKE 't___','s' LIKE NULL;
- +----------------------+----------------------+--------------------+----------------------+-----------------+
- | 'stud' LIKE 'stud' | 'stud' LIKE 'stu_' | 'stud' LIKE '%d' | 'stud' LIKE 't___' | 's' LIKE NULL |
- +----------------------+----------------------+--------------------+----------------------+-----------------+
- | 1 | 1 | 1 | 0 | NULL |
- +----------------------+----------------------+--------------------+----------------------+-----------------+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LIKE 运算符也可以匹配指定的字符串,但与 REGEXP 不同,LIKE 匹配的字符串如果在文本中间出现,则找不到它,相应的行也不会返回,而 REGEXP 可以在文本内进行匹配,如果被匹配的字符串在文本中出现,REGEXP 将会找到它,相应的行也会被返回。
【例】在 fruits 表中,使用 LIKE 运算符查询 f_name 字段值为 on 的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name LIKE 'on'; Empty set (0.00 sec)
6. 匹配指定字符中的任意一个
方括号([])可以指定一个字符集合,只要匹配其中的任何一个字符,即为所查找的文本。
【例】在 fruits 表中,查询 f_name 字段值中包含字母 o 或者 t 的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP '[ot]'; +------+------+---------+---------+ | f_id | s_id | f_name | f_price | +------+------+---------+---------+ | a2 | 103 | apricot | 2.20 | | bs1 | 102 | orange | 11.20 | | bs2 | 105 | melon | 8.20 | | l2 | 104 | lemon | 6.40 | | m1 | 106 | mango | 15.60 | | m3 | 105 | xxtt | 11.60 | | o2 | 103 | coconut | 9.20 | +------+------+---------+---------+
7. 匹配指定字符以外的字节
[^字符集合]可以匹配不在指定集合中的任何字符。
【例】在 fruits 表中,查询 f_id 字段值中包含字母 a~e 和数字 1~2 以外的字符的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_id REGEXP '[^a-e1-2]'; +------+------+---------+---------+ | f_id | s_id | f_name | f_price | +------+------+---------+---------+ | b5 | 107 | xxxx | 3.60 | | bs1 | 102 | orange | 11.20 | | bs2 | 105 | melon | 8.20 | | c0 | 101 | cherry | 3.20 | | l2 | 104 | lemon | 6.40 | | m1 | 106 | mango | 15.60 | | m2 | 105 | xbabay | 2.60 | | m3 | 105 | xxtt | 11.60 | | o2 | 103 | coconut | 9.20 | | t1 | 102 | banana | 10.30 | | t2 | 102 | grape | 5.30 | | t4 | 107 | xbababa | 3.60 | +------+------+---------+---------+
8. 指定字符串连续出现的次数
“字符串{n,}“ 表示匹配前面的字符串至少n次;“字符串{n,m}”表示匹配前面的字符串至少n次,至多m次。
【例】在 fruits 表中,查询 f_name 字段值至少出现两次字母‘x’ 的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP 'x{2,}'; +------+------+--------+---------+ | f_id | s_id | f_name | f_price | +------+------+--------+---------+ | b5 | 107 | xxxx | 3.60 | | m3 | 105 | xxtt | 11.60 | +------+------+--------+---------+【例】在 fruits 表中,查询 f_name 字段值至少出现一次、最多出现3次 ba 字符串的记录。SQL 语句如下:
mysql> SELECT * FROM fruits -> WHERE f_name REGEXP 'ba{1,3}'; +------+------+---------+---------+ | f_id | s_id | f_name | f_price | +------+------+---------+---------+ | m2 | 105 | xbabay | 2.60 | | t1 | 102 | banana | 10.30 | | t4 | 107 | xbababa | 3.60 | +------+------+---------+---------+