简介
如果通配符无法满足你的匹配要求,那么就要尝试正则表达式了。所有种类的程序设计语言、文本编辑器、操作系统等都支持正则表达式。MySQL中的正则表达式仅仅为正则表达式语言的子集,下面我们来了解几种常见的正则表达式。
使用MySQL正则表达式
正则表达式搜索依然需要WHERE字句的支持,它允许你制定正则表达式,过滤SELECT检索出的数据。
基本字符匹配
下面语句检索列 prod_name 包含文本 1000 的所有行:
SELECT prod_name
FROM products
WHERE prod_name REGEXP "1000"
ORDER BY prod_name;
##REGEXP是用来代替LIKE的,用法类似且后面跟正则表达式
下面这个例子则是通配符很难完成的
SELECT prod_name
FROM products
WHERE prod_name REGEXP ".000"
ORDER BY prod_name;
正则表达式 .000 表示匹配任意一个字符后面加上000。
LIKE和REGEXP有一个很大的差别,LIKE匹配整个列而REGEXP在列值内进行匹配。
MySQL中的正则表达式只能用 BINARY关键字来区分大小写,比如 WHERE prod_name REGEXP BINARY ‘JetPack .000’ 。
“or”匹配
使用 | 来表示“或”操作。
匹配几个字符之一
使用 [] 来表示“和”操作,例如 [123] 表示匹配1或者2或者3。
匹配范围
使用“0-9”来代替“0123456789”
否定匹配
使用“^”来表示否定
特殊字符匹配
使用“\\”来匹配特殊字符
空白元字符
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
匹配字符类
存在找出你自己经常使用的数字机、所有字母字符或者所有字母数字字符的匹配。MySQL有这些预定义的字符集,称为字符类(character class)
常用的字符串函数有这些:https://www.cnblogs.com/geaozhang/p/6739303.html
匹配多个实例
元字符 | 说明 |
---|---|
* | 匹配0个或者多个 |
+ | 匹配一个或者多个 |
? | 匹配0或者1个 |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
举几个例子
SELECT prod_name
FROM products
WHERE prod_name REGEXP "\\([0-9] STICKS?\\)"
##这里的\\省略也没事,在MySQL5里面括号不需要转译。
ORDER BY prod_name;
输出是:
+----------------+
| prod_name |
+----------------+
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
2 rows in set (0.00 sec)
下面这个例子是匹配连在一起的四个数字
SELECT prod_name
FROM products
WHERE prod_name REGEXP "[[:digit:]]{4}"
ORDER BY prod_name;
输出是:
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
定位符
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词语的开始 |
[[:>:]] | 词语的结尾 |
例如,你想找出一个数(包括一小数点开始的数)开始的所有产品。简单的搜 [0-9\.] 是不行的,因为它将在文本内任意位置查找匹配,此时我们应该使用 ^ 定位符,如下所示
SELECT prod_name
FROM products
WHERE prod_name REGEXP "^[0-9\\.]"
ORDER BY prod_name;
如果不加入定位符,将会找的四个别的行,他们中间有数字
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
+--------------+