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}$');
| 竖线表达 或 的意思