千家信息网

Oracle 正则表达式实例详解

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,Oracle 正则表达式实例详解FORM开发中的按行拆分需求:拆分后的行要有规律,并按前后层次排序需求分析如下:现有行: 2 , 2.1 , 2.2 , 2.3 32.1.1, 2.1.2 , 2.1
千家信息网最后更新 2026年11月03日Oracle 正则表达式实例详解

Oracle 正则表达式实例详解

FORM开发中的按行拆分需求:拆分后的行要有规律,并按前后层次排序

需求分析如下:

现有行: 2 , 2.1 , 2.2 , 2.3 3
2.1.1, 2.1.2 , 2.1.3 , 2.2.1 , 2.1.1.1, 2.1.1.2,

对 2 进行拆分得到的 结果应该是 2.4 (2.4 是通过 查看历史记录中以2 开头,有一位小数点,小数点后一位最大值,获得该最大值+1 ,得到既是新行的后缀,保证拆分是按照前后顺序递增的)

对 2.1 进行拆分得到的应该是 :2.1.4 首先要保证 每次拆分得到的下一行都是多一位小数点

对2.1 拆分 获取最大后缀 比较对象 时候 应该匹配前缀是2.1的 且只有两位小数点的 (排除前缀符合位数不符合的情况:2.1.1.1 ,2.1.1.2 )

对3 进行拆分 没有历史记录是以 3开头的情况 这时候 就要重新 开始拆分:得到的应该是 3.1

这里的关键就是匹配历史记录进行比较,决定拆分后的最后一位的最大值

匹配的时候不能按照 数字的位数来判断,因为数字有可能是两位数,三位数,应该根据小数点来判断

匹配要使用到 正则表达式:

与PHP、Python一样Oracle 的正则表达式函数也是 主要由四个函数实现:相似匹配,定位查找,获取匹配子字符串,替换匹配结果(最重要)

(1)相似匹配: regexp_like()

regexp(source_str,pattern,match_parameter)

第一个参数:原字符串,第二个参数匹配模式,第三个参数匹配选项

第三个参数 匹配选项在这几个函数中都要相似作用(可选)

常用: i:大小写不敏感; c:大小写敏感; n:点号 . 不匹配换行符号;
m:多行模式; x:扩展模式,忽略正则表达式中的空白字符。

匹配成功返回true 失败返回 false

我的使用:

IF REGEXP_LIKE(DEL_LINE_NUMBER, '^\d*\.\d*\.\d*$') THEN --匹配只有两个小数点的数字,字符串

模式中的符号说明:模式需要用一对双引号括起来
^ 标明字符串的开头, $ 标明字符串的结尾
\d 匹配 一个0-9 的数字 * 号 匹配前面的字符0次或更多次
\. 匹配一个点号,因为点号有其他含义,所以用\作为转义

(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 -- 每个数字的位置fromdualconnectbylevel <= 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 从第几个字符开始匹配fromtmpwhereid='substr';STR    STR    STR    STR    STR--------------- --------------- --------------- --------------- ---------------123,234,345  123    123    234    2312,34.56:78  12    12    34.56:78      2123456789  123456789  123456789  逗号分割后不存在第二个   23456789(从第二位之后开始分割,没有就是取整体)

(4) 替换匹配结果:regexp_replace()

select str, regexp_replace(str,'020','GZ') str, regexp_replace(str,'(\d{3})(\d{3})','<\2\1>') str -- 将第一、第二捕获组交换位置,用尖括号标识出来fromtmpwhereid='replace'; STR    STR    STR--------------- --------------- ---------------(020)12345678 (GZ)12345678 (020)<456123>78001517729C28 001517729C28 <517001>729C28

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

字符 字符串 位置 小数 小数点 数字 正则 表达式 模式 最大 位数 参数 结果 相似 函数 前缀 历史 开头 所在 最大值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州大一互联网络科技有限公司 互联网与新科技 互联网科技革命 奇士达互联网科技 火传媒上海互联网科技 互联网科技公司名称 中国互联网金融科技基金 新华互联网科技校企合作 互联网科技公司招聘 北京三清互联网科技 济南华为互联网科技产业总部基地 互联网科技革命什么开始 互联网媒体平台算高科技产业 迪庆互联网科技招生 玉溪新华互联网科技好不好 科技赋能视角下互联网保险发展 济南有互联网科技公司吗 新氧科技和美国互联网有关系吗 中国科技和美国互联网 亚光科技低轨卫星互联网 未来的互联网科技 互联网高科技股票 崇明区互联网教育科技售后服务 互联网科技产业特征 苏州铭阳互联网科技有限公司 四川互联网展示科技馆设计 福建互联网展示科技馆设计 悟空问答互联网科技 众联互联网络科技 北京品多多互联网科技有限公司
0