MySQL学习之正则表达式篇

正则表达式(REGEXP)

1.简介

正则表达式是用来匹配列值的特殊字符集合,许多领域都有涉及,
MySQL使用的正则表达式仅为其一个小小的子集。

2.基本字符匹配

2.1筛选包含特定字符串的信息

//搜索id包含‘001’的所有学生信息
select * from Student
where id regexp ‘001‘;

注:regexp匹配列值字串,而like匹配整个列值,这是二者的重要区别。如:

//搜索id是‘001’的学生的信息
select * from Student
where id like ‘001‘;

2.2点符号

同通配符中的‘_‘,用以代替一个字符,如:

//搜索id中含任意字符组合001的学生信息
select * from Student
where id regexp ‘.001‘;

注:不同于通配符_ ,正则表达式匹配子串,当‘.’放在开头时,仍能匹配到多个字符的字串。
如上列搜索中可以匹配到:1001,10001,100001,而‘_001’仅能匹配到1001;

3.or匹配(并)

通过符号‘|’可以实现or匹配,如:

//匹配出id为1001、1002、1003三位学生的所有信息
select * from Student
where id regexp ‘1001|1002|1003‘;

4.匹配几个字符之一

通过 [ ] 匹配几个字符中的一个,如:

[123]ABC  可以是:1ABC、2ABC、3ABC
[ABC]123  可以是:A123、B123、C123

注:

  1. [123] 其实是[1|2|3]的缩写,是一种特殊的or
  2. 时刻注意 [ ] 仅表示一个字符

5.范围匹配

在4的基础上可以有如下表示:

[0-9]  可以是0,1,2,3,... ,9中任意一个数字
[a-z]  可以是任意一个小写字母
[A-Z]  可以是任意一个大写字母
[0-9a-z]  可以是0到9任意一个数字,也可以是任意一个小写字母

注:

  1. 顺序不能反
  2. 时刻注意 [ ] 仅表示一个字符

6.转义匹配

  1. 如需匹配像 . | \ 等特殊字符,需要用双斜杠\\转义。
    前一个 \ 用来向MySQL解释,后一个用于向正则表达式解释。

  2. 如需引用元字符,也需使用\\,如:

  • \\f 换页
  • \\n 换行
  • \\r 回车
  • \\t 制表
  • \\v 纵向制表

7.匹配字符类

使用预定义的字符集:

[:alnum:]  任意字母和数字(同[a-zA-Z0-9])
[:alpha:]  任意字符(同[a-zA-Z])
[:blank:]  空格和制表(同[\t])
[:cntrl:]  ASCII控制字符(ASCII 0到31和127)
[:digit:]  任意数字(同[0-9])
[:graph:]  与[:print:]相同,但不包括空格
[:lower:]  任意小写字母(同[a-z])
[:print:]  任意可打印字符
[:punct:]  既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:]  包括空格在内的任意空白字符(同[\f\n\r\t\v])
[:upper:]  任意大写字母(同[A-Z])
[:xdigit:] 任意十六进制数字(同[a-fA-F0-9])

8.匹配多个实例

*                      0个或多个匹配
+                      1个或多个匹配(等于 {1, })
?                      0个或1个匹配(等于 {0, 1})
{n}                    指定数目的匹配
{n, }                  不少于指定数目的匹配
{n ,m}                 匹配数目的范围(m不超过255)

9.定位符

^        文本的开始
$        文本的末尾
[[:<:]]  词的开始
[[:>:]]  词的结尾

注:使用 ^ 和 $ 可以使正则表达式等效Like操作符,如:

//此两者等价
select * from Student
where id regexp ‘^001$‘;

select * from Student
where id like ‘001‘;