• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Oracle 正则表达式实例详解
    POST TIME:2021-10-18 21:54

    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通过正则表达式分割字符串 REGEXP_SUBSTR的代码详解
    • Oracle中正则表达式的使用实例教程
    • ORACLE数据库中怎么求除数字、字母之外的非中文字符的正则表达式
    • oracle正则表达式regexp_like的用法详解
    • Oracle正则表达式使用介绍
    • Oracle 10G:PL/SQL正规表达式(正则表达式)手册
    • ORACLE 正则解决初使化数据格式不一致
    • Oracle数据库正则表达式使用场景代码实例
    上一篇:利用PL/SQL从Oracle数据库导出和导入数据
    下一篇:oracle中创建序列及序列补零实例详解
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信