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 -- 每个数字的位置
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

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

(0)

相关推荐

  • ORACLE 正则解决初使化数据格式不一致

    如: 2000-1-1==> 2000-01-01.2000-01-1==>2000-01-01.2000-1-01==>2000-01-01 以前会写一个function/procedure之类的脚本,大量的IF ELSE... 今次无意中发现oracle10g已经支持正则功能,上述问题也就迎刃而解了.. 复制代码 代码如下: UPDATE LZ__EQ_RHGL LZRH SET LS__SP_GHTIME = SUBSTR(LZ__SP_GHTIME, 1, 5) || '0' |

  • ORACLE数据库中怎么求除数字、字母之外的非中文字符的正则表达式

    最近做项目,有这样一需求:ORACLE数据库中求除数字.字母之外的非中文字符的正则表达式 如有如下字段,需将其中除字母.数字.汉字外的其他所有字符替换为空 'asdfsad ,,:)()!@123234#$%^&*(我w 是e ? 中国人../\[]::''""一人' 最终得到值:asdfsad123234我是中国人一人 select FN_REG_REPLACEOTHER('asdfsad ,,:)()!@#$%^&*(我是?中国人../\[]::''"&q

  • Oracle 10G:PL/SQL正规表达式(正则表达式)手册

    Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的.如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能.已经对正规表达式很熟悉的读者可以了解如何在 Oracle SQL 语言的环境中应用这种功能. 什么是正规表达式? 正规表达式由一个或多个字符型文字和/或元字符组成.在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式 cat.它被读作字母 c,接着是字母 a 和 t,这种模式匹配 cat.locati

  • oracle正则表达式regexp_like的用法详解

    /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBSTR的功能相似4,REGEXP_REPLACE :与REPLACE的功能相似它们在用法上与Oracle SQL 函数LIKE.INSTR.SUBSTR 和REPLACE 用法相同,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符.POSIX 正则表达式由标准的元字符(m

  • Oracle中正则表达式的使用实例教程

    前言 正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境. 本文主要介绍了关于Oracle中正则表达式的使用方法,下面话不多说了,来一起看看详细的介绍. Oracle使用正则表达式离不开这4个函数:regexp_like.regexp_substr.regexp_instr.regexp_replace. regexp_like 该函数只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配 //查询所

  • Oracle正则表达式使用介绍

    下面通过一些例子来说明使用正则表达式来处理一些工作中常见的问题. 1. REGEXP_SUBSTR REGEXP_SUBSTR 函数使用正则表达式来指定返回串的起点和终点,返回与source_string 字符集中的VARCHAR2 或CLOB 数据相同的字符串. 语法: --1.REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]

  • 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 开头,有一位小数点,小数点后一位最

  • php 访问oracle 存储过程实例详解

    php 访问oracle 存储过程实例详解 比如我的本地Oracle数据库有一个package,里面有一个存储过程: create or replace package PKG_TRANS_REL is -- Author : test -- Created : -- Purpose : test -- Public type declarations PKG_NAME varchar2(20) := 'PKG_TRANS_REL'; --存储过程,测试用 procedure pro_GC_wi

  • Kotlin语言编程Regex正则表达式实例详解

    目录 前言 Regex 构造函数 常用正则表达方法 示例展示 1.containsMatchIn(input: CharSequence) 包含指定字符串 2.matches(input: CharSequence) 匹配字符串 3.find(input: CharSequence, startIndex: Int = 0) 查找字符串,并返回第一次出现 4.findAll(input: CharSequence, startIndex: Int = 0) 查找字符串,返回所有出现的次数 5.r

  • java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * @author fhd001 */ public class RegexTest { public static void main(String[] args) { /* * 普通字符 */ String str1 = "abc45abc345"; String[]arr1 = str1

  • jmeter正则表达式实例详解

    过年前产假归来,jmeter很多知识生疏了,这两天打开jmeter摸索了几下,老了记不住,还是准备弄个jmeter系列随笔吧. 言归正传,使用jmeter时经常有这样的情况:一个完整的操作流程,需先完成某个操作,获得某个值或数据信息,然后才能进行下一步的操作(也就是常说的关联/将上一个请求的响应结果作为下一个请求的参数): 在jmeter中,利用正则表达式提取器来轻松帮助我们完成这一动作.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码.学习正则表达式最好就是从实

  • 强大的Perl正则表达式实例详解

    一.介绍 正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配:由于Nmap内嵌的服务与版本探测是使用的Perl正则规范,因此此篇博客记录一下Perl正则的相关内容,方便后期查阅. 二.Perl正则例子 下面的例子可能有不足之处,有些来源于博客,没有验证: 1. 匹配IP地址:\d+\.\d+\.\d+\.\d+ \d:匹配一个数字字符,\d+:匹配一次或多次数字字符. \.:使用转义字符匹配'.'. 2. 匹配邮箱类似于123456@qq.com: /^[a-zA-Z

  • PHP中的正则表达式实例详解

    最近使用 PHP 写了一个应用,主要是正则表达式的处理,趁机系统性的学习了相应知识. 这篇文章的写作方式不是讲理论,而是通过具体的例子来了解正则,这样也更有实践性,在此基础上再去看正则表达式的基本概念会更有收获. 禁止分组的捕获 在正则中分组很有用,可以定义子模式,然后可以通过后向引用来引用分组的内容,但是有的时候仅仅想通过分组来进行范围定义,而不想被分组来捕获,通过一个例子就能明白: $str = "http://www.google.com"; $preg= "/http

  • JavaScript正则表达式实例详解

    废话不多说了,直接把小编多年总结汇总的代码奉献给大家 <script type="text/javascript"> var str2 = "YouCan3You8Up,no can no bibi!"; var reg = /^[0-9a-zA-Z]{1,}$/; console.log(reg.test(str2)); //正则表达式的一般形式 //正则表达式对象的创建: //var 对象名 = new RegExp(参数1,参数2); //参数1:

  • nginx location 配置 正则表达式实例详解

    1.location 介绍 •location 是在 server 块中配置,用来通过匹配接收的uri来实现分类处理不同的请求,如反向代理,取静态文件等 •location 在 server 块中可以有多个,且是有顺序的,会被第一个匹配的 location 处理 •localtion 匹配功能只做匹配分发用,并不会改变uri的内容或其他作用,我一开始理解的时候就混淆了一些概念,建议多做测试看实际效果 2.localtion 匹配规则 •location [ = | ~ | ~* | ^~ ] u

  • Oracle分页查询的实例详解

    Oracle分页查询的实例详解 1.Oracle分页查询: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM tab) A WHERE ROWNUM <= 40 ) WHERE RN >= 21; 这个分页比下面的执行时间少,效率高. 2. select * from (select c.*,rownum rn from tab c) where rn between 21 and 40 对比这两种写法,绝大多数的情况下,第一个

随机推荐