《mysql必知必会》读书实战笔记9-正则过滤文本

第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%')

《mysql必知必会》读书实战笔记9-正则过滤文本_第1张图片


找到产品名包含'x000'的产品,并按名称排序,x代表任意字符:select prod_name from products where prod_name regexp '.000' order by prod_name; 注意:'.000'中的(.)在正则表达式中代表任意字符。

《mysql必知必会》读书实战笔记9-正则过滤文本_第2张图片

找到产品名包含'JetPack'的产品,并按名称排序,
select prod_name from products where prod_name regexp 'Jetpack' order by prod_name;(不区分大小写)

《mysql必知必会》读书实战笔记9-正则过滤文本_第3张图片

如果要区分大小写,需在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;

《mysql必知必会》读书实战笔记9-正则过滤文本_第4张图片

2、进行OR匹配

正则表达式的or操作符格式为 (|)。

找出名称包含1000、2000或3000的产品,并按名称排序:select prod_name from products where prod_name regexp '1000|2000|3000' order by prod_name;

《mysql必知必会》读书实战笔记9-正则过滤文本_第5张图片

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;

《mysql必知必会》读书实战笔记9-正则过滤文本_第6张图片

select prod_name from products where prod_name regexp '[1|2|3] Ton' order by prod_name;

《mysql必知必会》读书实战笔记9-正则过滤文本_第7张图片

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,所以查询结果错误。

《mysql必知必会》读书实战笔记9-正则过滤文本_第8张图片

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;

《mysql必知必会》读书实战笔记9-正则过滤文本_第9张图片

5、匹配特殊字符

特殊字符:指在正则表达式语言中,有特殊意义的字符,如: . 、%、|、[、]、-、\ 等。

要匹配特殊字符,要用左双斜线 “\\” 做转义,如:\\.、\\-、\\%、\\\ 等。

还有一些系统的元字符,也需要转义才能匹配到,如:分页\\f 、换行\\n、回车\\r、制表符\\t、纵向制表符\\v。

找出名称中带.的供应商:select vend_name from vendors where vend_name regexp '\\.' order by vend_name;

《mysql必知必会》读书实战笔记9-正则过滤文本_第10张图片

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?\\)';

《mysql必知必会》读书实战笔记9-正则过滤文本_第11张图片

找到名称包含连续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]')

《mysql必知必会》读书实战笔记9-正则过滤文本_第12张图片

8、定位符

定位符,是为了匹配特定位置的文本。定位符元字符:

^文本的开始
$文本的结尾
[[:<:]]词的开始
[[:>:]]词的结尾

找出名称以一位数字或小数点开头的产品:select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name;

《mysql必知必会》读书实战笔记9-正则过滤文本_第13张图片

注意:^的两种用法:

在集合中表示否,如[^0-5]表示非0-5的一位数字;
在集合外表示开始定位符,如^[0-5]表示以0-5开始的一位数字。

9、正则表达式简单测试:

用select测试正则表达式,将返回值0或1,如:select 'hello'  regexp '[0-9]';(因为hello中不含数字,故返回值0。)

《mysql必知必会》读书实战笔记9-正则过滤文本_第14张图片


《mysql必知必会》是一本好书,是一本sql语言入门书,豆瓣评分很高。

作者是英国的Ben Forta,世界知名的技术作家,由人民邮电出版社发行,我觉得原作名: MySQL Crash Course,直译为:《MYSQL速成》更具畅销书潜质,只是比较俗吧,呵呵。

书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。

前三章是基础概念,讲了SQL和数据库的基本概念,Mysql数据库的概念和使用方法,第四章开始SQL实操练习,这里是本书的一些实操练习笔记,有兴趣的话可以按这个练习几遍,相信对新手会很有帮助,让你不经意间功力大增。

你可能感兴趣的:(《mysql必知必会》读书实战笔记9-正则过滤文本)