正则表达式: 用来匹配文本的特殊的字符集合。
注意:
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(匹配)