本文主要介绍如何在 Mysql 中使用正则表达式进行搜索。 正则表达式是一个非常大的内容,我会在之后专门写博客介绍,这里只是简介一些常用匹配模式 博客文章地址:http://weiya.me/item/59.html 简介之前几篇文章讲解了各种各样的过滤数据条件,通过这些条件,我们已经能够满足日常开发中大部分的工作。但假设筛选条件更加复杂一点,比如你的老板叫你从邮箱 手机号码混合注册的用户中找出手机号码注册用户,要给他们发送营销短信。这时,之前的过滤方法就不太奏效。正则表达式搜索就派上大用场。 简单来说,正则表达式就是用来匹配文本的特殊字符串。比如,从文本中提取电话号码,带数字的用户名,或者提取某个特定格式的文本。 而且所有语言编辑器基本上都支持正则表达式,不得不说,正则表达式已经成为开发过程中强大而有力的工具。Mysql 也不例外,那么就开始正式学习这种特殊匹配方式。 本文所用到的 Mysql 表在文章最后的附录。 匹配字符串匹配字符串是正则表达式最基础的应用。我们先给出一个例子:我们从一个用户表中查询出名字中包含有100数字的用户
我们得到了用户ID为1的用户:小红100 该语句中不同于之前的语句,我们使用 这条语句看起来和 原因很简单。假设,我现在需要匹配不仅仅是包含100数字的用户,而是100,200,或者300,只要是整百的都需要匹配。或者说,我需要所有名字里面包含数字的,无论什么数字。那么使用
表达式
是不是来的比 正则和模糊查询的区别那么我们什么情况下应该使用 这里我们只需要记住 先看两个例子: 1、之前的一条语句
2、
这里我们可以清楚的看到两者的区别:正则表达式返回了一条记录,而 结论: 那么正则匹配是否也可以匹配整个字符,当然可以。不过需要涉及到另外的知识:定位符 使用或查询如果正则表达式仅仅就是和 或查询也叫
上面的语句查询了名字中包含了100或者200数字的用户,就是说两个数值只要匹配一个就可以返回数据。 当然你也可以给出多个或情况,他们之间使用竖线分割即可。比如:100|200|300|400 使用或查询的情况,有点儿类似于 匹配多个字符之一正则匹配中有一种特殊的
上面表达式中我们使用了一个特殊的字符串 这种,使用方括号将字符串括起来的写法,无论方括号内有多少字符串,其表达的含义都是匹配其中任意一个。 如果是[123456789]那么就代表,匹配名字中包含1或2或3或4或5或6或7或8或9的任何一个记录。 当然,字符串还可以查询被否定的情况。
说明:表中小红100,虽然包含1,但是他包含了0。0不属于1或者2,所以被匹配。 匹配一个范围看下我们上面有个集合[123456789],如果每次我们写正则时候都这么写,那么岂不是很麻烦。所以,我们可以简化这种情况,使用一个范围[1-9]来代替这串字符串。如果是匹配所有数字,那么就会包含0,我们可以使用[0-9]来表示。
这个表达式将会匹配出所有名字中包含数字的记录。拆开理解就是,包含0或者1或者2…或者8或者9的记录。 而且,这里的范围不仅仅只能是数字,还可以是字母。比如[a-z]就是表示从字母a到字母z的所有数字,26个字母。小写完了,还有大写[A-Z]。那么我们将其组合起来[0-9a-zA-Z]这个表达式就十分强大了,可以表示包含数字,小写字母,大写字母的所有记录。
由于我名字里面没有包含字母的,所以结果和上面[0-9]相同。 匹配特殊字符串我们来看下下面的一条语句:
这个语句的意思是匹配名称包含所有数字的记录。0-9被方括号扩了起来,那么假设我现在就需要匹配方阔号该如何处理? 这个时候就需要用到匹配特殊字符的知识。为了匹配这些特殊的字符,我们需要使用转义功能,就是使用(双反斜杠)作为前导。假设我们需要匹配常用特殊字符即可这么写:
依次类推,其他特殊的字符串也可以使用这么方式处理。 双反斜杠加上一些字母还可以表示特殊的含义。 比如:
在一般的编程语言中,转义一般使用一个反斜线,在 Mysql 中为什么是两个才行?原因是:Mysql 自己需要一个来识别,然后 Mysql 会将扣除了一个反斜杠的剩余的部分完全的交给正则表达式库解释,所以加起来就是两个了。 使用预定义字符集虽然正则表达式提供了一些很长表示方式的缩写,比如[0-9]表示数字。[a-z]表示小写字母。但是,有些时候还是觉得复杂。所以,正则表达式还提供了一些预定义的字符类来方便我们开发。 简单来说,就像车牌使用苏代表江苏,而沪代表上海一样。 我们直接给出表直接参阅。 元字符之前匹配的内容都是单词匹配。就是如果匹配到一次就显示,匹配不到就不显示。但是,复杂的情况有时候要求匹配不止一次。假设我需要匹配名字中包含2-3位数字的记录。这个时候就需要使用一种特殊的元字符来修饰。
是不是非常简单?下面具体解释它的用法。 拿出这个特殊字符串
定位元字符除了之前的重复元字符,正则还有一种特殊的定位元字符
|