MySQL数据库——用通配符和正则表达式过滤数据(二)

上面说了通配符的用法(下划线 和 % ),但是我们要知道,通配符只能完成最基本的过滤,但是随着过滤条件的复杂性的增加,我们就需要用到正则表达式啦 。

正则表达式是用来匹配文本的特殊的串(字符集合)。更关键的是所有种类的程序语言,文本编辑器,操作系统都支持正则表达式,我们应该学习这种表达文本的方法!

正则表达式是用这则表达式语言来建立的,正则表达式语言是用来完成文本匹配的一种特殊语言,有自己的特殊的语法和指令。

part 1 基本字符匹配

我们从一个例子开始

SELECT users.user_name FROM users WHERE users.user_name REGEXP '黄'

和前面的通配符比较,除了关键字 LIKE 被 REGEXP 代替外,并没有什么变化。REGEXP后所跟的东西为正则表达式 。MySQL会将他后面的东西当作正则表达式处理 。
再来看一个例子:

SELECT users.user_name , users.user_age FROM users WHERE users.user_age REGEXP '19.'

’ . ’ 是正则表达式语言中一个特殊字符。它表示匹配任意一个字符,因此,年纪的195 和 196 都能配匹配 。

tip:注意 LIKE 和 REGEXP的区别 ! 有一个重要的差别:LIKE将匹配整个列,如果要匹配的内容是在列的一部分之中,LIKE将不能找到他,行也不会返回(除非使用通配符) ; 但是REGEXP在列内进行匹配 , 如果列内包含他找的文本,相应的行也会被返回。这是一个重要的差别!

part 2 进行 OR 匹配 :
直接看例子吧!

SELECT users.user_name , users.user_age FROM users WHERE users.user_age REGEXP '19|195|199'

如你所见 | 符号 将会产生类似于 SELECT语句中使用OR语句的功能。

part 3 匹配几个字符之一 :
还是看例子,这里多说无益 。

SELECT users.user_name , users.user_age FROM users WHERE users.user_age REGEXP '[123]99';

这里的[123]99 表示 可以匹配 199 299 399 ,[ ]内,是可以匹配的的范围;但是如果是这样,[^123]99 就表示是 除了 199 299 399 外的 任何 x99 。

part 4 匹配范围

我们上面看见了 【】 的作用,就是用来列出一个可匹配内容的,但是如果是 0 - 9 ,难道我们要把 0 1 2 3 4 5 6 7 8 9 都列出来吗? 所以 , 下面的 写法也能表示【0123456789】,就是【0-9】。 就是说 - 符号可以用来定义一个范围 。
例如【1-3】 【3-6】 匹配合法 【a-z】匹配任意字母字符。

part 5 匹配特殊字符

正则表达式语言由具有特定含义的特殊字符构成。我们已经看到 . [] | - 等 。请问,如果我们的文本中要去匹配这些字符,应该怎么做呢?如何搜索?

在正则表达式中,为了匹配特殊字符,必须用\为前导。\- 表示匹配 - ,\ . 表示匹配 . 如果是为了匹配 \ 就需要 \\ 表示 。

part 6 匹配多个实例

目前为止,所有的正则表达式都试图匹配单次出现。就是说,如果存在一个匹配,该行被检索出来,如果不存在,检索不出任何行。但有时需要对匹配的数目进行更强的控制,例如,你可能需要寻找所有的数,不管数中包含多少数字,或者可能想寻找一个单词并且还能适应一个尾随s(如果存在),等等。

这时候我们就可以使用正则表达式中的重复元字符。

元字符说明
*0个或多个匹配
+1个或多个匹配(等于{1,})
0个或一个匹配,等于{0,1}
{n}指定数目的匹配
{n,}不少于指定数目的匹配
{n,m}匹配数目的范围(m不超过255)

看个例子吧!

SELECT name FROM products WHERE name REGEXP '\\( [0-9]sticks? \\)'

将会返回

TNT (1 stick)
TNT (5 sticks)

下面一个例子,我们将匹配一个连在一起的四位数字:

SELECT name FROM prodects WHERE name REGEXP '[0-9]{4}'

将会返回

JetPack 1000
JetPack 2000

part 7 定位符

目前为止,所有的例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,我们需要使用定位符!

元字符说明
^文本的开始
&文本的结尾
[[:<:]]词的开始
[[:>:]]词的结尾

看个例子::

SELECT name FROM products WHERE name REGEXP '^[0-9\\.]'

将会返回

.5 
1
2

【0-9\.】就是说 如果是一个 0-9的字符 或者 一个 . 也可以啦。 本例中 ^ 代表了文本的开始,要进行什么匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值