9.1 正则表达式介绍
正则表达式是用来匹配文本的特殊的串(字符集合),并且在所有操作系统、文本编辑器等都支持正则表达式
9.2 使用正则表达式
MySQL用WHERE子句来支持正则表达式检索,并且通过REGEXP(regular expression)来连接检索条件:
#基础用法
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
#正则通配符
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
LIKE和REGEXP之间一个重要差别:
LIKE匹配整个列
- 如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)
REGEXP在列值内进行匹配
- 如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。
虽然REGEXP不能匹配整个列值,但是如果借助定位符(^和$)可以起到和LIKE相同的作用
9.3 OR的正则表达式运用
「|」符号的用法
在正则表达式中可以使用「|」符号来表示「或」(OR),即可起到类似于select中OR关键字的用法:
SELECT prod_name
FROm products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
- 每增加一个「|」符号,就多增加一个检索条件
[]符号的用法
[]内可以用来定义一组字符,它表示是返回当中任何一种情况的字符:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123]Ton'
#等价于 REGEXP '[1|2|3] Ton'
#等价于 REGEXP '[1-3] Ton'
ORDER BY prod_name;
- 除了数字之外,[]内还可以定义字母字符,例如
[a-z]
9.4 特殊字符匹配
除了匹配一般的字母、数字之外,有时可能还需要匹配某些带有特殊符号的文本,例如「.」等;但是这些字符在正则表达式中可能会有着其他用法,因此对待这些字符时需要格外小心:
SELECT vend_name
FROm vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
- 其中「\」斜杠表示转义符,但是使用两个转义符的原因是MySQL要求解释一个,正则表达式库解释另外一个,这可能与其他软件有所区别
9.5 匹配多个实例
重复元字符
有时需要对匹配的数目进行更强的控制。例如,需要寻找所有的数,不管数中包含多少数字;或者你可能想寻找一个单词并且还能够适应一个尾 随的s(如果存在),等等;这是就需要用到重复元字符来进行操作:
- 「*」:表示0个或多个匹配
- 「+」:表示1个或多个匹配(等于{1,})
- 「?」:表示0个或1个匹配(等于{0,1})
- 「{n}」:表示指定数目匹配
- 「{n,}」:表示大于或等于n
- 「{n, m}」:表示$n<=i<=m$
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
- 「\(」和「\)」分别匹配「(」和「)」
- 「?」匹配stick和sticks(?表示匹配它前面的字符出现0次或1次)
9.6 定位符
如果想匹配特定位置的文本,就需要用到定位符来进行定位:
- 「^」表示文本开头
- 「$」表示文本结尾
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
「^」有两种用法:一种是来指定字符串的开始,另一种就是在集合中用[和]定义,用来否定该集合,即匹配除了该集合外的条件,^[abc]
网友评论