《Oracle正则表达式语法与应用.ppt》由会员分享,可在线阅读,更多相关《Oracle正则表达式语法与应用.ppt(26页珍藏版)》请在三一办公上搜索。
1、正则表达式(二),报告人:刘冲,正则表达式概述,在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。,正则表达式语法,1.学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验。例一:首先做一个对比-查询value中以1开头60结束的记录并且长度是7位SELECT*FROM fzq WHERE VALUE LIKE 1_60;SELECT*FROM fzq WHERE regexp_like(VALUE,1.60);,正则表达式语法,-查询value中以1开头60结束的记录
2、并且长度是7位并且全部是数字的记录。-使用like就不是很好实现了。SELECT*FROM fzq WHERE regexp_like(VALUE,10-9460);,正则表达式语法,表1:定位元字符,正则表达式语法,举例:-查询以数字开头的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:digit:);-查询包含数字的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:digit:);-查询以数字结尾的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:digit:$);,正则表达式语法
3、,表2:量词或重复操作符,正则表达式语法,举例:-匹配一个任意的字符SELECT*FROM fzq WHERE regexp_like(VALUE,.$);-匹配所有的字符SELECT*FROM fzq WHERE regexp_like(VALUE,*$);-匹配所有字符串都是0的记录SELECT*FROM fzq WHERE regexp_like(VALUE,0+$);-匹配0次或者1次0的记录SELECT*FROM fzq WHERE regexp_like(VALUE,0?$);,正则表达式语法,实例:-匹配3个0的记录SELECT*FROM fzq WHERE regexp_lik
4、e(VALUE,03$);-匹配含有3个0的记录SELECT*FROM fzq WHERE regexp_like(VALUE,03);-匹配至少含有3个0的记录SELECT*FROM fzq WHERE regexp_like(VALUE,03,);-匹配至少含有3到5个0的记录SELECT*FROM fzq WHERE regexp_like(VALUE,03,5);,正则表达式语法,表3:预定义的 POSIX 字符类,正则表达式语法,实例:-匹配包含字母字符的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:alpha:);-匹配包含小写字母的记录SE
5、LECT*FROM fzq WHERE regexp_like(VALUE,:lower:);-匹配包含大写字母的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:upper:);-匹配包含数字的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:digit:);-匹配包含字母数字字符的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:alnum:);-匹配包含空白字符(禁止打印)的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:space:);-匹配
6、包含标点字符的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:punct:);-匹配包含控制字符的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:cntrl:);-匹配包含可打印字符的记录SELECT*FROM fzq WHERE regexp_like(VALUE,:print:);,正则表达式语法,表4:表达式的替换匹配和分组,正则表达式应用,示例:-匹配包含0或者1的记录SELECT*FROM fzq WHERE regexp_like(VALUE,0|1);-匹配包含01的记录SELECT*FROM fzq W
7、HERE regexp_like(VALUE,(01);-匹配包含0或者1的记录SELECT*FROM fzq WHERE regexp_like(VALUE,01);,正则表达式应用,正则表达式示例讲解:首先看这一个例子:WITH a AS(SELECT 027-83891886 a FROM dual UNION ALL SELECT FROM dual UNION ALL SELECT(045)12345678 FROM dual UNION ALL SELECT 021-88888888-356 FROM dual)SELECT a FROM a WHERE regexp_like(a
8、,(?0d2)-?d8$),正则表达式应用,正则表达式分析:这个表达式可以匹配几种格式的电话号码,像,或,或等。我们对它进行一些分析吧:首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(d2),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(d8)。,正则表达式应用(分支条件),不幸的是,刚才那个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。要解决这个问题,我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。,正则表
9、达式应用(分支条件),WITH a AS(SELECT 027-83891886 a FROM dual UNION ALL SELECT FROM dual UNION ALL SELECT(045)12345678 FROM dual UNION ALL SELECT 0212-8888888 FROM dual)SELECT a FROM a WHERE regexp_like(a,0d2-d8$|0d3-d7$),正则表达式应用(分组),首先举一个例子匹配IP地址的:(d1,3.)3d1,3 是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:d1,3匹配1到3位的数
10、字,(d1,3.)3匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(d1,3)。,正则表达式应用(分组),不幸的是,它也将匹配这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:(20-4d|250-5|01?dd?).)3(20-4d|250-5|01?dd?)。,正则表达式应用(分组),示例:匹配IP地址WITH a AS(SELECT 255.255.255.255 a FROM dual UNION ALL SE
11、LECT 235.210.85.52 FROM dual UNION ALL SELECT 256.256.213.2 FROM dual UNION ALL SELECT 0.0.0.0 FROM dual)SELECT a FROM a WHERE regexp_like(a,(20-4d|250-5|01?dd?).)3(20-4d|250-5|01?dd?)$);,正则表达式应用(零宽断言),零宽断言:,正则表达式应用(贪婪与懒惰),当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以
12、a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。,正则表达式应用(贪婪与懒惰),有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。,正则表达式应用(贪婪与懒惰),懒惰限定符:,正则表达式应用(贪婪与懒惰),贪婪与懒惰匹配示例1:-贪婪匹配SEL
13、ECT regexp_substr(aababaab,a.*b,1,1)FROM dual;-懒惰匹配SELECT regexp_substr(aababaab,a.*?b,1,1)FROM dual;,正则表达式应用(贪婪与懒惰),贪婪与懒惰匹配示例2:-贪婪和懒惰WITH a AS(SELECT aabaaba a FROM dual UNION ALL SELECT abababab FROM dual UNION ALL SELECT baabaaab FROM dual UNION ALL SELECT aaaaaabbbb FROM dual)SELECT a,regexp_substr(a,a.*b,1,1),regexp_substr(a,a.*?b,1,1)FROM a;,