正则表达式是用正则表达式语言来建立 ,用来匹配文本的特殊的串(字符集合) 。
mysql用WHERE子句对正则表达式提供了初步的支持,允许你用正则表达式过滤SELECT检索出来的数据,使用正则表达式需要用 REGEXP 关键字。
检索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'
.是正则表达式中的一个特殊字符,它表示匹配任意字符
MYSQL中的正则表达式默认不区分大小写,要想区分大小写,则使用 BINARY 关键字,例如:WHERE column_name REGEXP BINARY ‘asDF’;
为搜索两个串之一,使用|,表示符合其中一个条件就进行匹配,类似于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
可以通过指定一组用[和]括起来的字符来完成,如下所示:
检索column1_name包含1或者2或者3的所有行,等价于’1|2|3’
SELECT column1_name,column2_name WHERE column1_name REGEXP '[123]';
字符集也可以用来否定,只需在集合的开始出放置一个\^即可,例如[\^123]匹配除1、2、3外的任何东西
集合可用来定义匹配一个或者多个字符,例如:[0123456789]用来匹配0-9的数字。
为了简化可可以使用-来定义一个范围。例如[0-9]可以代替上诉列表
[a-z]可以匹配任意字母
正则表达式由一些特殊的字符组成,例如.、[]、|和-等,此时要匹配它们需要使用 \\ 进行转义
元字符 | 说明 |
---|---|
\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]) |
可以使用正则表达式重复元字符来实现
重复元字符 | 说明 |
---|---|
* | 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}'
正则表达式匹配一个字符串中任意位置的文本,为了匹配特定位置的文本需要使用定位符。
定位元字符
定位符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结束 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
例如:
匹配以数字开始的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