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(匹配)

猜你喜欢

转载自www.cnblogs.com/obge/p/12942905.html