MySQL中正则表达式如何使用

前言

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

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

  • 从文本文件中提取电话号码

  • 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值等于&
rsquo;
小白&
lsquo;
的数据,而第二条的查询结果是name中包含&
rsquo;
小白&
rsquo;
的数据,也可以用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自己解释一个,正则表达式库解释一个)

匹配字符类

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

匹配多个实例

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

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

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

定位符

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

找出一个以一个数(包括小数点开始的数)开始的所有数值,简单搜索[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(&
lsquo;
m&
rsquo;
,&
rsquo;
y&
rsquo;
,&
rsquo;
s&
rsquo;
,&
rsquo;
q&
rsquo;
,&
rsquo;
l&
rsquo;
);

返回:mysql

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

1.find_in_set:SELECT * FROM user WHERE find_in_set(&
lsquo;
吴&
rsquo;
,name);

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

2.REGEXP:SELECT * FROM user WHERE name REGEXP &
lsquo;
(&
lsquo;
吴&
rsquo;
|&
lsquo;
刘&
rsquo;
)&
rsquo;
;

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



MySQL是一个广泛使用的关系型数据库管理系统,它提供了许多方便、高效的功能以支持开发人员的需求。正则表达式是MySQL中很重要的一个工具,它可以让我们更方便、高效地搜索、筛选出我们需要的数据。下面将详细介绍MySQL中正则表达式的使用方法。
一、正则表达式的基础知识
正则表达式是一种用于匹配字符串的工具,我们可以通过一些字符或者一些特殊符号来表示一些特定的字符、字符集、字符范围、重复次数等。在MySQL中,正则表达式的基本语法如下:
SELECT column_name FROM table_name
WHERE column_name REGEXP 'regular_expression';
其中,column_name 表示要匹配的列名,table_name 表示要匹配的表名,regular_expression 表示由正则表达式组成的字符串。在MySQL中,可以使用多个正则表达式函数进行处理,例如:
1. REGEXP:MySQL中用于匹配正则表达式的关键字。
2. RLIKE:MySQL同样用于匹配正则表达式的关键字。
3. REGEXP_REPLACE:MySQL用于替换正则表达式匹配到的字符串。
二、正则表达式的通用字符
在正则表达式中,一些特殊的字符表示特殊的含义。下面是一些常用的正则表达式通用字符:
1. '\\d':匹配一个数字字符。
2. '\\D':匹配一个非数字字符。
3. '\\w':匹配一个单词字符(包括字母、数字以及下划线)。
4. '\\W':匹配一个非单词字符。
5. '\\s':匹配一个空白字符(包括空格、制表符、换行符等)。
6. '\\S':匹配一个非空白字符。
三、正则表达式的基本规则
正则表达式中常用的一些规则包括:
1. []:匹配一组字符中的任何一个。
例如:[abc]表示匹配a或b或c,[a-z]表示匹配a到z之间的任意字符。
2. ^:表示匹配字符串的开头。
例如:'^a'表示匹配以a开头的字符串。
3. $:表示匹配字符串的结尾。
例如:'a$'表示匹配以a结尾的字符串。
4. :*:表示匹配任意数量的前一个字符。
例如:'ab*'表示匹配以a开头的任意数量的b字符。
5. +:表示匹配一个或多个前一个字符。
例如:'ab+'表示匹配以a开头的至少有一个b字符的字符串。
6. ?:表示匹配可能出现的前一个字符。
例如:'colou?r'表示匹配color或colour两种情况。
通过这些基本规则的组合,我们可以构建出非常复杂的正则表达式,达到精确、高效检索数据的目的。
总结:
正则表达式是MySQL中非常重要、方便的一种搜索工具,通过一些特定的语法规则,我们可以轻松地编写出复杂、精准的匹配规则,来满足我们各种数据搜索的需求。当然,在使用正则表达式的时候也需要谨慎小心,不要过度使用,否则也可能会影响数据库的效率。