Oracle 正则表达式实例详解


当前第2页 返回上一页

(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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


标签:Oracle

返回前面的内容

相关阅读 >>

oracle 11g下载、安装、使用图文教程

oracle备份数据库

如何查看oracle字符集?

oracle怎样查看表空间

oracle创建只读账号的详细步骤

plsqldeveloper登录远程连接oracle的操作

oracle开发之窗口函数

oracle锁表解决方法的详细记录

oracle数据库执行脚本常用命令小结

oracle11g 最终版本11.2.0.4安装详细过程介绍

更多相关阅读请进入《oracle》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...