MySQL ----- 使用正则表达式进行搜索 regexp

Posted 随风而逝.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL ----- 使用正则表达式进行搜索 regexp 相关的知识,希望对你有一定的参考价值。

正则表达式: 用来匹配文本的特殊的字符集合。

注意:

  1、正则表达式比较复杂,前面灵活使用基本够用

  2、所有种类的程序设计语言,文本编辑器、操作系统等都支持正则表达式

  3、正则表达式使用正则表达式语言建立的,所以想要使用的顺滑,就要学会他的特殊语法和指令

简单使用,正则表达式语言的一个子集,MySQL 正则表达式

1、用一下

-- 检索商品名中含有 ton 的商品
 select prod_id,prod_name,prod_price from products where prod_name REGEXP \'ton\' order by prod_price;

 注意:  like 与regexp  的区别:就是 like 匹配整个列值,要的是整体。regexp 匹配这个列值中的有没含有,属于他的一部分就行

  1、like 匹配整个列,如果匹配的文本正在列值中出现,like 将不会找到他,相应的行也不会被返回(除非与通配符连用)

  2、regexp 在列值内进行匹配,如果被匹配的文本在列值中出现,regexp 就会找到他,将相应的行返回。

 

2、区分大小写匹配

mysql 默认是不区分大小写的,要区分的话可以使用 binary  关键字区分大小写

-- 查看商品名中含有T的商品
select prod_id,prod_name,prod_price from products where prod_name regexp binary \'T\' order by prod_price;

 

 3、进行或 (|)匹配,像之前的OR 一样,满足其中之一就行

-- 检索商品名中含有ton 或1000 的商品
 select prod_id,prod_name,prod_price from products where prod_name regexp \'ton|1000\' order by prod_price;

 

 注意: | 为正则表达式的或操作符,表示满足其中之一就会匹配返回,使用方式与or 基本一致,两个后多个条件多个|

4、匹配特定字符

 

-- 查找商品名中含有的  五个字符中,第一个字符是12的商品

select prod_id,prod_name,prod_price from products where prod_name regexp \'[12] ton\' order by prod_price;

因此,[ ]  是 or 语句的另一种形式,[12] 相当于[1|2] , 但是要用中括号包裹起来,表示 1或2 开头的某某

与 1|2 ton 还是有区别的

-- 查找商品名称含有 1 或 2 ton 的商品
 select prod_id,prod_name,prod_price from products where prod_name regexp \'1|2 ton\' order by prod_price;

 

 

 可以查找指定之外的 [^12]

 

 

 

5、匹配范围

集合用来定义要匹配的一个或多个字符,如 [0123456789] 可以简化为 [0-9] ,其中 -  表示从0到9 的一个范围

-- 查找商品名中含有的  五个字符中,第一个字符是0到9之间 的商品
select prod_id,prod_name,prod_price from products where prod_name regexp \'[0-9] ton\' order by prod_price;

 

 

6、匹配特殊字符

之前已经了解的三个特殊符号

  表示匹配所有的(.)

  表示或的(|)

  表示范围的(-)

那么要查询商品名中含有那些与特殊钢符号冲突的怎么办,

  使用  \\\\. 进行转义(escaping)

-- 查找商品名中含有 . 的商品
select prod_id,prod_name,prod_price from products where prod_name regexp \'\\\\.\' order by prod_price;

 

 两个反斜杠也可以用来引用元字符(具有特殊含义的字符)

 

 注意:

  1、要匹配反斜杠(\\) 需要使用 \\\\\\

  2、多数正则表达是需要使用单个反斜杠,才能使用字符本身,但是Mysql 要求两个(Mysql 解释一个,正则表达式库解释一个)

 

 

7、字符类

字符类(character class): 使用预定义的字符集,找出常用的数字,所有字母字符或数字字符

 

 

-- 检索商品名中含有 任意数字的商品
select prod_id,prod_name,prod_price from products where prod_name regexp \'[[:digit:]]\' order by prod_price;

 

 

8、匹配多个实例

检索多个实例,

--  匹配商品名中含有 ([0-9] sticks) 或 ([0-9] stick) 的商品,
--  其中第二的字符为任意数字,其中?前面的哪个s 可能有可能没有
 select prod_id,prod_name,prod_price from products where prod_name regexp \'\\\\([0-9] sticks?\\\\)\' order by prod_price;

 

 

 重复元字符

 字符类和重复元字符连用

-- 检索商品名中有四个数字连在一起的商品
select prod_id,prod_name,prod_price from products where prod_name regexp \'[[:digit:]]{4}\' order by prod_price;

 

 

9、定位符  

匹配特定位置的文本

-- 检索商品名中以任意一个数(包括小数点)开始的产品
select prod_id,prod_name,prod_price from products where prod_name regexp \'^[0-9\\\\.]\' order by prod_price;

注意:

  1、^ 有两个作用,一是在集合中用来否定集合,二是指字符串的开始处

  2、利用定位符,以^ 开始和以$ 结束的每个表达式,可以匹配整个字符串,起到和 like 一样的作用

 

简单的正则表达式测试:

在不使用数据库表的情况下用select 来测试正则表达式,regexp 检查总是返回0(没有匹配)或1(匹配)

 

以上是关于MySQL ----- 使用正则表达式进行搜索 regexp 的主要内容,如果未能解决你的问题,请参考以下文章

[MySQL] 用正则表达式进行搜索

mysql必知必会--用正则表达式 进行搜索

MySQL必知应会-第9章-用正则表达式进行搜索

Mysql基础第十二天,用正则表达式进行搜索

mysql 文本搜索

MySQL中的通配符与正则表达式