正则表达式介绍
在数据库的数据过滤过程中只用WHERE子句和LIKE操作符都是对于已知值进行的
不管是匹配一个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,都是使用已知的值
当然MySQL语句也提供了通配符百分号(%)和下划线(_)来匹配多个和单个字符
在检索名中包含某些文本或字符的字段时确实很有用,但是这种功能也是有代价的
因为通配符和搜索的处理一般要比有些搜索所花时间要长,而且会使WHERE子句本身过于复杂
这也就是正则表达式变得有用的地方,所有程序设计语言、文本编辑器、操作系统等都支持正则表达式
正则表达式是用来匹配文本的特殊串,用正则表达式语言来建立,所以这也是你必须所学习的特殊语法和指令
全文阅读和自己练习尝试需要大概十五分钟左右,熟练运用SQL语句中还得需要你自己不断地积累和使用,希望不会浪费读者宝贵的时间
通配符小技巧
虽然通配符搜索处理要比其他搜索时间所花时间要长,但是在数据量不大的时候还是建议使用的
这里在讲正则表达式之前还是先给出一些使用通配符要记住的技巧:
1. 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
2. 除非绝对必要,否则不要把他们用在搜索模式的开始处。这样搜索起来是最慢的
3. 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据
学习使用正则表达式
我们从一个简单的例子开始,下面检索列Name带文本aba的部分行
这里我们先提一个问题,正则表达式和通配符匹配区分大小写吗?仔细观察下面检索的对象,你就知道答案了
![](https://note.youdao.com/yws/api/personal/file/4D1A7380BA994CF18AA5B75325156482?method=download&shareKey=e2cd64e23b6c16682d5dd52c1a6bdc05)
这我们看到关键字REGEXP声明后面的东西作为正则表达式处理,就得到了所有Name列包含aba文本的数据,而且你也发现它们是不区分大小写的
这时候你可能就要问,为什么要那么费力使用正则表达式?在刚才的例子中,没有体现出带来的好处,还可能降低性能,也确实没有以下通配符的方法简单
SELECT *
FROM city
WHERE Name LIKE '%aba%'
ORDER BY Name
LIMIT 10;
接下来,请考虑接下来的这些例子
![](https://note.youdao.com/yws/api/personal/file/054207450B9343AA840756292471B194?method=download&shareKey=e4f4207a7da7cfa169695e6479ef048d)
这里使用了正则表达式.East。.是正则表达式中的一个特殊字符,表示匹配任意一个字符
![](https://note.youdao.com/yws/api/personal/file/94A6112ECDE04600B8259B656DB58B0A?method=download&shareKey=4c6a715aaae85ac495817ca774138ed7)
|是正则表达式的OR操作,它表示匹配其中之一,多个OR条件可以并入单个正则表达式。
从这里开始终于开始有属于正则表达式自己独有的匹配方式了
![](https://note.youdao.com/yws/api/personal/file/CCEC90076BDB477994C19FA75FAA48BD?method=download&shareKey=eb9e24df2c07cab1e59d1801610a82c2)
这里大家应该就有些看不懂这有些复杂的正则表达式了,所以接下来介绍所有正则表达式的其他语法
- 中括号
- 中括号中添加可以匹配的字符,但是本身只能匹配一个其中一个字符,比如说[123]就是匹配1、2或3
- 还可以匹配范围,为了简化[123456789]这种过于冗长的集合,可使用-来定义一个范围,比如说[1-9]和刚才的集合是一样的
- 标识符
- ^ :有两个作用,一个是在集合中表示否定该集合,一个是作为定位符表示指文本的开始处
- [^123] :匹配除了1、2或3这些字符外的其他东西
- ^a :文本的开头是a字符
- $ :和^相反,这是文本结尾的标识符
- 匹配特殊字符
- 为了匹配特殊字符,必须用\为前导,这种处理就是所谓的转义,这样也存在了很多空白元字符
- \f:换页
- \n:换行
- \r:回车
- \t:制表
- \v:纵向制表
- 多数正则表达式都是用单反斜杠转义,而MySQL要求两个是因为自己解释一个,正则表达库解释另一个
- 匹配字符类
- 为了方便工作,可以使用预定义的字符集,成为字符类
- [:alnum:]:任意字母或者数字
- [:alpha:]:任意字符
- [:blank:]:空格和制表
- [:cntrl:]:ASCII控制字符
- [:digit:]:任意数字
- [:graph:]:与[:print:]相同,但是不包括空格
- [:lower:]:任意小写字母
- [:print:]:任意可打印字符
- [:punct:]:不在[:alnum:],但又在[:cntrl:]的任意字符
- [:space:]:包括空格在内的任意空白字符
- [:upper:]:任意大写字母
- [:xdigit:]:任意十六进制数字
- 匹配多个实例
- 目前为止所有的正则表达式都试图匹配单次出现,但是有时需要对匹配的数目进行更强的控制
- *:0个或多个匹配
- +:一个或多个匹配
- ?:0个或1个匹配
- {n}:指定数目的匹配
- {n,}:不少于指定数目的匹配
- {n,m}:匹配数目的范围
总结
以上基本就是常用到的MySQL正则表达式语法了,如果说你还没有合适的表来做练习,这里还有一个简单的测试方法
SELECT 'hello' REGEXP '[0-9]'
REGEXP检查总是返回0(没有匹配)或者1(匹配),所以显然这个语句的答案是返回0
总结下来你会发现,REGEXP和LIKE的不同在于,LIKE匹配整个串,而REGEXP匹配子串
正则表达式涉及的范围是很广的,本人在自学Linux的Bash编程时也是常常用到它,所以这是你必须掌握的技能
文章如果存在问题或者有其他可以添加的语法,希望大佬斧正和评论,希望我和大家一起进步一起优秀