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 "\\.";

这里写图片描述

需要用到特殊字符的自身意义时,就在前面加”\”,比如搜索“\”就用“\\”

重复匹配

元字符 说明 * 0或多个匹配 + 1个或多个(等于{1,}) ? 0或1个(等于{0,1}) {n} 重复n次 {n,} 至少重复n次 {n,m} 重复n~m次(m不超过255)

现在我们用上面的元字符来搜索出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”里不包含数字。

这里写图片描述

0 0
原创粉丝点击