【MySQL】正则表达式

196 阅读6分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

目录

今天阿文介绍的内容:

  • 如何使用正则表达式查询
  • 正则表达式常用字符匹配

使用正则表达式查询

在MySQL中,正则表达式通常被用来检索替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。

例如:需要在一个文本文件中提取出一个电话号码,或者查找一篇文章中重复的单词或者替换用户输入的某些敏感词语等。

在MySQL中使用REGEXP关键字指定正则表达式的字符匹配模式。

正则表达式常用字符匹配列表:

选项说明例子匹配值示例
^匹配文本的开始字符'^b'匹配以字母b开头的字符串book、big、banana、bike
$匹配文本的结束字符'st$'匹配以st结尾的字符串test、resist、persist
.匹配任何单个字符'b.t'匹配任何b和t之间有一个字符的字符串bit、bat、but、bite
*匹配零个多个在它前面的字符'f*n'匹配字符n前面有任意个字符f的字符串fn、fan、faan、faben
+匹配前面的字符1次或多次'ba+'匹配以b开头后面紧跟至少一个a的字符串ba、bay、bare、battle
<字符串>匹配包含指定的字符串的文本'ba'匹配包含fa的字符串fan、afa、faad
[字符集合]匹配字符集合中的任何一个字符'[xz]'匹配包含x或者z的字符串dizzy、zebra、x—ray、extra
[^]匹配不在括号中的任何字符'[^abc]'匹配任何不包含a、b或c的字符串desk、fox、f8ke
字符{n,}匹配前面连续出现至少n次的字符串'b{2}'匹配2个或更多的bbbb、bbbbb、bbbbbb
字符{n,m}匹配前面的字符串连续出现至少n次,至多m次,如果n为0,此参数为可选参数'b{2,4}'匹配含最少2个、最多4个b的字符串bb、bbb、bbbb

1.查询以特定字符或字符串开头的数据

字符‘^’匹配以特定字符或者字符串开头的文本。

例子:

SELECT * FROM fruits WHERE f_name REGEXP '^b';

查询结果:

image.png

在fruits表中有3条数据的f_name字段值是以字母b开头的,所以返回结果有3条数据

例子:

SELECT * FROM fruits WHERE f_name REGEXP '^ba';

查询结果:

image.png

在fruits表中,只有banana以'ba'开头,所以返回的结果只有一条数据

2.查询以特定字符或字符串结尾的数据

字符‘$’匹配以特定字符或者字符串结尾的文本。

例子

SELECT * FROM fruits WHERE f_name REGEXP 'a$';

查询结果:

image.png

在fruits表中有2条数据的f_name字段值是以字母a结尾的,所以返回结果有2条数据

例子:

SELECT * FROM fruits WHERE f_name REGEXP 'ry$';

查询结果:

image.png

在fruits表中有3条数据的f_name字段值是以'ry'结尾,所以返回的结果有3条数据。

3.用符号'.'来代替字符串中的任意一个字符串

字符'.'匹配任意一个字符

例子:

SELECT * FROM fruits WHERE f_name REGEXP 'a.g';

查询结果:

image.png

可以看到,被查询出来的结果的f_name字段都包含'a.g'子串。

4.使用'*'和'+'来匹配多个字符

星号‘*’匹配前面的字符任意多次,包括0次。加号‘+’匹配前面的字符至少一次。

例子:

SELECT * FROM fruits WHERE f_name REGEXP '^ba*';

查询结果:

image.png

可以看到,'^ba*'表示以字母b开头,后面出现零个或n个字母a,所以blackberry和berry中字母b后面并没有出现字母a也被查询出来了。

例子:

SELECT * FROM fruits WHERE f_name REGEXP '^ba+';

查询结果:

image.png 与上面例子的查询结果不同的是这一次没有查询出blackberry和berry,这是因为'^ba+'表示以字母b开头,后面至少出现一个字母a,但blackberry和berry开头字母b后面都不是字母a,所以没有查询出来。

5.匹配指定字符串

正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符‘|’隔开。

例子:

SELECT * FROM fruits WHERE f_name REGEXP 'on';

查询结果:

image.png

可以看到,查询出数据的f_name字段中都包含'on'子串,所以满足匹配条件

例子:

SELECT * FROM fruits WHERE f_name REGEXP 'on|ap';

查询结果:

image.png

可以看到,在fruits表中的数据的f_name字段包含子串'on'或'ap'的数据都查询出来了。

提示:

之前介绍过,LIKE运算符也可以匹配指定的字符串,但与REGEXP不同,LIKE匹配的字符串如果在文本中间出现,则找不到它,相应的行也不会返回。REGEXP在文本内进行匹配,如果被匹配的字符串在文本中出现,REGEXP将会找到它,相应的行也会被返回。

5.1LIKE 与 REGEXP的区别

LIKE例子:

SELECT * FROM fruits WHERE f_name LIKE 'berry';

REGEXP例子:

SELECT * FROM fruits WHERE f_name REGEXP 'berry';

LIKE查询结果:

image.png

REGEXP查询结果:

image.png

可以看到REGEXP例子,把blackberry也查询出来了,这是因为:

  • REGEXP语句满足的条件是:正则表达式是文本的子串即满足匹配条件
  • LIKE语句满足的条件是:文本必须与正则表达式完全相等

所以当我们需要找到某个特定文本的时候,使用LIKE语句最合适了,而REGEXP主要用于找到包含特定内容的文本

6.匹配指定字符中的任意一个

方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。

例子:

SELECT * FROM fruits WHERE f_name REGEXP '[ot]';

查询结果:

image.png 由查询结果可以看到,所有返回的记录的f_name字段的值中都包含有字母o或者t,或者两个都有。

小技巧:

在使用方括号匹配集合'[456]'也可以写成'[4-6]',即指定集合区间。例如,'[a-z]'表示集合区间为从a~z的字母,'[0-9]'表示集合区间为所有数字。

7.匹配指定字符以外的字符

“[^字符集合]”匹配不在指定集合中的任何字符

例子:

SELECT * FROM fruits WHERE f_id REGEXP '[^a-e1-2]';

查询结果:

image.png

返回记录中的f_id字段值中包含指定字母和数字以外的值,如s、m、o、t等,这些字母均不在ae与12之间,满足匹配条件。

8.使用{n,}或者{n,m}来指定字符串连续出现的次数

'字符{n,}'表示至少连续匹配n次字符;'字符{n,m}'表示连续匹配字符不少于n次,不多于m次。例如,a{2,}表示字母a连续出现至少2次,也可以大于2次;a{2,4}表示字母a连续出现最少2次,最多不能超过4次。

例子:

SELECT * FROM fruits WHERE f_name REGEXP 'ab{1,3}';

查询结果:

image.png "ab{1,3}"表示匹配包含子串"ab","abb","abbb"的字符串

可以看到,f_name字段的"xbabay"和"xbababa"包含"ab"子串,

例子:

SELECT * FROM fruits WHERE f_name REGEXP 'ab{2,3}';

查询结果:

image.png 可以看到,没有查询出结果,因为在fruits表中f_name字段没有包含'abb'或'abbb'的字符串。


总结

  • MySQL提供了强大灵活的正则表达式,在查询数据时,对数据进行筛选

好了,阿文今天就介绍到这了... byebye!