<MySQL学习二>用正则表达式进行搜索
本篇博客仅作为笔记,如有侵权,请联系,立即删除(网上找博客学习,然后手记笔记,因纸质笔记不便保存,所以保存到网络笔记)
1、正则表达式介绍
前面的过滤例子允许使用匹配、比较和通配操作符寻找数据。对于基本操作就足够了,但是随着过滤条件的复杂性的增加,WHERE子句本身的复杂性也有必要的增加。
正则表达式是用来匹配文本的特殊的串(字符集合)。正则表达式用正则表达式语言来建立,正则表达式语言是用来完成刚讨论的所有工作以及更多工作的一种特殊语言。与任何语言一样,正则表达式具有你必须学习的特殊的语法和指令。
2、使用MySQL正则表达式
正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。
(1)基本字符匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' (.000)将匹配不一样的结果 ORDER BY prod_name;
分析:除关键字LIKE被REGEXP替代外,这条语句看上去非常像使用LIKE的语句。它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理。
LIKE与REGEXP:在LIKE和REGEXP之间有一个重要的差别:
SELECT prod_name FROM products WHERE prod_name LIKE '1000' ORDER BY prod_name; SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
如果执行上述两条语句,会发现第一条语句不返回数据,而第二条语句返回一行。如前博所说,LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,除非使用通配符。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。
注意:MySQL中的正则表达式匹配不区分大小写(版本3.23.4后)。
(2)进行OR匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
语句中使用了正则表达式1000|2000。|为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。类似于使用OR语句。
(3)匹配几个字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
这里使用了正则表达式[123] Ton。[123]定义一组字符,它的意思是匹配1或2或3,因此1 ton和2 ton都会被匹配并且返回。[^123]却是匹配除这些字符外的任何东西。
(4)匹配范围
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
这里使用正则表达式[1-5]定义了一个范围,这个表示意思是匹配1到5。
(5)匹配特殊字符
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;
这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须以这种方式转义。这包括.、|、[]以及迄今为止使用过的其他特殊字符。
注意:\\也用来引用元字符(具有特殊含义的字符):
\\f换页 \\n换行 \\r回车 \\t制表 \\v纵向制表
(6)匹配字符
类 说明 [: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])
(7)匹配多个实例
目前为止使用的正则表达式都试图匹配单次出现。如果要匹配多个实例则需要正则表达式重复元字符来完成
元素符 | 说明 |
* | 0个或多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)' ORDER BY prod_name;
正则表达式\\([0-9] sticks?\\),\\(匹配),[0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick和sticks(s后面?使s可选,因为?匹配它前面的任何字符的0次或1次出现)\\)匹配)。
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]{4}]' ORDER BY prod_name;
{4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。当然,上述的匹配也可以写成'[0-9][0-9][0-9][0-9]'。
(8)定位符
元字符 | 说明 |
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;
^匹配串的开始。因此,^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。没有^会多检索出4个别的行(那些中间有数字的行)。
注意:^的双重用途:^有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。
使REGEXP起类似LIKE的作用:LIKE和REGEXP有不同的地方,LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。