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


找到产品名包含'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实操练习,这里是本书的一些实操练习笔记,有兴趣的话可以按这个练习几遍,相信对新手会很有帮助,让你不经意间功力大增。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容