数据库入门:MySQL必知必会(九)用正则表达式进行搜索


在MySQL WHERE子句内使用正则表达式来更好地控制数据过滤。

01. 正则表达式介绍

前面的过滤例子允许用匹配、比较和通配操作符寻找数据,对于基本的过滤(或者甚至是某些不那么基本的过滤),这样就足够了。但随着过滤条件复杂性的增加,WHERE子句本身的复杂性也有必要增加。

  1. 这也就是正则表达式变得有用的地方,正则表达式是用来匹配文本特殊的串(字符集合);
  2. 如果你想从一个文本文件中提取电话号码,可以使用正则表达式;
  3. 如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式;
  4. 如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式;
  5. 如果你想替换一个页面中的所有URL为这些URL的实际HTML链接,也可以使用一个正则表达式。

02. 使用MySQL正则表达式

正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。

  1. 基本字符匹配:
    REGEXP
    1.1 除关键字LIKE被REGEXP替代外,这条语句看上去非常像使用LIKE的语句,它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理;
    正则表达式
    1.2 这里使用了正则表达式.000. 是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符
    1.3 MySQL中的正则表达式匹配不区分大小写,为区分大小写,可使用BINARY关键字,如:WHERE prod_name REGEXP BINARY ‘JetPack .000’;
  2. 进行OR匹配:
    2.1 为搜索两个串之一(或者为这个串,或者为另一个串),使用 |
    OR匹配
    2.2 使用 | 从功能上类似于在SELECT语句中使用OR语句,多个OR条件可并入单个正则表达式
  3. 匹配几个字符之一:
    3.1 可通过指定一组用 [] 括起来的字符来匹配特定的字符
    匹配特定字符
    3.2 使用正则表达式[123] Ton[123] 定义一组字符,它的意思是匹配123,是 [1|2|3] Ton 的缩写;
    3.3 需要用 [ ] 来定义OR语句查找
    []查找
    3.4 这并不是期望的输出,两个要求的行被检索出来,但还检索出了另外3行,之所以这样是由于MySQL假定你的意思是1或2或3 ton,除非把字符 | 括在一个集合中;
    3.5 字符集合也可以被否定,[123] 匹配字符1、2或3,[ ^ 123] 却匹配除这些字符外的任何东西;
  4. 匹配范围:
    集合可用来定义要匹配的一个或多个字符,为简化这种类型的集合,可使用 - 来定义一个范围:
    匹配范围
  5. 匹配特殊字符:
    我们已经看到 .[ ]|- 等,还有其他一些字符,如果你需要匹配这些字符,应该怎么办呢?
    错误示例
    5.1 这并不是期望的输出. 匹配任意字符,因此每个行都被检索出来
    5.2 为了匹配特殊字符,必须用 \\前导:
    匹配特殊字符
    5.3 这才是期望的输出:\\. 匹配 .,所以只检索出一行;这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须以这种方式转义
    5.4 \\也用来引用元字符:
    元字符
  6. 匹配字符类:
    存在找出你自己经常使用数字、所有字母字符或所有数字字母字符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类(character class)
    字符类
  7. 匹配多个实例:
    目前为止使用的所有正则表达式都试图匹配单次出现: 如果存在一个匹配,该行被检索出来;如果不存在,检索不出任何行;但有时需要对匹配的数目进行更强的控制
    7.1 你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s(如果存在),等等;
    重复元字符
    7.2 \\([0-9] sticks? \\ ): 匹配 ([0-9]匹配任意数字(这个例子中为1和5) sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现))
    例一
    7.3 匹配连在一起的4位数字:
    匹配数字
    7.4 需要注意的是,在使用正则表达式时,编写某个特殊的表达式几乎总是有不止一种方法,上面的例子也可以如下编写:
    其他写法
  8. 定位符:
    目前为止的所有例子都是匹配一个串中任意位置的文本,为了匹配特定位置的文本,需要使用表列出的定位符
    定位符
    8.1 找出以一个数(包括以小数点开始的数)开始的所有产品:
    在这里插入图片描述
    8.2 ^ 匹配串的开始,因此,^ [ 0-9 \\. ] 只在 .任意数字为串中第一个字符时才匹配它们;
    8.3 ^的双重用途: 在集合中(用 [] 定义),用它来否定该集合,否则,用来指串的开始处
    8.4 ,LIKE和REGEXP的不同在于:LIKE匹配整个串而REGEXP匹配子串,利用定位符,通过用 ^ 开始每个表达式,用 $ 结束每个表达式,可以使REGEXP的作用与LIKE一样

03.下一篇:创建计算字段

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值