Mysql仅支持多数正则表达式实现的一小部分的子集
一、简单字符匹配
mysql> select ename,deptno from emp where deptno regexp '20';
+-------+--------+
| ename | deptno |
+-------+--------+
| SMITH | 20 |
| JONES | 20 |
| SCOTT | 20 |
| ADAMS | 20 |
| FORD | 20 |
+-------+--------+
5 rows in set (0.00 sec)
二、关于like和regexp的区别;
有的书上like匹配的是整个列,如果被匹配的文本在列值中出现,like将不会找到他,相应的行也不会被返回(除非使用通配符)
这里我在Mysql 8.0.23-0ubuntu0.20.04.1
中测试中是是能够返回的。
mysql> select ename from emp where ename like 'SMITH';
+-------+
| ename |
+-------+
| SMITH |
+-------+
1 row in set (0.00 sec)
三、正则表达式在mysql中具体实现了哪些功能
1、进行OR匹配
mysql> select ename,deptno from emp where deptno regexp '20|30';
+--------+--------+
| ename | deptno |
+--------+--------+
| SMITH | 20 |
| ALLEN | 30 |
| WARD | 30 |
| JONES | 20 |
| MARTIN | 30 |
| BLAKE | 30 |
| SCOTT | 20 |
| TURNER | 30 |
| ADAMS | 20 |
| JAMES | 30 |
| FORD | 20 |
+--------+--------+
11 rows in set (0.00 sec)
2、匹配一组字符
使用[]
表示一组集合或者范围,可以匹配集合中的任意一个元素
mysql> select ename,hiredate from emp where hiredate regexp '198[0-9]-\\d{2}-\\d{2}';
+--------+------------+
| ename | hiredate |
+--------+------------+
| SMITH | 1980-12-17 |
| ALLEN | 1981-02-20 |
| WARD | 1981-02-22 |
| JONES | 1981-04-02 |
| MARTIN | 1981-09-28 |
| BLAKE | 1981-05-01 |
| CLARK | 1981-06-09 |
| SCOTT | 1987-04-19 |
| KING | 1981-11-17 |
| TURNER | 1981-09-08 |
| ADAMS | 1987-05-23 |
| JAMES | 1981-12-03 |
| FORD | 1981-12-03 |
| MILLER | 1982-01-23 |
+--------+------------+
14 rows in set (0.00 sec)
3、匹配特殊字符
匹配特殊字符同样需要转义,mysql中的转义是\\
所以正则表达式中的特殊元字符在mysql中的转义多了一个\
4、匹配Posix字符类
字符类 | 说明 |
---|---|
[:alnum:] | 任何一个字母或者数字 |
[:alpha:] | 任何一个字母 |
[:blank:] | 空格或者制表符 |
[:cntrl:] | ASCII控制符 |
[:digit:] | 任何一个数字 |
[:graph:] | 和[:print:]一样,但不包含空格 |
[:lower:] | 任何一个小写字母 |
[:upper:] | 任何一个大写字母 |
[:print:] | 任何一个可打印字符 |
[:punct:] | 既不属于[:alnum:]也不属于[:cntrl:]的任何一个字符 |
[:space:] | 任何一个空白字符,包括空格 |
[:xdigit:] | 任何一个十六进制数字 |
5、字符或者字符集合的重复匹配
元字符 | 说明 |
---|---|
? | 匹配0个或者1个 |
+ | 匹配1个或者多个 |
* | 匹配0个或者多个 |
{n} | 必须匹配n个 |
{n,} | 必须至少匹配n个 |
{m,n} | 必须是少匹配m个至多匹配n个 |
6、位置匹配
这点在mysql中的实现于正则表达式中的定义有点不同
regexp:
元字符 | 说明 |
---|---|
\b | 表示一个单词的开始和结束 |
\B | 表示一个非单词的开始和结束 |
匹配cat
单词
"\bcat\b"
Mysql:
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 单词的开始 |
[[:>:]] | 单词的结尾 |
PS:正则表达式中的前后查找:
操作符 | 说明 |
---|---|
(?=) | 查找指定内容之前的内容作为匹配结果 |
(?!) | 查找不是以指定内容结尾的内容作为匹配结果 |
(?<=) | 查找指定以内容开始的内容作为匹配结果 |
(?<!) | 擦护照不是以指定内容开始的内容作为匹配结果 |
"(?<=[tT][iI][tT][lL][eE]).*?(?=/[tT][iI][tT][lL][eE])"
结果:
匹配HTML的TITLE标签