概述
正则表达式和MySQL有何关系?正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用where
子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤select
检索出的数据。
表达式语法
基本字符匹配
基本语法如下所示:
select prod_name from products where prod_name regexp '1000'
上面的语句作用是检索列prod_name中包含文本1000的所有行。
select prod_name from products where prod_name regexp '.000'
上面的语句中的.
是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此,1000和2000都匹配且返回。
PS:MySQL中的正则表达式匹配不区分大小写。为区分大小写,可使用BINARY关键字,如:
where prod_name regexp binary 'jetpack .000'
进行OR
匹配
为搜索两个串之一,使用|
,如下所示:
select prod_name from products where prod_name regexp '1000|2000|3000'
匹配几个字符之一
匹配任何单一字符。但是,如果你只想匹配特定的字符,怎么办?可通过指定一组[
和]
括起来的字符完成,如下所示:
select prod_name from products where prod_name regexp '[123] Ton'
匹配范围
集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:
[0123456789]
为了简化这种类型的集合,可使用-
来定义一个范围。下面的式子功能等同于上述数字列表:
[0-9]
范围不限于完整的集合,[1-3]和[6-9]也是合法的范围。此外,范围不一定只是数值的,[a-z]匹配任意字母字符。
匹配特殊字符
为了匹配特殊字符,必须用\\
为前导。\\-
表示查找-
,\\.
表示查找.
。这种处理就是所谓的转义,正则表达式内具有特殊意义的所有字符都必须以这种方式转义。这包括.
、|
、[]
、\
等。
匹配字符类
存在找出你自己使用的数字、所有字母字符或所有数字字母字符等匹配。为了更方便的工作,可以使用预定义的字符集,称为字符类。表列出了字符类以及他们的含义:
类 | 说明 |
---|---|
[:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符 |
[:blank:] | 空格和制表 |
[:cntrl:] | ASCII控制字符 |
[:digit:] | 任意数字(同[0-9]) |
[:print:] | 任意可打印字符 |
[:graph:] | 与[:print:]相同,但不包括空格 |
[:lower:] | 任意小写字母(同[a - z]) |
[:punct:] | 既不在[:alnum:]又不在[:cntrl:]中任意字符 |
[:space:] | 包括空格在内的任意空白字符 |
[:upper:] | 任意大写字母 |
[:xdigt:] | 任意十六进制 |
匹配多个实例
目前为止使用的所有正则表达式都视图匹配单词出现。如果存在一个匹配,改行被检索出来,如果不存在,检索不出任何行。但是有需要对匹配的数目进行更强的控制。例如,你可能需要寻找所有的数,不管书中包含多少个字。
这可以用正则的表达式重复元字符来完成。
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 一个或多个匹配 |
? | 0个或一个匹配 |
{n} | n个数目的匹配 |
{n,} | n个以上的匹配 |
{n,m} | n~m个数目的匹配(m不超过255) |
定位符
目前为止的所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,需要使用下面给出的定位符:
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |