Oracle 正则表达式实例详解

发布时间 - 2026-01-11 00:26:06    点击率:

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 -- 每个数字的位置
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正则表达式使用介绍  # Oracle中正则表达式的使用实例教程  # 在Oracle中使用正则表达式  # Oracle数据库中使用正则表达式的超详细教程  # ORACLE中常用的几种正则表达式小结  # Oracle数据库正则表达式使用场景代码实例  # Oracle数据库正则表达式纯数字例子  # Oracle高级语法篇之正则表达式的用法及应用场景  # 第一个  # 第二个  # 几个  # 历史记录  # 应该是  # 不存在  # 第三个  # 的是  # 默认为  # 都是  # 都要  # 有可能  # 在这  # 最重要  # 要有  # 两位  # 是从  # 希望能  # 要用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用JavaScript实现文本编辑器_光标和选区怎么处理  在centOS 7安装mysql 5.7的详细教程  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  深圳网站制作平台,深圳市做网站好的公司有哪些?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel集合Collection怎么用_Laravel集合常用函数详解  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何破解联通资金短缺导致的基站建设难题?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  iOS UIView常见属性方法小结  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  如何用低价快速搭建高质量网站?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel如何配置任务调度?(Cron Job示例)  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何用5美元大硬盘VPS安全高效搭建个人网站?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何在腾讯云服务器快速搭建个人网站?  简历在线制作网站免费版,如何创建个人简历?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  html5的keygen标签为什么废弃_替代方案说明【解答】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何用PHP快速搭建CMS系统?  如何实现javascript表单验证_正则表达式有哪些实用技巧  js实现获取鼠标当前的位置  网站图片在线制作软件,怎么在图片上做链接?  简单实现Android文件上传  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Laravel如何生成URL和重定向?(路由助手函数)  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel中的withCount方法怎么高效统计关联模型数量  如何正确选择百度移动适配建站域名?  微信小程序 五星评分(包括半颗星评分)实例代码  详解CentOS6.5 安装 MySQL5.1.71的方法  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门