一、正则表达式简介
正则表达式是提供了特殊搜索模式的字符串,用于匹配文本,在这一点上面功能和通配符搜索字符串的功能一致。两者之间的区别在于,正则表达式在列值中匹配,即匹配文本的位置不限于从文本首端开始,可以匹配任意位置,相当于是寻找“子串”。但是通配符搜索模式进行匹配时,匹配整列,即从文本的开始处开始匹配,知道列值结束。
在计算机技术中,正则表达式使用广泛,程序设计语言、文本编辑器、操作系统等都支持正则表达式,是一个很强大的文本处理工具。
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 '.000' ORDERBY prod_name; | .字符:正则表达式中一个特殊字符,匹配任意一个字符,和通配符中的_一样。 |
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 prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name; | 使用-在[]中定义一个范围。范围还可以是[a-z]等。 |
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代表整型数据类型一样,作为一个整型数据的集合。
字符类 | 解释说明 |
---|---|
[:alnum:] | 任意字母和数字,相当于[a-zA-Z0-9]。看起来使用[:alnum:]方便多了。如果有多个范围,范围之间不需要隔离开。 |
[: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个或者多个匹配 |
+ | 1个或者多个匹配,等于{1,} |
? | 0个或1个匹配,等于{0, 1} |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围,m不超过255 |
什么是正则表达式中的定位元字符?
不使用定位元字符,正则表达式会匹配一个串中任意位置的文本。使用定位元字符可以控制匹配的位置。正则表达式中的定位符如下。
定位元字符 | 解释说明 |
---|---|
^ |
文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |