使用正则表达式可以检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。
在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 |
+------+------+---------+---------+
【注】参考于清华大学出版社《MySQL数据库应用案例课堂》2016年1月第1版