(CSDN博主:写代码也要符合基本法)
正 道 的 光各位看官老爷大家早上好,我们今天总结一下正则表达式在 PL/SQL 中是怎么使用的正则表达式 Regular Expression 又称规则表达式,是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,来表达对字符串的一种过滤逻辑正则表达式有多好用,懂的都懂此时假设我们大家已经都充分了解了正则表达式的语法,接下来我们一起看看在 PL/SQL 中,尤其是 LIKE、REPLACE 这些字符串操作函数力(shen)不(tou)从(zhi)心(le)的时候,如何使用正则表达式解决问题PL/SQL 中与正则表达式相关的运算函数主要有以下五个
REGEXP_LIKE:返回指定字符串是否符合给定的正则表达式
REGEXP_SUBSTR:返回在指定字符串中截取出的符合给定正则表达式的子串
REGEXP_INSTR:返回在指定字符串中符合给定正则表达式的子串的开始位置
REGEXP_REPLACE:返回将指定字符串中符合给定正则表达式的子串替换为指定子串后的结果
REGEXP_COUNT:返回字符串中包含符合给定正则表达式的子串的个数
也就是说它们都具备类似去掉前缀后对应函数的功能
REGEXP_LIKE(String, Regexp)
String:指定字符串或字段内容Regexp:用以匹配的正则表达式看着有点别扭,其实和 LIKE 一样,只能在 WHERE 条件里面使用,只不过相当于把 LIKE 前后的内容都放到了参数里面现在又要假如了,假如在一个项目中,我们需要处理外围系统通过接口传入的字符串,由于种种原因,这个字符串不是 JSON 或者其它交换格式的,而是将各种信息按照固定的顺序用特别分隔符拼起来的比如,张三|白嫖|违反治安管理如果使用 SUBSTR 和 INSTR 组合,程序员小刘就要脸上笑嘻嘻地写下形如这样的语句SQL> WITH str AS 2 (SELECT ‘张三|白嫖|违反治安管理’ s, ‘|’ sp FROM dual) 3 SELECT substr(s, 1, instr(s, sp) – 1) name 4 ,substr(s 5 ,instr(s, sp) 1 6 ,instr(s, sp, instr(s, sp) 1) – instr(s, sp) – 1) incident 7 ,substr(s, instr(s, sp, instr(s, sp) 1) 1) charge 8 FROM str;NAME INCIDENT CHARGE—— ——– ——————张三 白嫖 违反治安管理
张三|男|33|白嫖|违反治安管理小刘的脸上写满了开心,当时就写下了两千字的辞职信上面的例子可读性极差,而且极难维护,一不小心就会写错REGEXP_SUBSTR 最常应用的场景其实就是拆分字符串了SQL> WITH str AS 2 (SELECT ‘张三|男|33|白嫖|违反治安管理’ s FROM dual) 3 SELECT regexp_substr(s, ‘[^\|] ‘, 1,level) sub 4 FROM str 5 CONNECT BY LEVEL <= regexp_count(s, ‘\|’) 1;SUB—————-张三男33白嫖违反治安管理
妈妈再也不用担心小刘会辞职了!
REGEXP_SUBSTR(String, Regexp, StartPos, Occurence, Mode)
REGEXP_COUNT(String, Regexp, StartPos, Mode)
StartPos:起始位置(从第几位开始正则表达式匹配),默认为1Ocurrence:指定第几个匹配子串,默认为1Mode:’i’-不区分大小写检索,’c’-区分大小写检索,’n’-点号(.)不匹配换行符,’m’-多行模式,’x’-忽略正则表达式中的空白字符,默认为’c’
完成了上面的任务,小刘刚泡了一杯茶,友好的外围系统又开发了一个接口,传来一个字符串,拼接了一系列事件的结果,比如 S 代表完全成功,P 代表部分成功,X 代表可能成功,F 代表完全失败而小刘的工作是找出第一个非失败标志出现的位置小刘捡起几根头发贴在脑袋上,开始了编码SQL> WITH str AS 2 (SELECT ‘FFFFPXMMS’ s FROM dual) 3 SELECT least(instr(s, ‘S’), instr(s, ‘P’), instr(s, ‘X’)) FROM str;LEAST(INSTR(S,’S’),INSTR(S,’P’),INSTR(S,’X’))——————————————— 5
REGEXP_INSTR(String, Regexp, StartPos, Occurence, ReturnOpt, Mode)
ReturnOpt:0-返回出现的开始位置,1-返回字符发生之后的位置(结束位置 1),默认为0小刘:还剩最后一个函数,直接说吧,别折腾我了实际业务场景中,有时会遇到一些“灵异”事件:在 EBS 某个表单中,填入自己需要的信息,保存时却被告知 FRM-40654 记录已被另一个用户更新开发查来查去,最后发现问题还真是源自凡胎肉眼看不见的力量!
用户在录入某些业务数据时,实际的操作可能是从其它文件复制粘贴来的,难免会把诸如空格、制表符、回车这类无形的字符复制进来,问题在于字符串首尾处的空白字符会造成表单中的“假锁”现象,也就是上面所说的问题。
这时需要我们在用户录入数据后、写入数据表前,加以处理,将字符串首尾处的空白字符去掉,使用 TRIM 操作的话,需要考虑各种空白字符的可能,这时使用 REGEXP_REPLACE 则可轻松解决
SQL> SELECT regexp_replace(chr(9) || chr(10) || chr(13) || chr(32) || ‘?’ || 2 chr(9) || chr(10) || chr(13) || chr(32) 3 ,'(^\s*)|(\s*$)’ 4 ,”) RESULT 5 FROM dual;RESULT——?REGEXP_REPLACE(String, Regexp, ReplaceStr, StartPos, Occurence, Mode)
ReplaceStr:替换子串,默认为NULL
聪明的你,学废了吗?