第9章 用正则表达式搜索
1、正则表达式介绍
正则表达式是用来匹配某种文本模式的特殊字符串(字符集合),由正则表达式语言建立。
正则表达式语言有自己的语法和指令,所有种类的程序、操作系统都支持正则表达式语言。
正则表达式能做什么?能应付更复杂的文本匹配过滤。
例如:从文本中提取电话号码;从文本中提取重复单词;从文件内容中替换url链接;找到文件名中有数字的文件。
2、mysql也支持正则表达式匹配
2.1基本字符匹配
找到产品名包含'1000'的产品,并按名称排序:select prod_name from products where prod_name regexp '1000' order by prod_name;
(regexp ‘1000’ 用LIKE加通配符也能实现:like '%1000%')
找到产品名包含'x000'的产品,并按名称排序,x代表任意字符:select prod_name from products where prod_name regexp '.000' order by prod_name; 注意:'.000'中的(.)在正则表达式中代表任意字符。
找到产品名包含'JetPack'的产品,并按名称排序,
select prod_name from products where prod_name regexp 'Jetpack' order by prod_name;(不区分大小写)
如果要区分大小写,需在regexp后加binary关键字:
select prod_name from products where prod_name regexp binary 'Jetpack' order by prod_name;
select prod_name from products where prod_name regexp binary 'JetPack' order by prod_name;
2、进行OR匹配
正则表达式的or操作符格式为 (|)。
找出名称包含1000、2000或3000的产品,并按名称排序:select prod_name from products where prod_name regexp '1000|2000|3000' order by prod_name;
3、匹配一组字符之一,实质是or的另一种形式, '[123] Ton' ='[1|2|3] Ton'。
找到名称包含1 Ton、2 Ton或3 Ton的产品,并按名称排序:
select prod_name from products where prod_name regexp '[123] Ton' order by prod_name;
select prod_name from products where prod_name regexp '[1|2|3] Ton' order by prod_name;
select prod_name from products where prod_name regexp '1|2|3 Ton' order by prod_name;
因没加[中括号],此处'1|2|3 Ton'等同于1、2、或3 Ton,所以查询结果错误。
4、匹配范围
集合匹配,0123456=[0-6],abcdefg=[a-g]
找到名称包含1 Ton、2 Ton、5 Ton 的产品:select prod_name from products where prod_name regexp '[1-5] Ton' order by prod_name;
5、匹配特殊字符
特殊字符:指在正则表达式语言中,有特殊意义的字符,如: . 、%、|、[、]、-、\ 等。
要匹配特殊字符,要用左双斜线 “\\” 做转义,如:\\.、\\-、\\%、\\\ 等。
还有一些系统的元字符,也需要转义才能匹配到,如:分页\\f 、换行\\n、回车\\r、制表符\\t、纵向制表符\\v。
找出名称中带.的供应商:select vend_name from vendors where vend_name regexp '\\.' order by vend_name;
6、匹配字符类
字符类:指正则语言中,预定义的一类字符,如:
[:alnum:]任意字母或数字(同[a-zA-Z0-9]);
[:alpha:]任意字母(同[a-zA-Z]);
[:digit:]任意数字(同[0-9]);
[:upper:]任意大写字母(同[A-Z]);
[:lower:]任意小写字母(同[a-z]);
[:blank:]空格和制表符(同[\\t]);
[:space:]任意空格和任意空白字符(同[\\f\\n\\r\\t]]v])。
7、匹配重复模式
前面的匹配都是唯一值匹配,有时还要匹配有重复的字符或字符类,如:至少包含一个数字。
此时需要用,重复元字符,如:
* 0或任意多个匹配
+ 1或任意多个匹配
? 0或1个匹配
{n}
{n,}
{n,m}
找到名称包含'(任意一位数字加sticks或stickss)'的产品,:select prod_name from products where prod_name regexp '\\([0-9] sticks?\\)';
找到名称包含连续4位数字的产品:select prod_name from products where prod_name regexp '[[:digit:]]{4}' order by prod_name;(注意:'[[:digit:]]{4}'也可写成'[0-9][0-9][0-9][0-9]')
8、定位符
定位符,是为了匹配特定位置的文本。定位符元字符:
^文本的开始
$文本的结尾
[[:<:]]词的开始
[[:>:]]词的结尾
找出名称以一位数字或小数点开头的产品:select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name;
注意:^的两种用法:
在集合中表示否,如[^0-5]表示非0-5的一位数字;
在集合外表示开始定位符,如^[0-5]表示以0-5开始的一位数字。
9、正则表达式简单测试:
用select测试正则表达式,将返回值0或1,如:select 'hello' regexp '[0-9]';(因为hello中不含数字,故返回值0。)
《mysql必知必会》是一本好书,是一本sql语言入门书,豆瓣评分很高。
作者是英国的Ben Forta,世界知名的技术作家,由人民邮电出版社发行,我觉得原作名: MySQL Crash Course,直译为:《MYSQL速成》更具畅销书潜质,只是比较俗吧,呵呵。
书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。
前三章是基础概念,讲了SQL和数据库的基本概念,Mysql数据库的概念和使用方法,第四章开始SQL实操练习,这里是本书的一些实操练习笔记,有兴趣的话可以按这个练习几遍,相信对新手会很有帮助,让你不经意间功力大增。