mysql中用正则表达式进行搜索教程(一)
有关正则表达式介绍
前两章中的过滤例子允许用匹配、比较和通配操作符寻找数据。对于基本的过滤(或者甚至是某些不那么基本的过滤),这样就足够了。但随着过滤条件的复杂性的增加,where子句本身的复杂性也有不要增加。
这也就是正则表达式变得有用的地方。正则表达式是用来匹配文本的特殊的串(字符集合)。如果你想从一个文本文件中提取出电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。如果你想在一个文板块中找到所有重复的单词,可以使用正则表达式。如果你想途欢一个页面中的所有URL为这些URL的实际html连接,也可以使用正则表达式。
所有又累的程序设计语言、文本编辑器、操作系统等都支持正则表达式。有件事的程序员和网络管理员已经关注作为他们技术工具重要内容的正则表达式很长时间了。
正则表达式用正则表达式语言来建立,正则表达式语言是用来完成刚讨论的所有工作及更多工作的一种特殊语言、与任意语言一样,正则表达式具有你必须学习的特殊的语法和指令。
既然正则表达式这么有用,那么正则表达式和MySQL有什么关系呢?已经说过,正则表达式的作用是匹配文本,讲一个模式(正则表达式)与一个文本串进行比较。MySQL用where子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤select检索出的数据。
使用MySQL正则表达式
基本字符匹配
我们从一个非常简单的例子开始。下面的语句检索列prod_name包含文本1000的所有行:
select prod_name from products where prod_name regexp ‘1000’ order by prod_name;
除了关键字like被regexp替代以外,这条语句看上去非常像使用like的语句。它告诉MySQL:regexp后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理。
为什么要费力地使用正则表达式?在刚才的例子中,正则表达式确实没有带来多少好处,不过请考虑下面的例子:
select prod_name from products where prod_name regexp '.000'order by prod_name;
这里使用了正则表达式.000。.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此,1000和2000都匹配且返回
当然,这个特殊的例子也可以用like和通配符来完成。
在like与regexp之间有一个重要的差别。请看下面两条语句:
select prod_name from products where prod_name like '1000' order by prod_name;
select prod_name from products where prod_name regexp '1000' order by prod_name;
如果执行上述两条语句,会发现第一条语句不会返回数据,而第二条语句返回一行,为什么?
like匹配整个列。如果被匹配的文本在列值中出现,like将不会找到它,相应的行也不被返回(除非使用通配符)。而regexp在列值内进行匹配,如果被匹配的文本在列值中出现,regexp将会找到它,相应的行将被返回。这是一个非常重要的差别。
那么,regexp能不能用来匹配整个列值,起到与like相同的作用?答案是坑定的,使用^和$定位符即可。