MySQL中使用正则表达式搜索数据

一、正则表达式简介

    正则表达式是提供了特殊搜索模式的字符串,用于匹配文本,在这一点上面功能和通配符搜索字符串的功能一致。两者之间的区别在于,正则表达式在列值中匹配,即匹配文本的位置不限于从文本首端开始,可以匹配任意位置,相当于是寻找“子串”。但是通配符搜索模式进行匹配时,匹配整列,即从文本的开始处开始匹配,知道列值结束。

    在计算机技术中,正则表达式使用广泛,程序设计语言、文本编辑器、操作系统等都支持正则表达式,是一个很强大的文本处理工具。

    MySQL中的正则表达式:MySQL在WHERE子句中对正则表达式提供了初步的支持,但是MySQL中仅支持多数正则表达式实现的一个很小的子集,下面学习MySQL支持的大多数内容,关键在于怎样使用这些正则表达式解决实际中的问题。


二、MySQL中正则表达式的使用

    假如存在两张表products和vendors。

使用正则表达式检索数据
MySQL语句 解释说明
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
REGEXP关键字:用于WHERE子句中,表示后面是一个正则表达式。这里的‘1000’是纯文本匹配,正则表达式允许纯文本匹配,在列值中匹配。
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDERBY prod_name; .字符:正则表达式中一个特殊字符,匹配任意一个字符,和通配符中的_一样。
SELECT prod_name FROM products WHERE prod_name REGEXP BINARY 'JetPack .000'; BINARY关键字:使用BINARY关键字区分正则表达式匹配中的大小写。MySQL自3.23.4之后,MySQL中正则表达式匹配不再区分大小写。
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' |操作符:|为正则表达式中的OR操作符,匹配给定模式之一。
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;

[123]字符集:表示匹配字符1/2/3中的任意一个。实际上[1|2|3]的简写,为了实现意图,使用一个[]号将这三个字符括起来,而不是使用小括号,这里使用中括号。注意正则表达式中的空格,也是匹配的一个字符,不要忽略这一点。

字符集合被否定^:表示匹配除指定字符外的任何东西,例如[^123]。

SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name; 使用-在[]中定义一个范围。范围还可以是[a-z]等。
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;

转义(escaping):为了匹配字符,MMySQL必须使用\\作为前导。正则表达式内有特殊意义的所有字符都必须以这种方式转义。

元字符:有特殊含义的字符,使用\\来引用。为了匹配\本身,需要使用\\\。

说明:多数正则表达式中使用单个反斜杠来转义特殊字符,以便能够使用这些字符本身 ,但是MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。

SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)'

转义字符:\\转义(和),可见两边的括号都应该被转义。

?:在正则表达式中可以使用纯文本匹配。这里的意思是:0个或1个s字符。

SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;

[:digit:]:数字的集合(字符类),表示任意数字。

{4}:要求它前面的字符出现4次。

注意:同一个匹配,可以对应不同的正则表达式。

SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;

^:定位符表示从文本开头匹配,即要求串的开头是一个数字或者一个.。

技巧:通过用^开始每个表达式,用$结束每个表达式,可以是REGEXP实现与LIKE一样的功能。


什么是正则表达式中空白元字符?

    空白元字符就是下面的这些具有一定特殊含义的字符。空白元字符就是看不见的,但是确实存在的文本格式控制字符,用于文本格式控制。

正则表达式中的空白元字符
元字符
解释说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表


什么是正则表达式字符类?

    所谓正则表达式字符类,就是把经常可能会用到的数字、字母或者数字和字母预定义在一个字符集中,使用时就能够直接使用,方便。就相当于C语言中int代表整型数据类型一样,作为一个整型数据的集合。

正则表达式字符类
字符类 解释说明
[:alnum:] 任意字母和数字,相当于[a-zA-Z0-9]。看起来使用[:alnum:]方便多了。如果有多个范围,范围之间不需要隔离开。
[:alpha:] 任意字母字符,同[a-zA-Z]
[:blank:] 空格和制表,同[\\t]。
[:cntrl:] ASC2控制字符(ASC2 0到31和127)
[:digit:] 任意数字
[:print:] 任意可打印字符
[:graph:] 与[:print:]相同,但是不包含空格
[:lower:] 任意小写字母,同[a-z]
[:punct:] 既不在[:alnum:]中又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符,同[\\f\\n\\r\\t\\v]
[:upper:] 任意大写字母
[:xdigit:] 任意16进制数字,同[a-fA-F0-9]


什么是正则表达式的重复元字符?

    使用重复元字符控制正则表达式匹配的字符的数目,如果没有重复元字符,则匹配单词出现。比如[123]则单次匹配1或者2或者3,即只匹配出现一次的。

    使用重复元字符,可以匹配数字,不管数中包含有多少个数字;可以匹配一个单词,并且适应一个尾随的s(如果存在)等等。下面来看正则表达式中有哪些重复元字符。

正则表达式重复元字符
重复元字符 解释说明
*
0个或者多个匹配
+ 1个或者多个匹配,等于{1,}
? 0个或1个匹配,等于{0, 1}
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围,m不超过255


什么是正则表达式中的定位元字符?

    不使用定位元字符,正则表达式会匹配一个串中任意位置的文本。使用定位元字符可以控制匹配的位置。正则表达式中的定位符如下。

正则表达式中定位元字符
定位元字符 解释说明
^
文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾



猜你喜欢

转载自blog.csdn.net/d13419467942/article/details/81059549