(2)定位查找字符位置:regexp_instr( )
regexp_instr(source_string ,pattern,position,occurrence ,return_option ,match_parameter ) source_string:输入的字符串 pattern:正则表达式 position:标识从第几个字符开始正则表达式匹配。(默认为1) occurrence:标识第几个匹配组。(默认为1) return_option:0——返回第一个字符出现的位置。1:pattern下一个字符起始位置。 match_parameter:匹配模式
前面两个字段必输:
regexp_instr() select str, regexp_instr(str,'\.' ) ind , 默认从第一个字符开始查找,查找第一个.号,也可以匹配资格符合要求的字符串,写对匹配格式即可,不一定是单个字符 regexp_instr(str,'\.',1,2) ind , 从第1个字符开始,查找第二个.号所在的位置 regexp_instr(str,'\.',5,2) ind 从第五个字符开始,查找第二个.号的位置,注意最终查找到的字符和字符串的位置是相对于查找字符串的起始位置 fromtmp where id='instr'; STR IND IND IND --------------- ----- ----- ----- 192.168.0.1 4 8 10
select regexp_instr('192.168.0.1','\.',1,level) ind , -- 点号. 所在的位置 regexp_instr('192.168.0.1','\d',1,level) ind -- 每个数字的位置 fromdual connectbylevel <= 9 连续匹配目标字符串出现的第一次出现的位置,第二次出现的位置,直到第九次出现的位置 IND IND ----- ----- 4 1 8 2 10 3 0 5 0 6 0 7 0 9 0 11 -- 第八个数字所在位置为 11 这里不存在第九个数字,匹配不到,返回的地址为0 0 0 -- 没有匹配到时返回为0 ,对应第一位是从1开始,而不是0 开始
我的案例:
V_POSITION_BIT := REGEXP_INSTR(REC_DATA.DEL_LINE_NUMBER,'\.',1,2) -1; -- 第二个小数点的位数,减一
substr(DEL_LINE_NUMBER,1,V_POSITION_BIT) -- 获取字符串中第二个小数点之前的子串
(3) 获取匹配子字符串:regexp_substr()
regexp_substr(source_string ,pattern,position,occurrence ,match_parameter)
regexp_substr()在最初目的是根据字符串中某一个字符,分割字符串形成一个数组之类的
例如: 192.168.233.23 按点号"." 分组 最终结果有四个 :192 168 233 23
注意的是 pattern书写的格式不仅仅要用括号括起来,还要使用中括号括起来
我的案例:
REGEXP_SUBSTR(DEL_LINE_NUMBER,'[^.]+',1,1) -- 匹配前缀相同,第一个小数点前的字符 select str, regexp_substr(str,'[^,]+') str, regexp_substr(str,'[^,]+',1,1) str, 从第一位开始匹配,获得用逗号分隔字符串之后,第一个‘分割后的子串' regexp_substr(str,'[^,]+',1,2) str, -- occurrence 第几个匹配组 regexp_substr(str,'[^,]+',2,1) str -- position 从第几个字符开始匹配 fromtmp whereid='substr'; STR STR STR STR STR --------------- --------------- --------------- --------------- --------------- 123,234,345 123 123 234 23 12,34.56:78 12 12 34.56:78 2 123456789 123456789 123456789 逗号分割后不存在第二个 23456789(从第二位之后开始分割,没有就是取整体)
(4) 替换匹配结果:regexp_replace()
select str, regexp_replace(str,'020','GZ') str, regexp_replace(str,'(\d{3})(\d{3})','<\2\1>') str -- 将第一、第二捕获组交换位置,用尖括号标识出来 fromtmp whereid='replace'; STR STR STR --------------- --------------- --------------- (020)12345678 (GZ)12345678 (020)<456123>78 001517729C28 001517729C28 <517001>729C28
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!