本人在初学mysql语言,因害怕忘记,故把学习笔记写到这个博客上,以备查阅
第九章:用正则表达式进行搜索
所有种类的程序设计语言,文本编辑器,操作系统等都支持正则表达式。有见识的程序员和网络管理员已经关注作为他们技术工具重要内容的正则表达式很长时间了。
正则表达式使用正则表达式语言建立,与任意语言一样,正则表达式具有你必须学习的特殊语法和指令。
9.2.1 基本字符匹配
检索列prod_name包含文本1000的所有行
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000';
9.2.2 进行OR匹配
检索列prod_name中包含1000或2000的所有行
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
OREDER BY prod_name;
9.2.3 匹配几个字符之一
通过指定一组用[ 和 ]括起来的字符来完成
检索列prod-name中使用'1 ton'或'2 ton'或'3 ton'的所有列
[ ]是另一种形式的OR语句。事实上,正则表达式[123] ton为[1|2|3] ton的缩写,两者都可以使用。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] ton'
ORDER BY prod_name;
注意下面的这个例子,检索的是列prod_name中包含’1‘或‘2’或‘3 ton’的所有行
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 ton'
ORDER BY prod_name;
[^123]匹配除这些字符之外的任何东西
9.2.4 匹配范围
下面的例子中[a-z]定义了一个范围,这个表达式意思是匹配a到c
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[a-c] ton'
ORDER BY prod_name;
9.2.5 匹配特殊字符
如果想匹配 . [ ] -等一些特殊字符,必须用\\为前引导。\\-表示查找-,\\.表示查找. 。
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
\\也用来引用元字符(具有特殊含义的字符)
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表
9.2.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])
9.2.7 匹配多个实例
* 0个或多个匹配
+ 1个或多个匹配(等于{1,})
? 0个或一个匹配(等于{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]匹配任意数字
sticks?匹配stick和sticks(s后的?使s可选,因为?匹配前面的任何字符的0次或1次出现)
\\) 匹配)
如果没有?,匹配stick和sticks会非常困难
例子:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
如前所述,[:digit:]匹配任意数字,因而它为数字的一个集合。{4}确切的要求它前面的字符(任意数字)出现4次,所有[[:digit:]]{4} 匹配连在一起的任意四位数字。
注意:在使用正则表达式时,编写某个特殊的表达式几乎总有不止一种方法。上面的例子也可以写成如下:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[0-9]'[0-9]'[0-9]'[0-9]'
ORDER BY prod_name;
9.2.8 定位符
为了匹配特定位置的文本,需要使用如下图所示的定位符
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
例子:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
^匹配串的开始。因此,^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配他们。
注意:^的双重用途
1.用在[和]中,否定该集合
2.用来指串的开始处
简单的正则表达式测试
REGEXP检查总是返回0(没有匹配)或1(匹配)。所以可以用代字符串的REGEXP来测试表达式,并试验他们,相应的语法如下:
SELECT 'hello' REGEXP '[0-9]';
这个例子返回0(文本中无hello)或1(文本中有hello)
本章小结
本章介绍了正则表达式的基础知识,学习了如何在MySQL的SELECT语句中通过REGEXP关键字来使用他们。
第一次在优快云上写博客,用了将近1个半小时,而且排版好麻烦,应该是我不会用,但是一方面加深了记忆,另一方面也会让我慢慢养成习惯。以后我要养成习惯,加油。。。