SQL语句学习7——正则表达式

1.1正则表达式介绍

(1)正则表达式是用来匹配文本的特殊字符串(字符集合)所有种类的程序设计语言,文本编辑器,操作系统等都支持正则表达式
(2)正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较
(3)正则表达式不区分大小写(即大小写都将会被匹配),如果想要区分大小写,可以加关键字BINARY
让我们来看一个例子:
SQL语句学习7——正则表达式
上图语句表示:REGEXP后所跟的东西作为正则表达式,它表示将匹配prod_name列中出现1000的行

1.2进行OR匹配

如下图:
SQL语句学习7——正则表达式
上图表示匹配prod_name列中含有1000或者2000的行

符号’|'为正则表达式的OR操作符,它表示匹配其中之一

1.3匹配几个字符之一

如果你想匹配单个字符,可以通过符号’[]'指定,如下图:
SQL语句学习7——正则表达式
上图表示,将匹配prod_name中出现1或者2或者3的行

需要注意的是:符号’[]'中的只能匹配单个字符,而不能匹配多个字符,如下图:
SQL语句学习7——正则表达式
我们本来的意思是匹配prod_name中出现1000或者2000的行,但是返回的结果却不是我们期望的,因为正则表达式只会匹配[]中的单个字符,所以这个语句的意思是匹配prod_name列中出现1或者0或者2的行,而不是匹配出现1000或者2000的行
SQL语句学习7——正则表达式
即使在1000和2000中间增加了“|”操作符也不行,只能匹配单个,不能多也不能少。

1.4匹配范围

如下图:
SQL语句学习7——正则表达式
上图表示匹配1到5中的数字,因此我们可以看到,.5 ton anvil也被匹配,因为5 ton符合匹配条件

1.5匹配特殊字符

正则表达式语言由具有特定含义的特殊字符组成。,看如下例子:
SQL语句学习7——正则表达式
我们本意是要搜索出含有字符’.‘的行,但是却匹配了所有的行,原因是在正则表达式中,符号’.'表示匹配所有的行,因此它将所有的行全部输出

为了匹配特殊字符,必须用\作为前导
如下:
SQL语句学习7——正则表达式
上图就能正确的匹配出vend_name中含有符号’.'的行

补充:正则表达式内具有特殊意义的所有字符都必须以这种方式转义

1.6匹配字符类

为了使用方便,可以使用预定义的字符集:

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\t])
[:cntrl:] ASCII控制字符(ASCII0到31和127)
[:digit:] 任意数字(同[0-9])
[:graph:] 任意打印字符,但不包括空格
[:lower:] 任意小写字母([a-z])
[:upper:] 任意大写字母(同[A-Z])
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符(同[\t\n\r\t\v])
[:xdigit:] 任意十六进制数字

下面给出ASCII表:
SQL语句学习7——正则表达式

1.7匹配多个实例

重复元字符:

元字符 说明
* 0个或者多个字符
+ 1个或者多个匹配
0个或1个匹配
{n} 指定数目匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围

重复元字符是匹配指定前面的字符
下面看一个例子:
SQL语句学习7——正则表达式
上图表示:匹配prod_name中含有字串([:digit;] sticks?)的行,我们来解读一下这个子串:
首先在括号里面有一个数字(对应[:digit:]),然后重复元字符‘?’匹配它前面字符的0次或者1次,所以就使得s可选。
SQL语句学习7——正则表达式
在上图中,重复元字符’+'匹配它前面的任何字符的一个或者多个
SQL语句学习7——正则表达式
我们在AN后面加了一个重复元字符,表示匹配出现字符N零次或者一次那么换句话来说就是匹配出现’A’或者‘AN’的行

我们再看一个例子:
SQL语句学习7——正则表达式
我们在ANV后面加了一个重复元字符?,表示匹配V零次或者一次,换句话来说,就是匹配出现了‘AN’或者’ANV’的行

再看个例子:
SQL语句学习7——正则表达式
我们在00后面增加了一个重复元字符+,表示匹配1个或者多个0,换句话来说,就是匹配出现00,000,000……的行