[TOC=1,5]
>[success] # 什么是regexp
>正则表达式是用来匹配文本的特殊的字符集合,如果想从一个文本文件中提 取电话号码,可以使用正则表达式来完成。
正则表达式的作用是匹配文本,将一个正则表达式与一个文本串进行比较, MySQL 用 where 子句对正则表达式提供支持,允许指定正则表达式过滤 select 查找出的数据。
<br>
* * * * *
>[success] # regexp和like区别
>在 where 中可以使用 LIKE 和 REGEXP 来匹配特定的内容,但是 LIKE 匹配 整列数据,REGEXP 可以匹配列中任意位置的文本,REGEXP 更灵活强大。
MySQL 中正则表达式不区分大小写。
* * * * *
>[success] # 语法
`在 where 子句中使用 REGEXP 关键字,后面接正则表达式字符 `
<br>
>[danger] ##### 包含文本匹配-regexp
`SELECT * FROM products WHERE prod_name REGEXP '100';`
**图片信息**:
![](https://box.kancloud.cn/66105b0e439e50deac63773c36729cda_691x72.png)
**注**:
查询prod_name字段中包含100 的内容,如果条件换成10,1000等都会查出这条信息,因为都是包含关系
<br>
>[danger] ##### 或文本匹配-|
`SELECT * FROM products WHERE prod_name REGEXP '1000|2000';`
**图片信息**:
![](https://box.kancloud.cn/d162cf2a3a06dde7dc8d8e124679f2de_676x90.png)
**注**:
当使用like做查询结果一致的操作语法
`SELECT * FROM products WHERE prod_name LIKE '%1000%' OR prod_name LIKE '%2000%';`
<br>
>[danger] ##### 文字中其中一个匹配-[]
`SELECT * FROM products WHERE prod_name REGEXP '[123] Ton';`
**图片信息**:
![](https://box.kancloud.cn/be7d2a762ab04d0dd1f922e936db8ad5_717x68.png)
**注**:
正则表达式[123] Ton ,[123]定义一组字符,它的意思是匹配 1 或 2 或 3, 因此,1 ton 和 2 ton 都匹配并且返回。
<br>
>[danger] ##### 不匹配文字中任意一个-[^]
`SELECT * FROM products WHERE prod_name REGEXP '[^123] Ton';`
**图片信息**:
![](https://box.kancloud.cn/a471f0b7ae62c88c503f1f767a93789a_702x64.png)
**注**:
和not的区别
`SELECT * FROM products WHERE prod_name NOT REGEXP '[123] Ton';`
这个语句的含义
除了1或2或3和ton组成的内容查询结果集
上面 我们用的非not是匹配到的 可能是5ton之类的反正开头不能是123,结尾必须是Ton
<br>
>[danger] ##### 匹配一个范围-[1-9] [a-z]
`SELECT * FROM products WHERE prod_name REGEXP '[1-5] Ton';`
**图片信息**:
![](https://box.kancloud.cn/3bb2c052d89230d765652898950306ff_699x84.png)
**注**:
1.匹配一个范围,使用集合操作,[1-9] 表示匹配 1 到 9 之间的任意一个 数字,[a-z]表示匹配 a 到 z 之间的任意一个字符
2.不存在[1-311 ]1到311,只会匹配到1-3 和11
<br>
>[danger] ##### 匹配所有字符-.
`SELECT * FROM products WHERE prod_name REGEXP '.';`
**图片信息**:
![](https://box.kancloud.cn/bfbf3902ad49dd3e79d949fed683b94a_694x141.png)
**注**:
1. 小数点表示匹配所有
2. 如果想匹配小数点用转移符号//.
<br>
* * * * *
>[success]# 一些正则表达式里面支持的字符类
>用法:
>SELECT * FROM products WHERE prod_name REGEXP '[[:digit:]]{2}';
>虽然匹配到了1000 但实际匹配的是10 因为00属于本身字符串造成感觉匹配到了1000,注意用[]再次包裹
![](https://box.kancloud.cn/bcfb7e2899d4f8e57e680e4776544bae_690x63.png)
>[danger] ##### [:alnm:] 任意字母和数字等同[a-zA-Z0-9]
>[danger] ##### [:alpha:] 任意字符[a-zA-Z]
>[danger] ##### [:blank:]空格和制表符等同[\\\t]
>
>[danger] ##### [:cntrl:] ASCII控制制表同ASCII 0-31 和127
>
>[danger] ##### [:lower:] 任意小写[a-z]
>
>[danger] ##### [:upper:] 任意大写[A-Z]
>
![](https://box.kancloud.cn/0868fc8ee4d04f99d6108ea5a9ff420a_872x483.png)
![](https://box.kancloud.cn/012b778051fd4d537280fa75be7f3310_783x515.png)