MySQL用正则表达式进行搜索

正则表达式是用来匹配文本的特殊的串(字符集合)。如果你想从一个文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式。如果你想替换一个页面中的所有URL为这些URL的实际HTML链接, 也可以使用一个正则表达式(对于最后这个例子,或者是两个正则表达式)。所有种类的程序设计语言、文本编辑器、操作系统等都支持正则表达式。有见识的程序员和网络管理员已经关注作为他们技术工具重要内容的正则表达式很长时间了。正则表达式用正则表达式语言来建立,正则表达式语言是用来完成刚讨论的所有工作以及更多工作的一种特殊语言。与任意语言一样,正则表达式具有你必须学习的特殊的语法和指令。

正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较

(1)检索列 name 包含文本 1000 的所有行
select name fron products where name regexp ‘1000’ order by name;
这条语句告诉MySQL:regexp 后所跟的东西作为正则表达式(与文字文本1000匹配的一个正则表达式)处理。

…where name regexp ‘.000’;
使用了正则表达式 .000 ,是正则表达式语言中一个特殊的字符。他表示匹配任意一个字符,因此,1000和2000 都匹配

like 与 regexp 的一个重要差别
..... like '1000';        //不返回数据
.....regexp '1000';    //返回一行

为什么?
因为,like匹配整个列。如果被匹配的文本在列值中出现,like 将不对找到它,相应的行也不被返回(除非使用通配符)。而regexp 在列值内进行匹配。如果被匹配的文本在列值中出现,regexp 将会找到它,相应的行将被返回。
正则表达式不区分大小写,为区分大小写,可使用 binary 关键字。如:
where name regexp binary ‘JetPack .000’
(2)进行OR匹配
为搜索两个串之一(或者为这个串,或者为那个串),使用 | ,如下
….where name regexp ‘1000 | 2000’ order by name;
表示匹配其中之一,还可以匹配两个以上 OR 条件
1000 | 2000 | 3000
(3)匹配几个字符之一
匹配特定字符 用 [ 和 ] 括起来的字符完成
…where name regexp ‘[123] Ton’
使用了正则表达式 [123] Ton 。[123]定义一组字符串,它的意思是匹配1或2或3,因此,1 ton 和 2 ton都匹配且返回(没有 3 ton)
[ ] 是 OR 的另一种形式, 正则表达式 [123] ton 为 [1 | 2 | 3] ton 的缩写,也可以使用后者
where name regexp ‘1 | 2 | 3 Ton ’
返回:
1 ton
2 ton
JectJAck
JectAKC
这并不是期望的输出,两个要求的行被检索出来,但还检索出了另外2行,之所以这样是由于MySQL嘉定 你的意思是 ‘1’ 或 ‘2’ 或 ‘3 ton’。除非把 | 括在一个集合里,负责他将作用于整个串
字符集合也可以被否定,即,他将匹配除指定字符串外的任何东西。为否定一个字符集,在集合的开始处放置一个 ^ 即可,因此,尽管[123] 匹配字符 1、2、3,但[^123]却匹配除这些字符外的任何东西。
(4)匹配范围
匹配 0-9 用 [0-9] 和 [0123456789] 一样 还可以 [a-z]
…where name regexp ‘[1-5] ton’
返回 :
.5 ton
1 ton
2 ton
(5)匹配特殊字符
为了匹配特殊字符,必须用 \ 为前导。 \- 表示查找 -, \. 表示查找. 。
where name regexp ‘\.’
输出: Furball Inc.
\. 匹配 . ,所以只检索出一行。这种处理就是所谓的转义,正则表达式内具有特殊意义的所有字符都必须以这种方式转义。这包括 . 、| 、[] 以及迄今为止使用过的其他特殊字符。
\ 也用来引用元字符(具有特殊含义的字符),

元字符 说明
\f 换页
\n 换行
\r 回车
\t 制表
\v 纵向制表
匹配 \ : 为了匹配反斜杠(\)字符本身,需要使用 \\。
\ 或 \ ? : 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。
(5)匹配字符类
存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配。为更方便的工作,可以使用预定义的字符集,称为字符类。下面列出字符类以及他们的含义。
这里写图片描述
(6)匹配多个实例
where name regexp ‘\([0-9] sticks?\)’
输出:
TNT (1 stick)
TNT (2 sticks)
解释:\(匹配),[0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick和sticks(s后的?是s可选,因为?匹配它前面的任何字符的0次或1次出现),\)匹配),没有?,匹配stick和sticks会飞常困难

where name regexp ‘[[:digit:]]{14}’
输出:
JetPack 1000
JetPack 2000
[:digit:] 匹配任意数字,因而它为数字的一个集合。{4}确切的要求他前面的字符(任意数字)出现4次,所以,[[:digit:]]{14} 匹配连载一个的任意 4位数字

注意:使用正则表达式时,编写某个特殊的表达式几乎总是有不止一种方法,上面的例子也可以这样编写
where name regexp ‘[0-9][0-9]’[0-9][0-9]
(6)定位符
为了匹配特定位置的文本,需要使用如下的定位符
这里写图片描述
如果想找出以一个数(包括以小数点开始的数)开始的所有数据,用^定位符
where name regexp ‘^[0-9\.]’
输出:
.5 ton
1 ton
2 ton
^ 匹配字符串的开始。因此,^[0-9\.]只在.或任意数字为串中第一个字符时才匹配它们。没有 ^ ,则还要多检索出4个别的行(那些中间有数字的行)。
Tips:
①^ 的双重用途:^ 有两种用法,在集合中(用 [ 和 ] 定义),用它来否定双重集合,否则,用来指定串的开始处。
②使用regexp 起类似 like 的作用:like 和 regexp 的不同在于,like 匹配整个串而regexp匹配子串。利用定位符,通过用 ^ 开始每个表达式,用$ 结束每个表达式,可以使regexp 的作用与like 一样。

注:简单的正则表达式测试
可以在不使用数据库表的情况下用 select 来测试正则表达式。regexp检查总是返回0(没有匹配)或1(匹配)。可以用带文字串的regexp来测试表达式,并实验他们。相应语法如下:
select ‘hello’ regexp ‘[0-9]’;
这个例子显然是返回 0 (因为文本hello中没有数字)。

猜你喜欢

转载自blog.csdn.net/m0_37899949/article/details/78915232