SQL语句学习7——正则表达式
1.1正则表达式介绍
(1)正则表达式是用来匹配文本的特殊字符串(字符集合),所有种类的程序设计语言,文本编辑器,操作系统等都支持正则表达式
(2)正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较
(3)正则表达式不区分大小写(即大小写都将会被匹配),如果想要区分大小写,可以加关键字BINARY
让我们来看一个例子:
上图语句表示:REGEXP后所跟的东西作为正则表达式,它表示将匹配prod_name列中出现1000的行
1.2进行OR匹配
如下图:
上图表示匹配prod_name列中含有1000或者2000的行
符号’|'为正则表达式的OR操作符,它表示匹配其中之一
1.3匹配几个字符之一
如果你想匹配单个字符,可以通过符号’[]'指定,如下图:
上图表示,将匹配prod_name中出现1或者2或者3的行
需要注意的是:符号’[]'中的只能匹配单个字符,而不能匹配多个字符,如下图:
我们本来的意思是匹配prod_name中出现1000或者2000的行,但是返回的结果却不是我们期望的,因为正则表达式只会匹配[]中的单个字符,所以这个语句的意思是匹配prod_name列中出现1或者0或者2的行,而不是匹配出现1000或者2000的行
即使在1000和2000中间增加了“|”操作符也不行,只能匹配单个,不能多也不能少。
1.4匹配范围
如下图:
上图表示匹配1到5中的数字,因此我们可以看到,.5 ton anvil也被匹配,因为5 ton符合匹配条件
1.5匹配特殊字符
正则表达式语言由具有特定含义的特殊字符组成。,看如下例子:
我们本意是要搜索出含有字符’.‘的行,但是却匹配了所有的行,原因是在正则表达式中,符号’.'表示匹配所有的行,因此它将所有的行全部输出
为了匹配特殊字符,必须用\作为前导
如下:
上图就能正确的匹配出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表:
1.7匹配多个实例
重复元字符:
元字符 | 说明 |
---|---|
* | 0个或者多个字符 |
+ | 1个或者多个匹配 |
? | 0个或1个匹配 |
{n} | 指定数目匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围 |
重复元字符是匹配指定前面的字符
下面看一个例子:
上图表示:匹配prod_name中含有字串([:digit;] sticks?)的行,我们来解读一下这个子串:
首先在括号里面有一个数字(对应[:digit:]),然后重复元字符‘?’匹配它前面字符的0次或者1次,所以就使得s可选。
在上图中,重复元字符’+'匹配它前面的任何字符的一个或者多个
我们在AN后面加了一个重复元字符,表示匹配出现字符N零次或者一次,那么换句话来说就是匹配出现’A’或者‘AN’的行
我们再看一个例子:
我们在ANV后面加了一个重复元字符?,表示匹配V零次或者一次,换句话来说,就是匹配出现了‘AN’或者’ANV’的行
再看个例子:
我们在00后面增加了一个重复元字符+,表示匹配1个或者多个0,换句话来说,就是匹配出现00,000,000……的行