MySQL-正则表达式进行复杂匹配
2017-02-13 21:40
495 查看
我们先来看下商品名称列
现在如果我们想要匹配商品名含有“1000”的商品,如果用简单匹配,应该是
我们现在用正则表达式
感觉好像体现不出正则表达式的强大啊,好,看这个列子。如果我想同时得到含有1000和2000的商品名称,该怎么写?简单匹配应该这样
使用正则表达式
是不是非常优雅?“.000”中的“.“匹配任意字符
当然,也可以使用正则表达式的”|“(OR)
假设现在有范冰冰,李冰冰,黄冰冰,赵冰冰,王冰冰。我现在只想搜索两个大明星范冰冰和李冰冰,怎么用正则表达式查找?很简单,使用”[]“来匹配多个字符之一。像上面这种要求我们可以写出”[范李]冰冰“,[范李]定义了一组字符,意思是匹配”范“或者”李“。
好,现在我们的产品里有1 ton anvil和2 ton anvil 现在用正则表达式匹配
这边故意把ton写出Ton,不影响搜索结果说明正则表达式不区分大小写
那反过来想,我不想看范冰冰和李冰冰,我只想看其他的冰冰,该怎么找?”[^范李]冰冰“就行了,^有取反的意思。
运用好集合可以轻松匹配一个或多个字符,比如
想匹配1~9数字
[123456789] 或者 [1-9]
想匹配字母a~z
[a-z]
结果是匹配所有的行,因为”.“就是匹配任意字符。那怎么办呢?
使用转义”\“就行了
需要用到特殊字符的自身意义时,就在前面加”\”,比如搜索“\”就用“\\”
现在我们用上面的元字符来搜索出TNT (1 stick)和TNT (5 sticks)
解析:
“\ \ (” 为转义 “(”
[0-9] 是数字0~9
s? 是匹配s或者不匹配s都行,这样就能匹配到stick和sticks
再比如上面的”.000”匹配JetPack 1000和JetPack 2000.我们可以换种方式匹配
注意:使用上面的字符类[:digit:]一律表达为[xxx]格式,即在外面再加一个”[]”。否则匹配不到
比如,搜索以数字(包括小数)开头的产品名,我们分别用LIKE和REGEXP来匹配
用LIKE只能曲线救国,一点也不直接
解析:
^代表文本开头,这样才能匹配以数字(包括小数)开头的文本
[0-9\.] 表示0~9和“.”中任意字符
^在[]外面表开头,在[]里面表取反。比如上面的[^范李]来去掉范,李
含有就返回1,不包含就返回0.
上例返回数字0,因为文本“hello”里不包含数字。
SELECT prod_name FROM products;
现在如果我们想要匹配商品名含有“1000”的商品,如果用简单匹配,应该是
SELECT prod_name FROM products WHERE prod_name LIKE "%1000%";
我们现在用正则表达式
SELECT prod_name FROM products WHERE prod_name REGEXP '1000';
感觉好像体现不出正则表达式的强大啊,好,看这个列子。如果我想同时得到含有1000和2000的商品名称,该怎么写?简单匹配应该这样
SELECT prod_name FROM products WHERE prod_name LIKE "%1000%" OR prod_name LIKE "%2000%";
使用正则表达式
SELECT prod_name FROM products WHERE prod_name REGEXP ".000";
是不是非常优雅?“.000”中的“.“匹配任意字符
当然,也可以使用正则表达式的”|“(OR)
SELECT prod_name FROM products WHERE prod_name REGEXP "1000|2000";
假设现在有范冰冰,李冰冰,黄冰冰,赵冰冰,王冰冰。我现在只想搜索两个大明星范冰冰和李冰冰,怎么用正则表达式查找?很简单,使用”[]“来匹配多个字符之一。像上面这种要求我们可以写出”[范李]冰冰“,[范李]定义了一组字符,意思是匹配”范“或者”李“。
好,现在我们的产品里有1 ton anvil和2 ton anvil 现在用正则表达式匹配
SELECT prod_name FROM products WHERE prod_name REGEXP "[12] Ton";
这边故意把ton写出Ton,不影响搜索结果说明正则表达式不区分大小写
那反过来想,我不想看范冰冰和李冰冰,我只想看其他的冰冰,该怎么找?”[^范李]冰冰“就行了,^有取反的意思。
运用好集合可以轻松匹配一个或多个字符,比如
想匹配1~9数字
[123456789] 或者 [1-9]
想匹配字母a~z
[a-z]
匹配特殊字符
之前我们用”.“来匹配任意字符。我们看到商品名里有.5 ton anvil这种名字,该怎么搜索文本里含有特殊字符”.”的文本呢? 如果直接搜索SELECT prod_name FROM products WHERE prod_name REGEXP ".";
结果是匹配所有的行,因为”.“就是匹配任意字符。那怎么办呢?
使用转义”\“就行了
SELECT prod_name FROM products WHERE prod_name REGEXP "\\.";
需要用到特殊字符的自身意义时,就在前面加”\”,比如搜索“\”就用“\\”
重复匹配
元字符 | 说明 |
---|---|
* | 0或多个匹配 |
+ | 1个或多个(等于{1,}) |
? | 0或1个(等于{0,1}) |
{n} | 重复n次 |
{n,} | 至少重复n次 |
{n,m} | 重复n~m次(m不超过255) |
SELECT prod_name FROM products WHERE prod_name REGEXP "\\([1-9] sticks?\\)";
解析:
“\ \ (” 为转义 “(”
[0-9] 是数字0~9
s? 是匹配s或者不匹配s都行,这样就能匹配到stick和sticks
再比如上面的”.000”匹配JetPack 1000和JetPack 2000.我们可以换种方式匹配
SELECT prod_name FROM products WHERE prod_name REGEXP "[[:digit:]]{4}";
注意:使用上面的字符类[:digit:]一律表达为[xxx]格式,即在外面再加一个”[]”。否则匹配不到
定位符
使用^和$来定义文本的开头和结尾。我们说,LIKE匹配的是整个字串,而REGEXP匹配的是子串。要想REGEXP匹配整个串的话就要用到^ 和$比如,搜索以数字(包括小数)开头的产品名,我们分别用LIKE和REGEXP来匹配
用LIKE只能曲线救国,一点也不直接
SELECT prod_name FROM products WHERE prod_name LIKE "%anvil%";
SELECT prod_name FROM products WHERE prod_name REGEXP "^[0-9\\.]";
解析:
^代表文本开头,这样才能匹配以数字(包括小数)开头的文本
[0-9\.] 表示0~9和“.”中任意字符
^在[]外面表开头,在[]里面表取反。比如上面的[^范李]来去掉范,李
使用SELECT和REGEXP来进行简单测试
比如我想测试一个文本里是否含有数字SELECT "hello" REGEXP "[0-9]";
含有就返回1,不包含就返回0.
上例返回数字0,因为文本“hello”里不包含数字。
相关文章推荐
- mysql中的模式匹配,利用正则表达式
- MYSQL-中文检索匹配与正则表达式
- 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类
- vbs进行正则表达式匹配的方法和需注意的问题
- 正则表达式从右往左进行匹配(Regex)
- VBS——正则表达式——将匹配到的字母进行大小写转换
- 使用正则表达式,进行批量修改字符串中的匹配内容
- MySQL入门-6:通配符匹配和正则表达式
- 【PYTHON】对整个文件进行正则表达式匹配
- 引用 MYSQL-中文检索匹配与正则表达式
- 16.2.1 进行正则表达式匹配
- 正则表达式之二:与正则表达式进行匹配-正则表达式与Perl接轨
- MYSQL-中文检索匹配与正则表达式
- 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类
- 21.2.5 获取与正则表达式进行匹配检测的字符串
- MySQL 字符串模式匹配 扩展正则表达式模式匹配
- 正则表达式之二---稍复杂一点的匹配符
- MySQL中的模式匹配(标准SQL匹配和正则表达式匹配)
- 正则表达式对邮件地址进行校验以及从一个字符串中匹配出一个格式正确的邮件地址
- 用sed命令进行正则表达式匹配字符串,如何检验匹配是否成功?