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令人咋舌的隐式转换
Apr 05 MySQL
Mysql基础之常见函数
Apr 22 MySQL
MySQL中distinct与group by之间的性能进行比较
May 26 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
Mysql排序的特性详情
Nov 01 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 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安全配置
2006/12/06 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
php实现微信公众号无限群发
2015/10/11 PHP
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
node.js入门教程
2014/06/01 Javascript
JavaScript立即执行函数的三种不同写法
2014/09/05 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
python中文编码问题小结
2014/09/28 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
python读文件的步骤
2019/10/08 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
医学院学生求职简历的自我评价
2013/10/24 职场文书
青年志愿者活动方案
2014/08/17 职场文书
幸福中国演讲稿
2014/09/12 职场文书
紫日观后感
2015/06/05 职场文书
团结友爱主题班会
2015/08/13 职场文书