正则表达式是用来匹配文本的特殊的串,它用正则表达式语言来建立。
MySQL支持的正则表达式仅为正则表达式的一个很小的子集。
可通过WHERE子句使用正则表达式过滤SELECT检索出的数据。
检索条件列包含字符100的所有行:
SELECT columnName
FROM tableName
WHERE columnName REGEXP '.00';
以上正则表达式.00
中的点表示匹配任意一个字符。
LIKE匹配整个列,而REGEXP会在列中找是否有符合模式串的部分,如果存在此部分就会返回该行。
MySQL 3.23.4后,正则表达式匹配不区分大小写,为区分大小写,可在使用BINARY关键字:WHERE columnName REGEXP BINARY '.00'
。
检索条件列包含字符100或200的所有行:
SELECT columnName
FROM tableName
WHERE columnName REGEXP '100|200';
使用字符集合检索条件列包含字符100或200或300的所有行:
SELECT columnName
FROM tableName
WHERE columnName REGEXP '[123]00';
以上正则表达式是缩写,也可写为[1|2|3]00
。
检索条件列不包含字符100或200或300的.00
的所有行:
SELECT columnName
FROM tableName
WHERE columnName REGEXP '[^123]00';
字符集合可被简化,[2-9]
表示不含1的数字集合,[b-z]表示不含a的字母集合。
使用转义符\
检索条件列含特殊字符如.
的所有行:
SELECT columnName
FROM tableName
WHERE columnName REGEXP '\\.'; # MySQL字符串中,\也表示转义符,因此需要两个\\,MySQL解释一个,正则库解释一个
转义方括号时:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201207075151571.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201207075228128.png)
转义符也能用来引用元字符:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201207074737297.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3R1czAwMDAw,size_16,color_FFFFFF,t_70)
字符类是预定义的字符集:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201207075338246.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3R1czAwMDAw,size_16,color_FFFFFF,t_70)
上表中有2个错误,一是[:blank:]
并不等同于[\\t]
,后者只会匹配制表符;二是[:punct:]
只匹配标点字符,而根据上表中的描述,空格字符也会被匹配到。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201207082551172.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3R1czAwMDAw,size_16,color_FFFFFF,t_70)
'\\([0-9] sticks?\\)'
中的\\(
会匹配(
,[0-9]
会匹配数字,sticks?
会匹配stick
或sticks
(?会匹配它之前的字符出现一次或零次的情况),\\)
会匹配)
。
[[:digit:]]{4}
匹配连续出现的四个任意数字。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020120708322125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3R1czAwMDAw,size_16,color_FFFFFF,t_70)
^[0-9\\.]
表示匹配以数字或点开头的文本。^放在集合中表示否定该集合,放在开头表示串的开始处。
可同时使用^
和$
像LIKE一样匹配整个串:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201207084927475.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3R1czAwMDAw,size_16,color_FFFFFF,t_70)
不使用数据库表的情况下测试正则表达式:
SELECT 'hello' REGEXP '[0-9]';
运行它:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201207085139539.png)
REGEXP总是返回0(匹配失败)或1(匹配成功)。