前言
第九天,继续冲~
今天学习的是利用正则表达式进行搜索,内容有点多,要多试试
正则表达式介绍
正则表达式的内容特别多,这里就只说一些基本概念,知道怎么用就好了。
> 正则表达式是用来匹配文本的特殊的串(字符集合)。
使用MySQL正则表达式
正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。
基本字符匹配
我们针对下面的表(num),第一列的数据类型是字符,第二列的数据类型是数值
看下面的例子
这个与昨天我们学习的LIKE语句很像,但是这里我们借用关键字REGEXP
(regular expression)来实现正则匹配。
上面的例子说了这么一回事
它告诉MySQL: REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理。
注意,所有的正则表达式都应该带引号,(单引号双引号都可以)因为前面说了正则表达式本质是串,可以把它理解成字符串。尽管下面这样运行结果是对的,但是当正则表达式变得复杂了,这种做法就会导致错误,所以,我们在以后写正则表达式的时候一定不能忘记引号。
再看下面的例子
和
上面两个结果不一样,为什么?我们先说表达式.000
,.
是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符.也就是说不能为0个字符(有点类似我们之前学的通配符_),所有000不匹配,就不会筛选出来。
再说LIKE
与REGEXP
的区别
我们看到结果是不一样的,为什么呢? LIKE匹配的整个列,而REGEXP在列值内匹配,通俗点说,LIKE是完全匹配,REGEXP是部分匹配, 就上面的例子来解释,尽管其他记录里都含有000,但是1000与000是不一样的,说以对LIKE来说不行,必须一模一样才会被LIKE筛选,但是REGEXP不会,它只要验证你的列值里面含有000就可以了,不管你是1000还是000,都会被筛选出来。
还有一点要注意
最后说一下,正则表达式在检索数据的时候,对列的数据类型没有要求,也就是说不管是字符型或者是数值型都是可以被检索的(上面的例子测试的是数值型,同样的你可以试试字符型,就是把where后面的number列换成new_number),但是当你使用关键字BINARY时,检索的数据列就不能是数值类型了,这一点要格外注意。
进行OR匹配
前面介绍的都是一个串的情形,那么两个串或者多个串可以吗?当然是可以的。
我们一般用|
来进行OR匹配,用来搜索两个串之一
上面的例子意思是匹配含“1000”或“2000”的记录,只要含其中一个就可以了。
类似的可以多个匹配
更多个也是可以的
匹配几个字符之一
如果我们只想匹配特定字符怎么办?
我们可以借助用[和]括起来的字符来实现
上面的意思是匹配[123]里面的任意字符,也就是相当于匹配1000或2000或3000.我们可以发现[]
是另一种OR语句,[123]
是[1|2|3]
的简写。要注意[]是不能省略的,[1|2|3]000
和1|2|3000
是不一样的。后者表示检索含1或2或3000的记录。
字符集合也可以被否定,需要借助^
,我们将它放在集合开始就可以实现对集合的否定,看下面的表
下面的例子就是对字符集合的否定,注意^要放在[]里面,并且放在最开始的地方
上面的例子就是选择不含1,2,3的记录
再看下面的例子
为啥这个记录是这样的呢?其实[^123]
表示匹配除了值为1,2,3,12,13,23,123以外的记录,比如3000可以,3就不可以。
匹配范围
集合可用来定义要匹配的一个或多个字符,比如说[123]可以写成[1-3],[0-9]表示[0123456789],但是[6-3]是不合法的,后面的值要不小于前面的值,可以等于。
上面的例子就是匹配[123456]里的任意一个字符。
匹配特殊字符
前面提到了一些特殊字符,他们都有特殊含义,那么怎么匹配他们呢?这时候就需要转义(跟其他语言类似),借助\来实现转义。比如对下面的表
匹配字符类
为更方便工作,可以使用预定义的字符集,称为字符类( character class)。
匹配多个实例
如果我想找至少出现两个1的记录怎么办呢?
后面的{2,}表示前面字符出现不少于两次,还有其他选择
定位符
前面所有的匹配都是匹配的任意位置,如果我要匹配指定位置怎么办?
我们借助上面元字符来实现
这个表示检索最后一位是1的记录
这节的内容有点多,所以写的比较简略,又不懂的大家可以一起交流,晚安啦~