『MySQL』用正则表达式进行搜索
正则表达式介绍
正则表达式是用来匹配文本的特殊的串(字符集合)。
本文仅做基础介绍,透彻的讲解详见《正则表达式必知必会》。
使用MySQL正则表达式
- 注意:MySQL仅支持多数正则表达式实现的一个很小的子集。
基本字符匹配
1 | SELECT prod_name |
.
是正则表达式语言中一个特殊的字符,他表示匹配任意一个字符。LIKE匹配整个列:如果被匹配的文本在列值中出现,
LIKE
将不会找到他,相应的行也不会被返回(除非使用通配符)。REGEXP在列值内进行匹配:如果被匹配的文本在列值中出现,
REGEXP
会找到他,相应的行将被返回。匹配不区分大小写:MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即大写和小写都匹配)。为区分大小写,可使用
BINARY
关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000';
。
进行OR匹配
1 | SELECT prod_name |
|
为正则表达式的OR
操作符,它表示匹配其中之一。- 两个以上的OR条件:可以给出两个以上的
OR
条件。例如,'1000|2000|3000'
将匹配1000或2000或3000。
匹配几个字符之一
1 | SELECT prod_name |
正则表达式
[123] Ton
为[1|2|3] Ton
的缩写,也可以使用后者。要把字符|
括在一个集合中,否则它将应用于整个串。[1|2|3] Ton
与1|2|3 Ton
的区别:后者意思为’1’或’2’或’3 Ton’。字符集合也可以被否定。为否定一个字符集,在集合的开始处放置一个
^
即可。例如,
[123]
可以匹配1或2或3,[^123]
可以匹配除这些字符之外的任何东西。
匹配范围
- 匹配数字0-9:
[0123456789]
或者[0-9]
。 - 匹配任意字符字母:
[a-z]
。
1 | SELECT prod_name |
匹配特殊字符
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
1 | SELECT 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 | SELECT prod_name |
1 | -- 匹配包含连在一起的4位数字的prod_name |
定位符
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
1 | -- 找出以一个数(或小数点)开始的所有产品 |
^的双重用途:
^
有两种用法。在集合中(用[
和]
定义),用它来否定集合,否则,用来指串的开始处。使REGEXP起类似LIKE的作用:通过用
^
开始每个表达式,用$
结束每个表达式,可以使REGEXP
的作用与LIKE
一样。简单的正则表达式测试
可以在不使用数据库表的情况下用
SELECT
来测试正则表达式。REGEXP
检查总是返回0(没有匹配)或1(匹配)。例如,
SELECT 'hello' REGEXP '[0-9]';
,显然将返回0(因为文本hello中没有数字)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KissSheep's Blog!
评论