正则表达式在Mysql中的应用

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标签

猜你喜欢

转载自blog.csdn.net/qq_44957186/article/details/113915825