oracle 常用的正则表达式

LIKE 
SUBSTR
INSTR 
REPLACE 

REGEXP_LIKE
REGEXP_SUBSTR
REGEXP_INSTR
REGEXP_REPLACE

相关网址:
https://cloud.tencent.com/developer/article/1456428
https://www.cnblogs.com/lxl57610/p/8227599.html
https://blog.csdn.net/qiuzhi__ke/article/details/78849570

--语法 同like  regexp_like(字段,正则表达式,参数(常用i 不区分大小写 c区分大小写))

SELECT *
FROM (
      SELECT '123456' AS CN FROM DUAL
      UNION ALL
      SELECT '1234'AS CN FROM DUAL
      UNION ALL
      SELECT '1'AS CN FROM DUAL
      UNION ALL
      SELECT '12A34'AS CN FROM DUAL
      UNION ALL
      SELECT 'ABCD'AS CN FROM DUAL
      UNION ALL
      SELECT 'A123B,%CD'AS CN FROM DUAL
      UNION ALL
      SELECT ',%'AS CN FROM DUAL
     ) T
--WHERE regexp_like(T.CN,'^[0-9]{4}$') ---找的是纯 4位数字
-----^:从第一个字符开始 ,$:到最后一个字符结束,[0-9a-zA-Z]:中间只能有 数字或者字母,+:一个或者多个
---WHERE regexp_like(T.CN, '^[0-9a-zA-Z]+$')---找的是数字,或者字母的;
--WHERE regexp_like(T.CN, '^[^0-9a-zA-Z]+$')---找的是非数字,非字母的;
WHERE regexp_like(T.CN, '[^0-9a-zA-Z]+')---只要包含 非数字,非字母,对出现的位置没有要求,因为没有 ^ $

^--匹配一个字符串的开始
$--匹配字符串的结尾
[]--用于指定一个匹配列表
+ --匹配一个或多个出现
{M}  匹配m次。
{M,}  至少匹配m次。
{M,N}  至少匹配m次,但不多于n次。

SELECT * 
FROM (
     SELECT '14A56' AS CN FROM DUAL
    UNION ALL
    SELECT '1234'AS CN FROM DUAL
    UNION ALL
    SELECT '1'AS CN FROM DUAL
    UNION ALL
    SELECT '12A34'AS CN FROM DUAL
    UNION ALL
    SELECT 'ABC'AS CN FROM DUAL
    UNION ALL
    SELECT 'ABC123B,%CD'AS CN FROM DUAL
    UNION ALL
    SELECT ',%'AS CN FROM DUAL
     ) T1
--找出是纯 3位字母的
--WHERE REGEXP_LIKE(T1.CN,'^[a-zA-Z]{3}$')
 --找出只包含数字或者字母 ,并且还要是5位的
WHERE REGEXP_LIKE(T1.CN,'^[0-9a-zA-Z]{5}$');


---2.regexp_substr (ENME ,1,4)
--语法 同substr   regexp_substr(字段,正则表达式,第三个表示从第几个字符开始匹配正则表达式,第四个参数表示取第几个匹配组)
 regexp_substr第一个参数是源字符串,
  第二个参数是正则表达式截取规则,
  第三个表示从第几个字符开始匹配正则表达式,
  第四个参数表示取第几个匹配组
[^,] --表达的意思就是要截取的字符串是非逗号的

李一   李二   李三   李四无
'李一,李二,李三,李四无'
---李一 就是第一个匹配组,从第一个位置开始,匹配到了2个非逗号的字符
李一 ---第一组
李二 --第二组
李三 --第三组
李四无 --第四组
SELECT REGEXP_SUBSTR('李一,李二,李三,李四无', '[^,]+' ,1,1) A1,
       REGEXP_SUBSTR('李一,李二,李三,李四无', '[^,]+' ,1,2) A2,
       REGEXP_SUBSTR('李一,李二,李三,李四无', '[^,]+' ,1,3) A3,
       REGEXP_SUBSTR('李一,李二,李三,李四无', '[^,]+' ,1,4) A4
FROM DUAL;

[^]  用于指定一个不匹配的列表
+号代表 一位或者多位
SELECT REGEXP_SUBSTR('李一,李小二李小四,李老三,李四无', '[^,]{3}',1,3) A1
       ,REGEXP_SUBSTR('李一,李小二李小四,李老三,李四无', '[^,]+',1,2) A2
       ,REGEXP_SUBSTR('李一,李小二李小四,李老三,李四无', '[^,]+',5,2) A3
FROM DUAL;

[]匹配次数 --[]匹配列表里的字符要连续出现 匹配次数 次

SELECT T.*   
       ,REGEXP_SUBSTR(T.ENAME,'[a-zA-Z]{2}',1,1)
FROM EMP T 
WHERE REGEXP_SUBSTR(T.ENAME,'[a-zA-Z]{2}',1,1) = 'SC'

---练习
 CREATE TABLE zone (
                  name VARCHAR2(20),
                  address VARCHAR2(50)
                  );
 INSERT INTO zone VALUES('张三','湖北-宜昌-五峰');
 INSERT INTO zone VALUES('李四','内蒙古-呼和浩特-清水河');
 INSERT INTO zone VALUES('小明','广东-深圳-宝安');

COMMIT;  

----把每条数据地址里的城市提取出来
REGEXP_SUBSTR

SELECT T.NAME,T.ADDRESS
      ,REGEXP_SUBSTR(T.ADDRESS,'[^-]+',1,2) AS CITY
FROM zone T;


--------------------------------------------------------------------
SELECT STR  
      --匹配组,前面两个字符要是  A-Z 第三个字符 是0-9
      ,REGEXP_SUBSTR(STR,'([A-Z]{2}[0-9]{1})',1,1) AS A1 --'AB1 BC2 2 CC3'
      ---匹配列表:前面三个字符只要是 0-9A-Z ,与字符出现的顺序无关
      ,REGEXP_SUBSTR(STR,'[0-9A-Z]{3}',1,3)  AS A2
FROM(SELECT 'AB1BC22CC34' AS STR FROM DUAL
     UNION ALL 
     SELECT 'A1BBC22CC34' AS STR FROM DUAL
     )
--------------------------------------------------------------------


---3.regexp_instr
regexp_instr(在哪个字符串中,正则表达式,从哪个位置开始匹配,第几次匹配)

'N3DSAD312NVNDSK'  我要查找第一个数字存在的位置?  
SELECT regexp_instr('N3DSAD312NVNDSK','[0-9]',1,1) FROM DUAL;
SELECT regexp_instr('N3DSAD312NVNDSK','[[:digit:]]',1,1) FROM DUAL;
SELECT regexp_instr('N3DSAD312NVNDSK','\d',1,1) FROM DUAL;

SELECT regexp_instr('123aNDSAD312NVNDSK','[A-Z]',1,1) FROM DUAL;

---找中文的第一个位置
SELECT regexp_instr('123aNDS数据AD库312NVNDSK','[^0-9a-zA-Z]',1,1) FROM DUAL;


--4.regexp_replace
replace('ABC','A','F')
regexp_replace(字符串,正则表达式,替换之后的值)

SELECT regexp_replace('ABC2344RERY','[0-9]', 'A') FROM DUAL; 
SELECT regexp_replace('ABC2344RERY','[A-Z]', '1') FROM DUAL;
SELECT regexp_replace('ABC2344RERY','[A-Z]', NULL) FROM DUAL;

-------------------------------------
SELECT regexp_replace(STR,'[0-9]', 'A')
FROM( 
      SELECT 'ABC2344RERY' AS STR FROM DUAL
     );
     
---电话号码匹配
--找出以 15 、 17 、 13 、18 这几种数字开头的电话号码,并且是 11 位,还得是纯数字
SELECT T1.TEL
FROM (
      SELECT '15678777777' AS TEL FROM DUAL
      UNION ALL 
      SELECT '17878777777' AS TEL FROM DUAL
      UNION ALL 
      SELECT '13878777777' AS TEL FROM DUAL
      UNION ALL 
      SELECT '18378777777' AS TEL FROM DUAL
      UNION ALL 
      SELECT '11678777777' AS TEL FROM DUAL
      UNION ALL 
      SELECT '138787777AA' AS TEL FROM DUAL
      UNION ALL 
      SELECT '138787777776' AS TEL FROM DUAL
     ) T1
WHERE  REGEXP_LIKE(T1.TEL ,'^1[5|7|3|8]{1}[0-9]{9}$');

| 竖线表达 或 的意思 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值