MySQL中正则表达式(REGEXP)使用详解


Posted in MySQL onJuly 07, 2022

前言

有时候使用MySQL进行数据库查询数据的时候,like查询存在局限性,这时候就可以使用MySQL中的正则表达式查询的方式。

正则表达式是用来匹配文本的特殊的串(字符集合),将一个模式(正则表达式)与一个文本串进行比较。

  • 从文本文件中提取电话号码
  • 查找名字中间带有数字的文件
  • 文本块中重复出现的单词
  • 替换页面的URL为这些URL的实际链接(一个或两个正则表达式)

LIKE和REGEXP的区别

LIKE匹配整个列(like是模糊查询),如果被匹配的文本仅在列值中出现,LIKE并不会找到它,相应的行也不会返回(当然,使用通配符除外)
REGEXP在列值内进行匹配,如果被匹配的匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回,这时一个非常重要的差别(当然,如果适应定位符号^和$,可以实现REGEXP匹配整个列而不是列的子集)

例如:

查询一个表name列含有chen字符串的数据,两条sql语句如下

select * from stu_info where name like '小白';
select * from stu_info where name regexp '小白';

第一条的查询结果是name值等于’小白‘的数据,而第二条的查询结果是name中包含’小白’的数据,也可以用like(模糊查询+通配符)来实现regexp查询结果。

OR进行匹配

select column from table where column regexp 'X|Y' order by column;
select column from table where column regexp '[XY]test' order by column;

第一种写法会将|应用于整个串,只要字符串中有X或Y的数据,都将被检索出来

第二种写法只将[XY]应用于搜索模式的开头处

匹配范围

([])集合可以用来定义要匹配的一个或多个字符,比如[0123456789],为了简化这种类型的集合,可使用(-)来定义一个范围,即[0-9],[a-z]

匹配特殊字符

则表达式由具有特定含义的特殊字符构成;如果要匹配这些特殊字符,就需要用\为前导,这种处理方式就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须以这种方式转义;(为了匹配反斜杠{}字符本身,需要使用\\)

注意:多数正则表达式实现使用单个反斜杠转义特殊字符,以便能够使用这些字符本身,而MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释一个)

MySQL中正则表达式(REGEXP)使用详解

匹配字符类

有时候需要检索出我们需要的数字、所有字母字符或所有数字字母字符等的匹配,我们可以使用预定义的字符集,称为字符类。

MySQL中正则表达式(REGEXP)使用详解

匹配多个实例

有时候需要对匹配的数目进行更强的控制,比如:寻找所有的数,不管数中包含多少数字,或寻找一个单词并尾随一个s(如果存在)等情况,我们可以利用正则表达式中的重复元字符来完成。

MySQL中正则表达式(REGEXP)使用详解

select column from table where column regexp '\\([0-9] sticks?\\)' order by column;

上面的正则表达式‘\([0-9] sticks?\)’意为:\匹配([0-9]匹配任意数字,这里指匹配的数值范围,sticks?匹配stick和sticks{?使s可选,因为?匹配它前面任何字符的0或者1次出现})。

定位符

有时候为了匹配特定位置的文本,需要使用定位符,常用定位符列表如下:

MySQL中正则表达式(REGEXP)使用详解

找出一个以一个数(包括小数点开始的数)开始的所有数值,简单搜索[0-9\.]或([[:digit:]\.])不行,因为它将在文本内任意位置查找匹配,可以使用^定位符,如下:

select column from table where column regexp '^[0-9\\.]' order by column;

^有两种用法

  • 在集合中(用[和]定义),用它来否定该集合
  • 用来指串的开始处

使regexp和like起相同作用:like匹配整串二regexp匹配子串,可以利用定位符,用^开始每个表达式,用$结束每个表达式,就可以使regexp和like作用一样。

查询admin表中的group字段,数据格式为:1,2,3;4,5,6;1,87,101

例如查询101:

select * from xin_admin where `group` REGEXP '[,|;]?101[,|;]?';

附:Mysql字符串截取 和 截取字符进行查询

一、MySQL中字符串的截取

MySQL中有专门的字符串截取函数:其中常用的有两种:substring_index(str,delim,count) 和concat

1.substring_index(str,delim,count) 函数的使用较为普遍。

函数括号里面的依次为:要分隔截取的字符串(如:”aaa_bbb_ccc”)、分隔符(如:“_”)、位置(表示第几个分隔符处,如:“1”)。

  • count为正数,那么就是从左边开始数,函数返回第count个分隔符的左侧的字符串;
  • count为负数,那么就是从右边开始数,函数返回第count个分隔符右边的所有内容;
  • count可以为0,返回为空。

例子:substring_index("aaa_bbb_ccc","_",1) ,返回为 aaa;
         substring_index("aaa_bbb_ccc","_",2) ,返回为 aaa_bbb;
         substring_index(substring_index("aaa_bbb_ccc","_",-2),"_",1) ,返回为 bbb;

2.concat是连接几个字符串

例子:concat(‘m’,’y’,’s’,’q’,’l’);

返回:mysql

二、依据表中的某个字段查询包含有这个字符的所有数据

1.find_in_set:SELECT * FROM user WHERE find_in_set(‘吴’,name);

查询user表中所有name包含“吴”的数据

2.REGEXP:SELECT * FROM user WHERE name REGEXP ‘(‘吴’|‘刘’)’;

使用正则,查询包含刘或者吴的数据

总结

到此这篇关于MySQL中正则表达式(REGEXP)使用的文章就介绍到这了,更多相关MySQL正则表达式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
MySQL infobright的安装步骤
Apr 07 MySQL
详解MySQL 用户权限管理
Apr 20 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
mysql中between的边界,范围说明
Jun 08 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
SQL基础的查询语句
Nov 11 MySQL
彻底解决MySQL使用中文乱码的方法
Jan 22 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySQL 原理与优化之Update 优化
Aug 14 MySQL
DQL数据查询语句使用示例
Dec 24 MySQL
MySQL实现字段分割一行转多行的示例代码
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 #MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 #MySQL
mysql全面解析json/数组
Jul 07 #MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
MySQL外键约束(Foreign Key)案例详解
Jun 28 #MySQL
MySQL主从切换的超详细步骤
Jun 28 #MySQL
You might like
PHP中图片等比缩放的实例
2013/03/24 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
python实现线程池的方法
2015/06/30 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
python中requests和https使用简单示例
2018/01/18 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
python连接mongodb密码认证实例
2018/10/16 Python
linux安装python修改默认python版本方法
2019/03/31 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
销售类个人求职信范文
2013/09/25 职场文书
实习护士自我鉴定
2013/10/13 职场文书
行政管理专业推荐信
2013/11/02 职场文书
金融专业毕业生推荐信
2013/11/26 职场文书
人力资源主管职责范本
2014/03/05 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
行政前台岗位职责
2015/04/16 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android