mysql仅仅支持正则表达式的一个很小的子集
1. 基本字符匹配
检索prob_name包含文本四位数字且数字末尾是’000’的所有行
SELECT prob_name
FROM products
WHERE prob_name REGEXP '.000'
ORDER BY prob_name;
这个例子可以用LIKE来完成,方法如下所示:
SELECT prod_name
FROM products
WHERE prod_name LIKE '%000%'
ORDER BY prod_name;
LIKE和REGEXP的区别
SELECT prob_name FROM products WHERE prob_name LIKE '1000' ORDER BY prob_name;
SELECT prob_name FROM products WHERE prob_name REGEXP '1000' ORDER BY prob_name;
执行两条语句,第一条不返回数据,第二条返回一条
LIKE要匹配的是整个行,第一个语句只能匹配到列中内容只有’1000’的数据行,而REGEXP只要列中有内容就可以匹配到区分大小写
mysql中正则表达式匹配不区分大小写,为区分大小写,可以使用BINARY关键字,如WHERE prob_name REGEXP BINARY ‘JetPack .000’
2. 进行OR匹配
SELECT prob_name
FROM products
WHERE prob_name REGEXP '1000|2000'
ORDER BY prod_name;
3. 匹配几个字符之一
使用’[]’来匹配特定字符,选取方括号内的任意一个字符参与匹配。
SELECT prob_name
FROM products
WHERE prob_name REGEXP '[123] Ton'
ORDER BY prob_name;
匹配1或2或3 Ton,Ton没有指定大小写,大小写都可以匹配到
除此之外还可以匹配出指定字符之外的任何东西。使用[^123]匹配除这些字符外的任何东西。
3. 匹配范围
[0-9] 匹配任意一个数字
[a-z] 匹配任意一个字母
4. 匹配特殊字符
匹配特殊字符,必须用\\
作为前缀。为了匹配\
需要使用\\\``
\`也可以用来引用元字符
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
5. 匹配字符类
类 | 说明 |
---|---|
[:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符(同[a-zA-Z]) |
[:blank:] | 空格和制表(同[\\t] ) |
[:cntrl:] | ASCII控制字符(ASCII 0到31和127) |
[:digit:] | 任意数字同[0-9]) |
[:graph:] | 与[:print:] 相同,但不包括空格 |
[:lower:] | 任意小写字母 |
[:print:] | 任意可以打印的字符 |
[:punct:] | 既不在[:alnum:] 又不在[:contrl:] 中的任意字符 |
[:space:] | 包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v] ) |
[:upper:] | 任意大写字母 |
[:xdigit:] | 任意十六进制数字 |
6. 匹配多个实例
使用重复元字符可以对匹配的数目进行更强的控制
元字符 | 说明 |
---|---|
* | 0个或多个 |
+ | 1个或多个 |
? | 0个或1个 |
{n} | 指定数目 |
{n,} | 不少于指定数目 |
{n, m} | 匹配数目的范围(m不超过255) |
7. 定位符
匹配特定位置的文本需要使用定位符
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
^的双重用途
- 在集合中(用[]定义),用^来否定该集合
- 匹配字符串的开始处
使用REGEXP起类似LIKE的作用
LIKE和REGEXP的不同在于,LIKE匹配整个字符串,而REGEXP匹配子串,利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使得REGEXP的作用与LIKE一样。