正则表达式介绍

  • 正则表达式是用来匹配文本的特殊的串(字符集合)。

    本文仅做基础介绍,透彻的讲解详见《正则表达式必知必会》。

使用MySQL正则表达式

  • 注意:MySQL仅支持多数正则表达式实现的一个很小的子集。

基本字符匹配

1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
  • .是正则表达式语言中一个特殊的字符,他表示匹配任意一个字符。

  • LIKE匹配整个列:如果被匹配的文本在列值中出现,LIKE将不会找到他,相应的行也不会被返回(除非使用通配符)。

    REGEXP在列值内进行匹配:如果被匹配的文本在列值中出现,REGEXP会找到他,相应的行将被返回。

  • 匹配不区分大小写:MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即大写和小写都匹配)。为区分大小写,可使用BINARY关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000';

进行OR匹配

1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
  • |为正则表达式的OR操作符,它表示匹配其中之一。
  • 两个以上的OR条件:可以给出两个以上的OR条件。例如,'1000|2000|3000'将匹配1000或2000或3000。

匹配几个字符之一

1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
  • 正则表达式[123] Ton[1|2|3] Ton的缩写,也可以使用后者。要把字符|括在一个集合中,否则它将应用于整个串。

  • [1|2|3] Ton1|2|3 Ton的区别:后者意思为’1’或’2’或’3 Ton’。

  • 字符集合也可以被否定。为否定一个字符集,在集合的开始处放置一个^即可。

    例如,[123]可以匹配1或2或3,[^123]可以匹配除这些字符之外的任何东西。

匹配范围

  • 匹配数字0-9:[0123456789]或者[0-9]
  • 匹配任意字符字母:[a-z]
1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;

匹配特殊字符

元字符说明
\\f换页
\\n换行
\\r回车
\\t制表
\\v纵向制表
1
2
3
4
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
  • 为匹配特殊字符,必须用\\为前导。
  • 匹配\ :为了匹配反斜杠(\)字符本身,需要使用\\\
  • 多数正则表达式实现使用单个反斜杠转移特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠,MySQL自己解释一个,正则表达式库解释另一个。

匹配字符类

  • 为方便工作,可以使用预定义的字符集,称为字符类。
说明
[: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]

匹配多个实例

元字符说明
*0个或多个匹配
+1个或多个匹配(等于{1,}
?0个或1个匹配(等于{0,1}
{n}指定数目的匹配
{n,}不少于指定数目的匹配
{n,m}匹配数目的范围(m不超过255)
1
2
3
4
5
6
7
8
9
10
11
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;

/*
//( 匹配 (。
[0-9] 匹配任意数字。
sticks? 匹配stick或者sticks(s后的?使s可选)。
//) 匹配 )。
*/
1
2
3
4
5
-- 匹配包含连在一起的4位数字的prod_name
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}' # '[0-9][0-9][0-9][0-9]'
ORDER BY prod_name;

定位符

元字符说明
^文本的开始
$文本的结尾
[[:<:]]词的开始
[[:>:]]词的结尾
1
2
3
4
5
-- 找出以一个数(或小数点)开始的所有产品
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
  • ^的双重用途:^有两种用法。在集合中(用[]定义),用它来否定集合,否则,用来指串的开始处。

  • 使REGEXP起类似LIKE的作用:通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。

  • 简单的正则表达式测试

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

    例如,SELECT 'hello' REGEXP '[0-9]';,显然将返回0(因为文本hello中没有数字)。