MySql使用正则表达式
注意:mysql 仅支持多数正则表达式实现的一个很小的子集。
基本字符匹配
mysql> select prod_name from products where prod_name REGEXP '1000' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.01 sec)
除了LIKE被REGEXP代替之外,这条语句看上去非常像使用LIKE的语句。它告诉MySql:REGEXP
后边的是正则表达式。
mysql> select prod_name from products where prod_name REGEXP '.000' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
这里使用了正则表达式:.000。 . 是正则表达式语言中的一个特殊字符。他表示匹配任意一个。
注意以下两条sql
mysql> select prod_name from products where prod_name like '1000' ORDER BY prod_name;
Empty set (0.03 sec)
mysql> select prod_name from products where prod_name REGEXP '1000' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.01 sec)
不同点为:
LIKE匹配整个列,如果配匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)
而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现过,REGEXP将会找到它。
注意:匹配不区分大小写, MySql中的正则表达式匹配不区分大小写。为区分大小写,可使用BINARY关键字,
如WHERE prod_name REGEXP BINARY‘JEtPack .000’。
进行OR匹配
mysql> select prod_name from products where prod_name REGEXP '1000|2000' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
注意:两个以上的OR条件, 例如,'1000|2000|3000’将匹配1000或2000或3000
匹配几个字符之一
mysql> select prod_name from products where prod_name REGEXP '[123] Ton' ORDER BY prod_name;
+-------------+
| prod_name |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+
2 rows in set (0.00 sec)
在这里,使用了正则表达式[123] Ton。[123]定义一组字符,它的意思是匹配1或2或3.
注意:[123]匹配1,2或3,但是[^123]却匹配除这些字符之外的任何东西。
匹配范围
[0123456789] 效果等于 [0-9]
[a-z] 匹配任意字母字符
mysql> select prod_name from products where prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
+--------------+
3 rows in set (0.00 sec)
这里使用正则[1-5] Ton。[1-5]定义了一个一个范围,匹配1到5,由于5 Ton匹配,因此返回 .5 ton。
匹配特殊字符
如果我们想要匹配.、[]、|、-等,需要匹配特殊字符。
为了匹配特殊字符,必须使用 \ 为前导。 \- 表示查找 -,\. 表示查找 . 。
mysql> select vend_name from vendors where vend_name REGEXP '\\.' ORDER BY vend_name;
+--------------+
| vend_name |
+--------------+
| Furball Inc. |
+--------------+
1 row in set (0.12 sec)
\ 也用来引用元字符
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
匹配字符类
类 | 说明 |
---|---|
[:alnum:] | 任意字母和数字(同[a-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:] | 包括空格在内的任意空白字符 |
[:upper:] | 任意大写字母 |
[:xdigit:] | 任意十六进制(同[a-fA-F0-9]) |
匹配多个实例
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配等于{1,} |
? | 0个或1个匹配{0,1} |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围 m不超过255 |
匹配连在一起的四位数字:[[:digit:]]{4}
定位符
元字符 | 说明 |
---|---|
^ | 文本开始 |
$ | 文本结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
如果想找出一个数(包括以小数点开始的数)===>> 1
^ 匹配串的开始,
注意:^ 的作用
- 在集合中(用[和]定义),用它来否定集合
- 指串的开始
使REGEXP起类似LIKE的作用:利用定位符,通过使用^ 开始每个表达式,用$结束每个表达式。
0-9\. ↩︎