MySQL使用正则表达式搜索

引言

在MySQL中,我们常用LIKE关键词对文本进行搜索,但是LIKE关键词的搜索能力有限,当随着搜索条件越来越复杂,LIKE关键词进行搜索的复杂度会随之增加,因此,在必要的时候,我们需要使用正则表达式进行搜索。
正则表达式是用来匹配文本的特殊的字符集合,正则表达式的功能十分强大。如:可以从一个文本文件中提取电话号码;可以查找名字中有数字的所有文件;可以在一个文本块中找到所有重复的单词;可以替换一个页面中所有的URL;等等。

一、正则表达式基本语法

在MySQL中使用正则表达式搜索,需要使用关键词REGEXP,其基本语法与LIKE关键词一致:

select col from table1 where col regexp 'abc';

二、正则表达式搜索的优点

在上面的例子中,我们似乎可以使用LIKE关键词完成相同功能:

select col from table1 where col like 'abc';

其实,在上面的例子中,这两句话返回的结果可能一致,但也可能不一致,这可以算是正则表达式搜索的一个优点。
在LIKE关键词搜索中,LIKE关键词匹配整个列,如果被匹配的文本在列值中出现(即只是这个列的值得一部分),LIKE关键词将不会找到它,相应的行也不会返回(除非使用通配符);而正则表达式搜索时,REGEXP在列值中进行匹配,只要被匹配的文本在列值中出现,REGEXP将会找到它,并且返回该行。
ps:当然,regexp也能实现和like关键词一样的功能,只要使用定位符 “^”“$” 即可。后面会讲到。

三、MySQL正则表达式搜索

正则表达式搜索的强大之处在于他们非常丰富的操作符。

(1)基本字符匹配:
select col from table1 where col regexp 'abc' 匹配包含词abc的行
select col from table1 where col regexp '.abc' . 是正则表达式语言中的一个特殊字符,它表示匹配任意一个字符,类似于like关键词搜索中的 _

(2)进行OR匹配:
正则表达式语言中 “|” 作为or操作符,表示匹配其中之一。
select col from table1 where col regexp 'abc|def|ghi';

(3)匹配几个字符之一:
如果要匹配一组特定的字符,可以使用中括号([ ])将字符括起来。
select col from table1 where col regexp '[123]abc';将返回含有 1abc 或 2abc 或 3abc 的行。

(4)范围匹配:
[0-9]相当于[0123456789],可以匹配任意数字;同理[a-z]可以匹配任意字母。
select col from table1 where col regexp '[1-3]abc';将返回含有 1abc 或 2abc 或 3abc 的行。

(5)匹配特殊字符:
MySQL正则表达式中,匹配特殊字符需要使用"\\"为前导,这种处理叫做转义,相当于将具有特殊含义的字符转换为字符本身。在匹配所有特殊字符时,都要进行转义。
select col from table1 where col regexp '\\_';返回含有_字符的行。

注意:
1.如果需要匹配反斜杠 \ 本身,则需要使用三个反斜杠\\\。
2.多数正则表达式实现使用单个反斜杠转义特殊字符,但是MySQL要求两个反斜杠,实际是MySQL自己解释一个,正则表达式库解释一个。

“\\”也用来引用元字符(具有特殊含义的字符):

元字符 说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表

(6)匹配字符类:
如果我们要匹配所有数字、所有字母等内容,可以使用字符类来进行简化操作;

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\\t])
[:cntrl:] ASCII控制字符(ASCII 0到31和127)
[:digit:] 任意数字(同[0-9])
[:graph:] 与[:print:]相同,但不包括空格
[:lower:] 任意小写字母(同[a-z])
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])
[:upper:] 任意大写字母(同[A-Z])
[:xdigit:] 任意十六进制数字(同[a-fA-F0-9])

例如:

select col from table1 where col regexp '[[:digit:]]abc'

匹配任意一个数字和abc连起来的词

(7)匹配多个实例:
如果要对匹配的文本的重复次数进行控制,需要使用重复元字符。

元字符 说明
* 0个或多个匹配
+ 1个或多个匹配(等于{1,})
0个或1个匹配)(等于{0,1})
{n} n次匹配
{n,} 不少于n次匹配
{m,n} 匹配数目的范围,n最大值不超过255

例如:

select col from table1 where col regexp '[[:digit:]]{4}';

匹配连在一起的4位数字。

(8)定位符:
如果要匹配在文本中特定位置的字符,需要用到定位符。

元字符 说明
^ 文本的开始处
$ 文本的结尾处
[[:<:]] 词的开始处
[[:>:]] 词的结尾处

注意^的双重用途:
^有两种用法,在集合中([ ]),用它来否定该集合,否则用来指定字符集的开始。

例如:

select col from table1 where col regexp '^[0-9\\.]';

匹配以一个数字或小数点开头的文本。

select col from table1 where col regexp '^abc$';
#相当于
select col from table1 where col like 'abc';

四、MySQL正则表达式搜索注意事项

  1. MySQL中的正则表达式匹配不区分大小写,如果需要区分大小写,需要用BINARY关键字,如where col regexp binary ‘Abc’
  2. 正则表达式搜索效率较低,搜索速度较慢,在使用正则表达式之前,应该进行简单测试。如select ‘hello’ from ‘[0-9]’; 如果匹配将返回1,否则返回0.
发布了20 篇原创文章 · 获赞 10 · 访问量 1442

猜你喜欢

转载自blog.csdn.net/Jerry_Chang31/article/details/104896783