MySQL中使用正则表达式搜索数据
一、正则表达式简介
正则表达式是提供了特殊搜索模式的字符串,用于匹配文本,在这一点上面功能和通配符搜索字符串的功能一致。两者之间的区别在于,正则表达式在列值中匹配,即匹配文本的位置不限于从文本首端开始,可以匹配任意位置,相当于是寻找“子串”。但是通配符搜索模式进行匹配时,匹配整列,即从文本的开始处开始匹配,知道列值结束。
在计算机技术中,正则表达式使用广泛,程序设计语言、文本编辑器、操作系统等都支持正则表达式,是一个很强大的文本处理工具。
MySQL中的正则表达式:MySQL在WHERE子句中对正则表达式提供了初步的支持,但是MySQL中仅支持多数正则表达式实现的一个很小的子集,下面学习MySQL支持的大多数内容,关键在于怎样使用这些正则表达式解决实际中的问题。
二、MySQL中正则表达式的使用
假如存在两张表products和vendors。
使用正则表达式检索数据 | MySQL语句| 解释说明 |
|---|---|
| SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
| REGEXP关键字 :用于WHERE子句中,表示后面是一个正则表达式。这里的‘1000’是纯文本匹配,正则表达式允许纯文本匹配 ,在列值中匹配。 | ||||
|---|---|---|---|---|
| SELECT prod_name FROM products WHERE prod_name REGEXP BINARY 'JetPack .000'; | BINARY关键字 :使用BINARY关键字区分正则表达式匹配中的大小写。MySQL自3.23.4之后,MySQL中正则表达式匹配不再区分大小写。 | |||
| SELECT prod_name FROM products WHERE prod_name REGEXP '1000 | 2000' | ** | 操作符** : | 为正则表达式中的OR操作符,匹配给定模式之一。 |
| SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;| [123]字符集 :表示匹配字符1/2/3中的任意一个。实际上[1|2|3]的简写,为了实现意图,使用一个[]号将这三个字符括起来,而不是使用小括号,这里使用中括号。注意正则表达式中的空格,也是匹配的一个字符,不要忽略这一点。字符集合被否定^ :表示匹配除指定字符外的任何东西,例如[^123]。
| SELECT vend_name FROM vendors WHERE vend_name REGEXP '\ .' ORDER BY vend_name;| 转义(escaping) :为了匹配字符,MMySQL必须使用\ 作为前导。正则表达式内有特殊意义的所有字符都必须以这种方式转义。元字符 :有特殊含义的字符,使用\ 来引用。为了匹配\本身,需要使用\ \。说明 :多数正则表达式中使用单个反斜杠来转义特殊字符,以便能够使用这些字符本身 ,但是MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。
||
| SELECT prod_name FROM products WHERE prod_name REGEXP '\ ([0-9] sticks?\ )'| 转义字符 :\ 转义(和),可见两边的括号都应该被转义。? :在正则表达式中可以使用纯文本匹配。这里的意思是:0个或1个s字符。
||
| SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;| [:digit:] :数字的集合(字符类),表示任意数字。{4} :要求它前面的字符出现4次。注意 :同一个匹配,可以对应不同的正则表达式。
||
| SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\ .]' ORDER BY prod_name;| ^ :定位符表示从文本开头匹配,即要求串的开头是一个数字或者一个.。技巧 :通过用^开始每个表达式,用$结束每个表达式,可以是REGEXP实现与LIKE一样的功能。
||
什么是正则表达式中空白元字符?
空白元字符就是下面的这些具有一定特殊含义的字符。空白元字符就是看不见的,但是确实存在的文本格式控制字符,用于文本格式控制。
正则表达式中的空白元字符 | 元字符
| 解释说明 | |
|---|---|
| \ f | 换页 |
| \ n | 换行 |
| \ r | 回车 |
| \ t | 制表 |
| \ v | 纵向制表 |
什么是正则表达式字符类?
所谓正则表达式字符类,就是把经常可能会用到的数字、字母或者数字和字母预定义在一个字符集中,使用时就能够直接使用,方便。就相当于C语言中int代表整型数据类型一样,作为一个整型数据的集合。
正则表达式字符类 | 字符类| 解释说明 |
| --- | --- |
|---|---|
| [:alpha:] | 任意字母字符,同[a-zA-Z] |
| [:blank:] | 空格和制表,同[\ t]。 |
| [:cntrl:] | ASC2控制字符(ASC2 0到31和127) |
| [:digit:] | 任意数字 |
| [:print:] | 任意可打印字符 |
| [:graph:] | 与[:print:]相同,但是不包含空格 |
| [:lower:] | 任意小写字母,同[a-z] |
| [:punct:] | 既不在[:alnum:]中又不在[:cntrl:]中的任意字符 |
| [:space:] | 包括空格在内的任意空白字符,同[\ f\ n\ r\ t\ v] |
| [:upper:] | 任意大写字母 |
| [:xdigit:] | 任意16进制数字,同[a-fA-F0-9] |
什么是正则表达式的重复元字符?
使用重复元字符控制正则表达式匹配的字符的数目,如果没有重复元字符,则匹配单词出现。比如[123]则单次匹配1或者2或者3,即只匹配出现一次的。
使用重复元字符,可以匹配数字,不管数中包含有多少个数字;可以匹配一个单词,并且适应一个尾随的s(如果存在)等等。下面来看正则表达式中有哪些重复元字符。
正则表达式重复元字符 | 重复元字符| 解释说明 |
|---|---|
| *
| 0个或者多个匹配 | |
|---|---|
| ? | 0个或1个匹配,等于{0, 1} |
| {n} | 指定数目的匹配 |
| {n,} | 不少于指定数目的匹配 |
| {n,m} | 匹配数目的范围,m不超过255 |
什么是正则表达式中的定位元字符?
不使用定位元字符,正则表达式会匹配一个串中任意位置的文本。使用定位元字符可以控制匹配的位置。正则表达式中的定位符如下。
正则表达式中定位元字符 | 定位元字符| 解释说明 |
|---|---|
| ^
| 文本的开始 | |
|---|---|
| [[:<:]] | 词的开始 |
| [[:>:]] | 词的结尾 |
