注:一个数据库小白的成长之路
正则表达式:用来匹配文本的特殊的串(字符集合)
1.基本字符匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
检索列prod_name中包含文本1000的所有行
2.进行OR匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
检索列prod_name中包含文本1000或2000的所有行。注意,这里可以使用多次|,例如'1000|2000|3000'表示匹配文本1000或2000或3000。
3.匹配几个字符之一
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
[123]表示匹配1或2或3
4.匹配范围
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;
即将[12345]简化为[1-5]
5.匹配特殊字符
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
为匹配特殊字符,例如.、|、[]等,必须使用\\作为前导。此外,\\也用来引用元字符。
| 元字符 | 说明 |
|---|---|
| \\f | 换页 |
| \\n | 换行 |
| \\r | 回车 |
| \\t | 制表 |
| \\v | 纵向制表 |
6.匹配字符类
| 类 | 说明 |
|---|---|
| [:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
| [:digit:] | 任意数字(同[0-9]) |
| [:alpha:] | 任意字符(同[a-zA-Z]) |
| [:lower:] | 任意小写字母(同[a-z]) |
| [:upper:] | 任意大写字母(同[A-Z]) |
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;
这里sticks?匹配stick和sticks(s后的?使得s可选,因为?匹配它前面的任何字符的0次或1次出现)
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
[[:digit:]]{4}表示匹配连在一起的任意4位数字
8.定位符
| 元字符 | 说明 |
|---|---|
| ^ | 文本的开始 |
| $ | 文本的结尾 |
| [[:<::]] | 词的开始 |
| [[:>::]] | 词的结尾 |
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。
注意
- .是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符。
- 为区分大小写,可以使用BINARY关键字,例如
WHERE prod_name REGEXP BINARY 'JetPack .000。 - [^123]表示匹配除字符1或2或3的任意其他东西,而^[123]匹配首位是1或2或3的字符串。
- LIKE与REGEXP的不同之处在于LIKE匹配整个串而REGEXP匹配子串。但是利用定位符,用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE相同。
- SELECT语句可以用来测试正则表达式,REGEXP检查总是返回0(没有匹配)或1(匹配),例如
SELECT 'hello' REGEXP '[0-9]';