/*********************************************** @H_403_8@ *转发,请注明原文 @H_403_8@ *原文来自:blog.csdn.net/clark_xu 徐长亮的专栏 @H_403_8@ ***********************************************/ @H_403_8@ 目录: @H_403_8@ 1.oracle正则表达式函数 @H_403_8@ 2.POSIX 元字符(POSIX标准字符集) @H_403_8@ 3.oracle 正则表达式使用技巧
1.一系列oracle函数(regular expresstion) @H_403_8@ /******************************************** @H_403_8@ regexp_like @H_403_8@ –(1)类似like操作符,用于where语句; @H_403_8@ –(2)不能用于select字句 @H_403_8@ –语法 @H_403_8@ –regexp_like(srcstr,pattern,[,match_option]) @H_403_8@ –match_option: @H_403_8@ –‘c’,区分大小写(默认) @H_403_8@ –‘i’,不区分大小写; @H_403_8@ –‘n’,允许匹配任意字符匹配换行符 @H_403_8@ –‘m’,处理元字符串多行情况
regexp_instr @H_403_8@ –(1)寻找一个正则表达式匹配,并且找到匹配返回一个给定字符串的位置; @H_403_8@ –(2)类似instr函数,返回位置 @H_403_8@ –语法: @H_403_8@ –regexp_inst(srcstr,partern[,posttion,occurrence,return_option,match_option]) @H_403_8@ –position: 搜索开始的位置 @H_403_8@ –occurrence:搜索字符串的出现 @H_403_8@ –return_option:表示发生的开始或者结束位置
regexp_replace @H_403_8@ –(1)搜索一个正则表达式,用替换字符替换它; @H_403_8@ –(2)类似replace函数 @H_403_8@ –语法 @H_403_8@ –regexp_substr(srcstr,replacestr,position,match_option])
regexp_substr @H_403_8@ –返回一个匹配的字串 @H_403_8@ –类似substr @H_403_8@ –语法 @H_403_8@ regexp_substr(srcstr,match_option])
*********************************************/
/*===================================================== @H_403_8@ POSIX 元字符(POSIX标准字符集) @H_403_8@ –元字符是具有特殊含义的特殊字符 @H_403_8@ =======================================================*/
–(1) @H_403_8@ –* 匹配0,或者更多 @H_403_8@ select * from j1_dw.etl_Meta_unit where regexp_like(unit_name,’(*)’);
–(2) @H_403_8@ –| 交替匹配 @H_403_8@ –(0|2)交替匹配0和2 @H_403_8@ select * from j1_dw.etl_Meta_unit where regexp_like(unit_name,’P_DM(0|2)_(YH|ZM)’); @H_403_8@ –result: @H_403_8@ P_DM0_YH_SSJMSPXXQC
–(3) @H_403_8@ –^ 匹配行开始 @H_403_8@ –(^5) 5开头 @H_403_8@ select * from j1_dw.etl_Meta_unit where regexp_like(unit_id,’(^5)’);
–reult: 548.02
–(4) @H_403_8@ –
–(5) @H_403_8@ –[] 匹配列表中任何一个表示的表达式的括号表达式 @H_403_8@ –[(5$),(^5)] 5开头或者5结尾
select * from j1_dw.etl_Meta_unit where regexp_like(unit_id,’[(5
–(6) @H_403_8@ –[^exp] 括号中正则表达式的否定表达
–(7) @H_403_8@ –{m}精确匹配m次 @H_403_8@ –(X){2} 精确匹配2次X @H_403_8@ select * from j1_ldcx.etl_Meta_unit where regexp_like(unit_code,’(X){2}’); @H_403_8@ –result: p_dm0_yhs_djhxzz
–(8) @H_403_8@ –[::] 指定一个字符类,匹配该类中任意字符
–(9) @H_403_8@ –\ @H_403_8@ –四种含义:1,代表自身;2,引用下一个字符;3,引入一个操作符;4,do nothing
–(10) @H_403_8@ –+ @H_403_8@ –匹配一个或者多个事件
–(11) @H_403_8@ –? @H_403_8@ –匹配0个或者一个事件 @H_403_8@ –****oracle 11g不建议使用
–(12) @H_403_8@ –. 匹配任意支持的字符,NULL除外 @H_403_8@ –(X){2}.(Z){2}(Q){2}精确匹配X两次,Z两次,Q两次 @H_403_8@ select * from j1_ldcx.etl_Meta_unit where regexp_like(unit_code,’(X){2}.(Z){2}(Q){2}’); @H_403_8@ –result: @H_403_8@ P_DM0_ZK_SWDJXXWZZQQKQC @H_403_8@ P_DM2_ZK_SWDJXXWZZQQKTJ @H_403_8@ –============================================= @H_403_8@ –(13) @H_403_8@ –() @H_403_8@ –分组表达式,当做一个单独的子表达式
–(14) @H_403_8@ –\n @H_403_8@ –返回引用表达式
–(15) @H_403_8@ –[==] @H_403_8@ –指定等价类
–(16) @H_403_8@ –[..] @H_403_8@ –指定一个排序元素;
/*===================================================== @H_403_8@ Perl正则表达式扩展 @H_403_8@ –除了POSXI标准,oracle支持Perl_influenced元字符 @H_403_8@ =======================================================*/ @H_403_8@ –\d 一个数字字符 @H_403_8@ –\D 一个非数字字符 @H_403_8@ –\w 一个字母字符 @H_403_8@ –\W 一个非字母字符 @H_403_8@ –\s 一个空白字符 @H_403_8@ –\S 一个非空白字符 @H_403_8@ –\A 匹配开头的字符 @H_403_8@ –\Z 匹配结束字符,或者换行符 @H_403_8@ –\z 匹配结束的字符 @H_403_8@ –*? 匹配0或者更多次 @H_403_8@ –+? 匹配1或者更多次 @H_403_8@ –?? 匹配0或者1次 @H_403_8@ –{n}? 匹配n次 @H_403_8@ –{n,m}? 匹配大于n次,小于M次
/*===================================================== @H_403_8@ oracle 正则表达式使用技巧
–(1)使用正则表达式检查约束条件 @H_403_8@ –当定义检查约束之后,可以添加正则表达式条件来检查数据是否符合约束 @H_403_8@ =======================================================*/
–(1)添加unit_code约束,PKG开头 @H_403_8@ alter table etl_Meta_unit_bak add constraint etl_Meta_unit_unit_code @H_403_8@ check(regexp_like(unit_code,’(^PKG)’)) enable novalidate;
–test @H_403_8@ insert into etl_Meta_unit_bak(unit_id,unit_code) values(‘5500.02’,’p_test’) @H_403_8@ –ORA-02290: check constraint (J1_LDM.ETL_Meta_UNIT_UNIT_CODE) violated
–(2)添加unit_id约束,有点 @H_403_8@ alter table etl_Meta_unit_bak add constraint etl_Meta_unit_unit_id @H_403_8@ check(regexp_like(unit_id,’.’)) enable novalidate;
–test insert into etl_Meta_unit_bak(unit_id,unit_code) values(‘5500’,’PKG’) –ORA-02290: check constraint (J1_LDM.ETL_Meta_UNIT_UNIT_ID) violated