mysql系列(七)SQL语句之使用正则表达式进行搜索

一、什么是正则表达式

正则表达式是用正则表达式语言来建立 ,用来匹配文本的特殊的串(字符集合) 。

二、使用mysql正则表达式

mysql用WHERE子句对正则表达式提供了初步的支持,允许你用正则表达式过滤SELECT检索出来的数据,使用正则表达式需要用 REGEXP 关键字。

2.1 基本字符匹配

检索column1_name包含文本1000的所有行

SELECT column1_name,column2_name FROM table WHERE column1_name REGEXP '1000'

返回所有包含x000的行

SELECT column1_name,column2_name FROM table WHERE column1_name REGEXP '.000'

.是正则表达式中的一个特殊字符,它表示匹配任意字符

REGEXP和LIKE非常相似,但是他们也有区别:
  • LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会匹配它(除非使用通配符)
  • REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行会被返回(使用^和$定位符也可以使REGEXP匹配整个列值,起到和LIKE一样的作用。用法:REGEXP ‘^1000$’)

MYSQL中的正则表达式默认不区分大小写,要想区分大小写,则使用 BINARY 关键字,例如:WHERE column_name REGEXP BINARY ‘asDF’;

2.2 进行OR匹配

为搜索两个串之一,使用|,表示符合其中一个条件就进行匹配,类似于OR语句。
检索column1_name包含1000或者2000的所有行

SELECT column1_name,column2_name WHERE column1_name REGEXP '1000 | 2000';

多个OR条件可并入单个正则表达式,例如’1000|2000|3000’将匹配成1000 OR 2000 OR 3000

2.3 匹配几个字符之一

可以通过指定一组用[和]括起来的字符来完成,如下所示:
检索column1_name包含1或者2或者3的所有行,等价于’1|2|3’

SELECT column1_name,column2_name WHERE column1_name REGEXP '[123]';

字符集也可以用来否定,只需在集合的开始出放置一个\^即可,例如[\^123]匹配除1、2、3外的任何东西

2.4 匹配范围

集合可用来定义匹配一个或者多个字符,例如:[0123456789]用来匹配0-9的数字。

为了简化可可以使用-来定义一个范围。例如[0-9]可以代替上诉列表

[a-z]可以匹配任意字母

2.5 匹配特殊字符

正则表达式由一些特殊的字符组成,例如.、[]、|和-等,此时要匹配它们需要使用 \\ 进行转义

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

为了匹配反斜杠(\)字符本身,需要使用\\\。

多数正则表达式使用单个反斜杠匹配特殊字符,mysql要求两个,mysql自己解释一个,正则表达式解释一个

2.6 匹配字符类
为了匹配经常使用的数字、所有字母字符、所有数字字母字符等,可以使用预定义的字符集,称为字符类(character class)。

说明
[:alnum:] 任意字母和数字(同[0-9a-zA-Z])
[: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])
[:xdigit:] 任意十六进制数字(同[0-9a-fA-F])

2.7 匹配多个实例

可以使用正则表达式重复元字符来实现

重复元字符 说明
* 0个或多个匹配
+ 一个多多个匹配,等价于{1,}
? 0个或一个匹配,等价于{0,1}
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)

例如:
匹配column1_name包含app或者apps的行。?表示在它前面的任何字符出现一次或者零次

SELECT column1_name,column2_name WHERE column1_name REGEXP 'apps?'

匹配column1_name包含连续四位任意数字的行
正则表达式一般有很多种写法,’[[:digit:]]{4}’等价于’[0-9][0-9][0-9][0-9]’

SELECT column1_name,column2_name WHERE column1_name REGEXP '[[:digit:]]{4}'

2.8 定位符

正则表达式匹配一个字符串中任意位置的文本,为了匹配特定位置的文本需要使用定位符。

定位元字符

定位符 说明
^ 文本的开始
$ 文本的结束
[[:<:]] 词的开始
[[:>:]] 词的结尾

例如:
匹配以数字开始的column1_name的行,如果不使用^则会在column1_name的任意位置进行匹配,中间位置有数字的行也会被检索出来,无法达到预期目的。

SELECT column1_name,column2_name WHERE column1_name REGEXP '^[0-9]';
^的双重用法
  • 在集合(用[]定义)中,用它表示否定该集合
  • 指串的开始处

另外,在集合中,用\^开始,用$结束(即[\^ xxx $]),可以使REGEXP具有和LIKE相同的作用,表示匹配整个列值

在数据库中可以在没有表的情况下用SELECT测试正则表达式,REGEXP总是返回0(不匹配)或者1(匹配)

SELECT 'hello' REGEXP '[a-zA-Z]'

返回结果:1

猜你喜欢

转载自blog.csdn.net/zjx2016/article/details/80784449