MySQL-正则表达式进行复杂匹配
来源:互联网 发布:pdf图书下载软件 编辑:程序博客网 时间:2024/05/22 02:11
我们先来看下商品名称列
SELECT prod_nameFROM products;
现在如果我们想要匹配商品名含有“1000”的商品,如果用简单匹配,应该是
SELECT prod_nameFROM productsWHERE prod_name LIKE "%1000%";
我们现在用正则表达式
SELECT prod_nameFROM productsWHERE prod_name REGEXP '1000';
感觉好像体现不出正则表达式的强大啊,好,看这个列子。如果我想同时得到含有1000和2000的商品名称,该怎么写?简单匹配应该这样
SELECT prod_nameFROM productsWHERE prod_name LIKE "%1000%" OR prod_name LIKE "%2000%";
使用正则表达式
SELECT prod_nameFROM productsWHERE prod_name REGEXP ".000";
是不是非常优雅?“.000”中的“.“匹配任意字符
当然,也可以使用正则表达式的”|“(OR)
SELECT prod_nameFROM productsWHERE prod_name REGEXP "1000|2000";
假设现在有范冰冰,李冰冰,黄冰冰,赵冰冰,王冰冰。我现在只想搜索两个大明星范冰冰和李冰冰,怎么用正则表达式查找?很简单,使用”[]“来匹配多个字符之一。像上面这种要求我们可以写出”[范李]冰冰“,[范李]定义了一组字符,意思是匹配”范“或者”李“。
好,现在我们的产品里有1 ton anvil和2 ton anvil 现在用正则表达式匹配
SELECT prod_nameFROM productsWHERE prod_name REGEXP "[12] Ton";
这边故意把ton写出Ton,不影响搜索结果说明正则表达式不区分大小写
那反过来想,我不想看范冰冰和李冰冰,我只想看其他的冰冰,该怎么找?”[^范李]冰冰“就行了,^有取反的意思。
运用好集合可以轻松匹配一个或多个字符,比如
想匹配1~9数字
[123456789] 或者 [1-9]
想匹配字母a~z
[a-z]
匹配特殊字符
之前我们用”.“来匹配任意字符。我们看到商品名里有.5 ton anvil这种名字,该怎么搜索文本里含有特殊字符”.”的文本呢? 如果直接搜索
SELECT prod_nameFROM productsWHERE prod_name REGEXP ".";
结果是匹配所有的行,因为”.“就是匹配任意字符。那怎么办呢?
使用转义”\“就行了
SELECT prod_nameFROM productsWHERE prod_name REGEXP "\\.";
需要用到特殊字符的自身意义时,就在前面加”\”,比如搜索“\”就用“\\”
重复匹配
现在我们用上面的元字符来搜索出TNT (1 stick)和TNT (5 sticks)
SELECT prod_name FROM productsWHERE prod_name REGEXP "\\([1-9] sticks?\\)";
解析:
- “\ \ (” 为转义 “(”
- [0-9] 是数字0~9
- s? 是匹配s或者不匹配s都行,这样就能匹配到stick和sticks
再比如上面的”.000”匹配JetPack 1000和JetPack 2000.我们可以换种方式匹配
SELECT prod_nameFROM productsWHERE prod_name REGEXP "[[:digit:]]{4}";
注意:使用上面的字符类[:digit:]一律表达为[xxx]格式,即在外面再加一个”[]”。否则匹配不到
定位符
使用^和$来定义文本的开头和结尾。我们说,LIKE匹配的是整个字串,而REGEXP匹配的是子串。要想REGEXP匹配整个串的话就要用到^ 和$
比如,搜索以数字(包括小数)开头的产品名,我们分别用LIKE和REGEXP来匹配
用LIKE只能曲线救国,一点也不直接
SELECT prod_nameFROM productsWHERE prod_name LIKE "%anvil%";
SELECT prod_nameFROM productsWHERE prod_name REGEXP "^[0-9\\.]";
解析:
- ^代表文本开头,这样才能匹配以数字(包括小数)开头的文本
- [0-9\.] 表示0~9和“.”中任意字符
- ^在[]外面表开头,在[]里面表取反。比如上面的[^范李]来去掉范,李
使用SELECT和REGEXP来进行简单测试
比如我想测试一个文本里是否含有数字
SELECT "hello" REGEXP "[0-9]";
含有就返回1,不包含就返回0.
上例返回数字0,因为文本“hello”里不包含数字。
- MySQL-正则表达式进行复杂匹配
- preg_match进行正则表达式匹配
- 使用正则表达式进行匹配
- 用正则表达式进行匹配
- 使用正则表达式进行匹配
- 用正则表达式进行复杂密码校验
- mysql 正则表达式的匹配
- 16.2.1 进行正则表达式匹配
- Java正则表达式进行多组多行匹配
- MFC利用正则表达式进行密码匹配
- php进阶:使用正则表达式进行匹配
- PHP preg_match()进行正则表达式匹配
- MYSQL-中文检索匹配与正则表达式
- MYSQL-中文检索匹配与正则表达式
- mysql中的模式匹配,利用正则表达式
- mysql模式匹配和正则表达式
- 【正则】构造复杂SQL语句的正则表达式3(细粒度正则匹配)
- 复杂正则表达式一
- 506. Relative Ranks
- 面试题29:数组中出现次数超过一半的数字
- Android——Fragment(碎片)的概念设计...
- 面试题30:最小的K个数
- 基础练习 高精度加法
- MySQL-正则表达式进行复杂匹配
- 字典树
- ccf试题 火车购票
- 【专访刘洪峰】我为什么坚守了.NET技术十多年
- C++ 类对象实例创建的4种方法
- 21位 花朵数
- 【bzoj2049】Cave洞穴勘测 LCT
- 面试题31:连续子数组的最大和
- 树莓派和ubuntu PC通过网线连接