必知必会-第九章

本章主要讲解,如何在where子句中使用正则表达式从而精确筛选数据。

正则表达式干啥的?

用来匹配文本的特殊串,比如从一段文本中提取邮箱和电话号码,再比如查找指定规则的文件名,再再比如将页面的URL替换为实际的HTML链接等等。

Mysql中正则表达式

mysql用where子句对正则表达式提供了初级支持,允许用你指定的正则表达式过滤select出来的数据。

几个简单的例子

找出address字段所有包含‘47’的行。


image.png

从上图可以看出,REGEXP和LIKE的用法很是相似。但是并没发现它的优势,继续看。

找出address字段所有‘102’的行,可以是任何字符。

image.png

‘.’字符可以匹配任何一个字符,所以匹配出来的结果中有‘1027’,‘1029’,‘102 ’(102空格)。
当然这个功能用LIKE和通配符依然可以完成,那么我还用正则干什么呢?

LIKE和REGEXP的区别

LIKE只有在完全匹配的情况下才会返回值,而REGEXP是包含的情况下就能返回值。我看根据结果可以对比一下。


image.png

image.png

image.png

聪明的你,也许看完这三张图就都明白了。

前面说过mysql在匹配结果时是忽略大小写的

但是使用正则表达式就可以区分大小写,而不必修改mysql的配置,毕竟不是所有人都是DBA。
为了区分大小写,可以使用BINARY关键字,比如where address REGEXP BINARY 'Beijing .000'。

OR匹配
image.png

匹配address中所有包含‘47’或者‘35’的行。
在逻辑表达中,‘|’表示或者,多个“或者”条件放在一起时,只要满足其中一个就返回值,所以,返回的数据集合应该是满足任何一个条件的合集。

匹配特定的字符

如果你想匹配特定的字符,需要给特定的字符设置一个字符集,用中括号[]表示,有点像我们编程时用的数组。


image.png

上图是想匹配,包含‘10’,‘11,‘12’,‘13’的address字段的值。
其实这种方式也是一种OR,我们还可以这么写,REGEXP '10|11|12|13'。
个人觉得分组看起来更清晰,而且随着匹配规则的愈加复杂,|会干扰逻辑运算,稍不注意就会影响我们筛选数据的结果。

匹配范围

仍然用到刚才的分组,比如你想匹配0-9的数字,[0-9].
比如我想比配字符a,b,c,...,x,y,z,[a-z]。
如果你想匹配0-3,6-9的范围,[0-36-9]。字符也是同理,这样进行范围匹配就很方便编写正则表达式了。
例如我们常见的电话号码,QQ号,邮箱账号等等,都会用到。

正则表达式中,特殊符号要转义

我们知道.在正则表达式中,表示匹配任意一个字符,但是在字段的值中也很有可能出现,我想匹配值中的‘.’时,就需要转义。
转义很简单,在‘.’前面加个'\'就行。
其他需要转义的常见字符还有, . \ | [],以及下面这些元字符


image.png
转义时咋是两个斜杠?

我们刚学C语言时,也听过或者用过转义,一般用一个\就搞定了,为什么mysql中需要两个?
因为,这是mysql官方要求,其中一个\由mysql负责解析,另一个由正则表达式库来解析。
大致原因如此,原理不详。

mysql帮你定义好了的字符类

下面是预定义的字符集,使用时可以参考下表


image.png
匹配多个实例

之前的例子都是匹配单次出现,但是实际工作中会匹配多次出现的情况,所以我们要学会对出现次数的控制来强化我们的正则表达式。
上一张书上的配图


image.png

要注意放置的次序,一般放在[]后面,字符串后面。

比如,我想在city表中查找city字段中带(),并且括号中的英文字符数至少有8个的行。听起来有点拗口是吧?


image.png

然后我们解读一下REGEXP后面的内容吧,首先转义(,就是\(。
然后用[]分组,确定英文字符的范围,小写a-z以及大写A-Z,就是[a-zA-Z]。
然后用{}来控制字符出现的次数,{8,},表示出现8次或者8次以上。
最后,再次转义,\)。

这些正则还算是简单的,当你看到了更加复杂的正则表达式时,一定要慢慢看,逐字分析,不然心态很容易爆炸,尤其是和我一样的菜鸟,切记。

匹配特定位置的文本

之前我们学习的都是匹配任意位置的文本,现在我们要学习匹配特定位置的文本,比如以xxx开头,或者以xxx结尾,再或者以xxx开头中间包含ss,又以yy结尾的。
匹配特定位置的文本的话,需要使用定位符,那么我们得知道都有什么定位符


image.png

那我们看一个简单的例子,找出以数字开头,并包含‘Drive’的行。
我作了一个错误的示范,不要犯同样的错误哦。
我把2个条件都写在了一个正则表达式里了,然后根本查不出数据来,如图:


image.png

然后仔细一读正则,发现了问题,图中的正则表示找出以数字drive开头的数据,当然,数据库中并不存在这样的数据。
我想要的是包含drive,而不是从头匹配drive。这是两个条件,所以我们应该分开写,把regexp写在两个where子句中。


image.png

这样一来,我们想要筛选的数据就出来了。
注意 ^

^有两种用途,第一种,表示从头匹配字符串。
另一种,否定集合内容。[^1-5],表示,除了1-5的字符之外的字符,可以是6,7,8,a,b,c等等。

好啦,第九章,搞定。

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

推荐阅读更多精彩内容